接口测试--模拟登陆
场景:服务器根据浏览器中保存的本地cookie判断用户的有效身份
为了使得httpclient发送的请求包含相同的token(模拟浏览器发送请求,一次登陆后,token相同,即被认为是同一个用户的操作),进行如下操作:
1) httpclient模拟登陆后,获取token 并保存;
2) 之后httpclient发送请求前,使用步骤1) 中获取的token发送请求
以上步骤可以预防
CSRF攻击,具体参考:
接口测试工具及特点
名称 | 特点 |
junit | 1)提供丰富API支持多种验证结果正确性的逻辑 2)通过参数化、@before、@after等特性,支持用例代码可复用 3)suite的模式支持case的批量运行 4)有展现良好的报表 5)与eclipse ide集成,使用方便 |
httpclient | 支持HTTP协议的客户端编程工具包. 1)封装实现了所有HTTP的方法,如GET,POST,PUT,HEAD 2)支持redirect,会话保持 3)支持文件上传 |
httpunit | HTTP请求的测试辅助工具,能处理web测试的需求 . 相比于HttpClient,不同之处在于: 1)HttpUnit能对HTTP返回的结果页进行解析,比如DOM元素定位 2)HttpUnit能自己启动一个servlet来运行被测服务 |
htmlunit | HtmlUnit相比HttpUnit功能更加强大, HtmlUnit是Junit的扩展测试框架之一,开发者可以使用其提供的API对页面的元素进行操作。 页面的各种元素都可以被当作对象进行调用,对JavaScript的支持也比较好。 |
jwebunit | JWebUnit以HttpUnit和JUnit为基础的一个web测试工具。 可以用来验证链接跳转、表单输入和提交、表格内容以及Web应用程序特性的正确性。 相比于HtmlUnit,JWebUnit封装的更友好,编写case也会更加简单 |
深入httpclient
java 引入httpclient后,发送http请求获取json 与浏览器间接请求接口返回的json(手动调用url的json)的区别:
httpclient后,发送http请求获取json : 只保证array 中的顺序(与手动调用url返回的一致),其他顺序不保证(和手动调用url返回的json顺序不一致)
httpclient调接口返回的json :
手动调用url的json返回:
net.sf.json.JSONObject 和org.json.JSONObject 的差别
不同的方面 | net.sf.json.JSONObject | org.json.JSONObject |
创建json对象 | //没有 new JSONObject(String)的构造方法 JSONObject json = JSONObject.fromObject(str); | String str = "";// 一个json串 JSONObject json = new JSONObject(str); |
解析json | 没有严格要求获取字段的类型跟getXXX()的类型一样 精度可能会丢失 | 获取的字段类型必须跟getXXX()的类型一样 精度不会丢失 |
从json中获取数组 | 可以使用if(o instanceof JSONArray) 判断类型 | 可能抛异常:JSONArray subArray =obj.getJSONArray(key) |
size大小(数组) | int leng = subArray.size(); | int leng = subArray.length(); |
建议: 为了遍历的方便和,不抛出异常,建议使用 net.sf.json.JSONObject
httpclient设置超时时间
- 设置的用途
不设置的后果就是一旦对方服务器出现无响应的情况,如果有返回(404 50x)错误还好,没有返回的话,java线程会一直等待。设置后,超时系统抛出异常。
- 超时时间类型
A 连接超时(connectionTimeout ): 连接一个url的连接等待时间
例如:
client.getHttpConnectionManager().getParams().setConnectionTimeout(3000);
B 读取数据超时(soTimeout ):连接上一个url,获取response的返回等待时间
例如:
client.getHttpConnectionManager().getParams().setSoTimeout(2000);
httpclient4的设置方式和httpclient3有所不同,代码如下:
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, Config.20000);//连接时间20s
httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 60000);//数据传输时间60s
DefaultHttpClient 设置超时机制 DefaultHttpClient client = new DefaultHttpClient(); client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 15000); client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 15000);