要实现Web接口测试的自动化有许多方式,比如利用Jmeter、Loadrunner等测试工具都能够实现接口的自动化测试,我们也可以利用一些开源的框架来实现接口的自动化测试,比如我们现在要说的这个HttpClient,
HttpClient是一个功能丰富支持HTTP协议的客户端编程工具包,具备以下主要功能:
1)封装实现了所有HTTP的方法,如GET,POST,PUT,HEAD
2)支持redirect,会话保持
3)支持文件上传
它是Apache下面开发的,更多信息大家可以上官网瞅瞅。
既然谈到了接口测试,首先我们得明白何为接口测试,简单一句话啊就是测试外部系统与内部系统或一个系统中不同的功能模块之间的交互点,我们测试的重点是检查数据的交换、传递、控制管理的过程,以及系统间的相互的逻辑依赖关系。
利用HttpClient我们做的接口测试主要是服务器端与客户端交互的方式,即浏览器或其它客户端与Web服务器之间的交互协议,这里讲的主要是HTTP协议,Http协议常用的请求方法有Post和Get,
一般情况下从客户端传向服务器端的用Post,从服务器端传出的用Get方法,这些都是一般情况下,测试的过程中还得具体情况具体分析。
顺便插一嘴,我们看看采用Get和Post方法来提交表单时的区别,明白了Get和Post的区别以后,接下来我们看HttpClient通过get和post传参数的时候就不会糊涂了。
随便写了一个表单,然后将输入的数据显示在一个页面上,
表单代码:
<body>
<!-- 根据method是post还是get决定提交表单个协议 -->
<form action="LogIn" method="get">
用户名: <input name="UserName" type="text"><br><br>
密 码: <input name="PassWord" type="password"><br><br>
<input type="submit" value="SubmitBtn">
<input type="reset" value="ResetBtn">
</form>
</body>下面的截图是Get提交的表单,我们可以看到URL中,传入的数据直接是以键值对的形式被写在URL中传入到Servlet中的
再看看Post提交的表单URL的格式,传入的值并没有直接在URL中展示出来,通过FireBug,我们可以看到传入的值的保存地方。
下面我们就来看看通过HttpClient具体实现Get和Post方法,然后通过上面就能理解HttpClient中的Post方法为什么需要传入一个NameValuePair
package com.util.httpclient; import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.jdom2.Document;
import org.jdom2.input.SAXBuilder;
import org.json.JSONObject; /**
* 1. 通过HttpClient实现Get方法响应
* 2. 通过HttpClient实现Post方法带参数传入的响应
*/
public class HttpClientTest2 { private CloseableHttpClient httpClient = HttpClients.createDefault(); //定义一个HttpClient private CloseableHttpResponse response = null; //定义response对象 public void getMethod(String url){ HttpGet httpGet = new HttpGet(url); //实例化一个HttpGet对象 RequestConfig config = RequestConfig.custom().setConnectTimeout(2000).setSocketTimeout(2000).build(); //定义一个配置响应时间
httpGet.setConfig(config); //设置配置
try { response = httpClient.execute(httpGet); //获取到response对象 System.out.println("输出当前的URI地址: " + httpGet.getURI()); //如果返回值为200,则请求成功,可以通过TestNG做判断 HttpStatus.SC_OK
int status = response.getStatusLine().getStatusCode();
System.out.println("当前请求URL状态: " + status); //获取Http Headers信息,关于header信息:http://honglu.me/2015/07/13/开发中常用的HTTP-header/
Header[] headers = response.getAllHeaders();
int headerLength = headers.length; for(int i=0; i<headerLength;i++){ System.out.println("Header 内容为: " + headers[i]); } //获取到请求的内容
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity,"utf-8");
System.out.println("获取请求响应的内容为: "+content); } catch (Exception e) { e.printStackTrace(); }finally{ try { httpGet.releaseConnection(); //每次都得关闭响应
response.close(); } catch (IOException e) { e.printStackTrace();
}
}
} //根据返回的string是XML格式还是json格式的文件,然后对该文件进行选择不同的处理方式
public String postMethod(String url, Map<String, String>params) throws Exception{ CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse response = null; RequestConfig config = RequestConfig.custom().setConnectTimeout(20000).setSocketTimeout(20000).build();
HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(config); List<NameValuePair> list = new ArrayList<NameValuePair>(); Set<String> keySets = params.keySet();
for(String key: keySets){ String value = params.get(key);
list.add(new BasicNameValuePair(key, value));
} try {
httpPost.setEntity(new UrlEncodedFormEntity(list));
response = client.execute(httpPost);
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity); return content; } catch (Exception e) { throw e;
}finally{ httpPost.releaseConnection();
response.close(); } }
}