HttpClient测试框架
HttpClient是模拟Http协议客户端请求的一种技术,可以发送Get/Post等请求。 所以在学习HttpClient测试框架之前,先来看一下Http协议请求,主要看请求头信息。
如何查看HTTP协议请求头信息: 打开浏览器-->输入任意一个网址-->按下F12 打开开发者工具-->Network-->刷新页面,可以在Network看到有Get或者post请求的URL,点击URL,可以看到该请求的Header/Cookies/Response等信息
例如我们打开www.baidu.com,查看它某个请求的信息,如下:

常用的请求头和响应头信息解释:


下面通过一个简单的例子学习HttpClient
import java.io.IOException;
import java.util.List; import org.apache.http.HttpResponse;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.testng.annotations.Test; public class MyHttpClient { @Test
public void test1() {
String result;
HttpGet get = new HttpGet("http://localhost:8888/getCookies");
DefaultHttpClient client = new DefaultHttpClient();
try {
HttpResponse response = client.execute(get);
result = EntityUtils.toString(response.getEntity()); CookieStore cookieStore = client.getCookieStore();
List<Cookie> cookies =cookieStore.getCookies();
System.out.println(cookies.size());
for(Cookie c :cookies) {//get Cookies info
System.out.println(c.getName() + ":" + c.getValue());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Run TestNG Test, 可以看到返回的result是HTML源码。这个是通过HttpClient Get请求方法实现的简单例子。下面结合Mock模拟数据,学习如何使用HttpClient。
Mock一个返回Cookies信息的请求:
{
"description":"This get request with cookies return",
"request":{
"uri":"/getCookies",
"method":"get"
},
"response":{
"cookies":{
"login":"true"
},
"text":"This is response with cookies"
}
}
具体如何Mock数据可以参考上一篇文章《Mock接口平台Moco学习》.
我们已经知道如何从服务端获取 Cookie信息了,那下一步学习客户端如何使用拿到的Cookie信息。
首先在Mock一个接口,这是携带/getCookies 接口返回的Cookies信息Get请求的接口:
{
"description":"This is Get request with cookies",
"request":{
"uri":"/get/with/cookies",
"method":"get",
"cookies":{
"login":"true"
}
},
"response":{
"text":"This is response for get request with cookies"
}
}
完整的代码:
import java.io.IOException;
import java.util.List; import org.apache.http.HttpResponse;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.testng.annotations.Test; public class MyHttpClient {
private CookieStore cookieStore; @Test
public void test1() {
String result;
HttpGet get = new HttpGet("http://localhost:8888/getCookies");
DefaultHttpClient client = new DefaultHttpClient();
try {
HttpResponse response = client.execute(get);
result = EntityUtils.toString(response.getEntity());
System.out.println("result=" + result);
cookieStore = client.getCookieStore();
List<Cookie> cookies = cookieStore.getCookies();
System.out.println(cookies.size());
for (Cookie c : cookies) {
System.out.println(c.getName() + ":" + c.getValue());
}
} catch (IOException e) {
e.printStackTrace();
}
} @Test(dependsOnMethods = { "test1" })
public void testGetWithCookie() {
HttpGet get = new HttpGet("http://localhost:8888/get/with/cookies");
DefaultHttpClient client = new DefaultHttpClient();
// Set cookie info
client.setCookieStore(cookieStore);
try {
HttpResponse response = client.execute(get);
// get response status
int statusCode = response.getStatusLine().getStatusCode();
// statusCode = 200 / 404 / 502.....
System.out.println("Status = " + statusCode);
if (statusCode == 200) {
// Success
String result = EntityUtils.toString(response.getEntity());
System.out.println("result=" + result);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
HttpClient Post请求的实现:
首先还是Mock一个post请求
{
"description":"This is Post request with cookies",
"request":{
"uri":"/post/with/cookies",
"method":"post",
"cookies":{
"login":"true"
},
"json":{
"name":"zhangsan",
"age":"18"
}
},
"response":{
"status":200,
"json":{
"zhangsan":"success",
"status":"1"
}
}
}
完整的Post请求代码:
import java.io.IOException;
import java.util.List; import org.apache.http.HttpResponse;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.Test; public class MyCookiesForPost {
private CookieStore cookieStore; @Test
public void test1() {
String result;
HttpGet get = new HttpGet("http://localhost:8888/getCookies");
DefaultHttpClient client = new DefaultHttpClient();
try {
HttpResponse response = client.execute(get);
result = EntityUtils.toString(response.getEntity());
System.out.println("result=" + result);
cookieStore = client.getCookieStore();
List<Cookie> cookies = cookieStore.getCookies();
System.out.println(cookies.size());
for (Cookie c : cookies) {
System.out.println(c.getName() + ":" + c.getValue());
}
} catch (IOException e) {
e.printStackTrace();
}
} @Test(dependsOnMethods = { "test1" })
public void testPostWithCookie() {
//1. Define a client to excute
//2. Define a post method
//3. Add pamarater
//4. Set request header info; set cookie inof
//5. Execute
//6. Get and handle Result
//7. assert result
DefaultHttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://localhost:8888/post/with/cookies");
JSONObject param = new JSONObject();
param.put("name", "zhangsan");
param.put("age", "18");
StringEntity entity = new StringEntity(param.toString(),"utf-8");
post.setEntity(entity);
post.addHeader("content-type", "application/json");
client.setCookieStore(cookieStore);
try {
HttpResponse response = client.execute(post);
String result = EntityUtils.toString(response.getEntity());
System.out.println("result=" + result);
JSONObject object = new JSONObject(result);
System.out.println("zhangsan=" + object.getString("zhangsan"));
System.out.println("status=" + object.getString("status"));
String actualResult = object.getString("zhangsan");
Assert.assertEquals(actualResult,"success");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
代码优化: 在实际的测试过程当中,我们一般不会直接将请求地址写在请求对象当中。而是定义在配置文件中,然后在代码中引用。具体用法如下。
创建一个.properties文件,如config.properties:
test.url=http://localhost:8888
然后在代码中读取该config.properties,并获取相应的地址:
private ResourceBundle bundle;
private String url; @BeforeTest
public void beforeTest() {
bundle = ResourceBundle.getBundle("config");
url = bundle.getString("test.url");
}
以上是HttpClient的常见用法和其中一个优化方案。
如果喜欢作者的文章,请关注"写代码的猿"订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载.

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2wrsyxyyavcwc
HttpClient测试框架的更多相关文章
- spring测试框架的使用
junit的使用 1.加入 junit jar包 <dependency> <groupId>junit</groupId> <artifactId>j ...
- phpunit 测试框架安装
PHPUnit是一个轻量级的PHP测试框架.它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计).来自百度百科 一.下载wg ...
- 某互联网后台自动化组合测试框架RF+Sikuli+Python脚本
某互联网后台自动化组合测试框架RF+Sikuli+Python脚本 http://www.jianshu.com/p/b3e204c8651a 字数949 阅读323 评论1 喜欢0 一.**Robo ...
- selenium测试框架使用xml作为对象库
之前已经写过一篇: selenium测试框架篇,页面对象和元素对象的管理 上次使用的excel作为Locator对象管理,由于excel处理不够方便,有以下缺点: 不能实现分page 加载Locato ...
- selenium 测试框架中使用grid
之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html 配合Jenkins可持续集成:http://www.cnblogs.com/tobecr ...
- selenium测试框架篇,页面对象和元素对象的管理
前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让 ...
- Junit测试框架 Tips
关于Junit测试框架使用的几点总结: 1.Junit中的测试注解: @Test →每个测试方法前都需要添加该注解,这样才能使你的测试方法交给Junit去执行. @Before →在每个测试方法执行前 ...
- Python几种常用的测试框架
一.测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的: 每个测试单元必须是完全独立的,必须能单独运行.这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作.通常通过 ...
- 测试框架Mocha与断言expect
测试框架Mocha与断言expect在浏览器和Node环境都可以使用除了Mocha以外,类似的测试框架还有Jasmine.Karma.Tape等,也很值得学习. 整个项目源代码: 为什么学习测试代码? ...
随机推荐
- 3,LinkedList
一,LinkedList简介 1,LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. 2,LinkedList 实现 ...
- VS2017 IDE 说明
- [CF959A]Mahmoud and Ehab and the even-odd game题解
题意简述 一个数n,Mahmoud珂以取(即如果取\(k\),使\(n = n - k\))一个正偶数,Ehab珂以取一个正奇数,一个人如果不能取了(对于Mahmoud和Ehab \(n = 0\), ...
- 5 October
POJ2676 Sudoku 位运算 + 搜索.更好的优化方法:方案数最小的空格先填. 把某一位 置为 0:a &=~ (1<<n) 把某一位 置为 1:a |= (1<&l ...
- [CSP-S模拟测试]:Travel(贪心+构造)
题目描述 给定一个长度为$n$的格子序列$x_1,x_2,...,x_n$.每一次$Lyra$可以选择向左跳到任意一个还没到过的位置,也可以向右跳到任意一个还没到过的位置.如果现在$Lyra$在格子$ ...
- Jira中的Tempo查看component以及issue的工作量汇总
在右侧group by的地方,同时选中component和issue
- 让dcef3支持mp3和h.264 mp4解码播放
嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件.CE ...
- 20190820 On Java8 第十章 接口
第十章 接口 接口和抽象类提供了一种将接口与实现分离的更加结构化的方法. 抽象类和方法 包含抽象方法的类叫做抽象类.如果一个类包含一个或多个抽象方法,那么类本身也必须限定为抽象的,否则,编译器会报错. ...
- 机器学习实战_基于Scikit-Learn和Tensorflow读书笔记
第一部分 机器学习基础 第二部分 神经网络和深度学习 第9章 运行Tensorflow 分布式系统:分布式系统的定义是这个系统建立在网络的操作系统,具有高度的内聚性和透明性,它与网络的区别在于高层软件 ...
- 如何配置JedisPool的参数
转自:http://blog.csdn.net/huahuagongzi99999/article/details/13631579 如何配置Pool的参数 JedisPool的配置参数很大程度上依赖 ...