Web接口测试-HttpClient
要实现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(); } }
}
Web接口测试-HttpClient的更多相关文章
- 使用 Jmeter 做 Web 接口测试
接口测试概述 定义 API testing is a type of software testing that involves testing application programming in ...
- 基于PowerShell 3.0的web接口测试
对于web接口测试,做一下总结. 接口测试总结 1. 接口url格式:http://www.xxx.com/a/bbb.html: 2. 接口url后面接的参数格式:“?参数名=参数值&参数名 ...
- Python nose单元测试框架结合requests库进行web接口测试
[本文出自天外归云的博客园] 之前写过一篇关于nose使用方法的博客.最近在做一元乐购产品的接口测试,结合着python的requests库可以很方便的进行web接口测试并生成测试结果.接口测试脚本示 ...
- 让你分分钟了解Web接口测试
因为前后端架构分离技术的兴起,接口测试也越来越重要,最近一直想总结下,作为一个近三年的测试人员,接口这个词是耳濡目染的,而开发张口闭口也都是这个接口或那个接口怎么怎么样,自己遇到的bug也很多是接口问 ...
- 【转】使用 Jmeter 做 Web 接口测试
最近总结了一下在接口测试方面的知识与心得,在这里与大家分享一下,如有说的不对的地方请多多指正. 接口测试概述 定义 API testing is a type of software testing ...
- 使用jmeter做web接口测试
接口测试概述 定义 API testing is a type of software testing that involves testing application programming in ...
- 【转】使用Python的Requests库进行web接口测试
原文地址:使用Python的Requests库进行web接口测试 1.Requests简介 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写, ...
- 使用 Jmeter 做 Web 接口测试-详解
接口测试概述 定义 WIKI定义:接口测试作为集成测 试的一部分,通过直接控制API来判断系统的功能性,可靠性,性能与安全性.API测试是没有界面的,执行在通讯 层.API 测试在自动化测试中有着重要 ...
- 怎么做web接口测试
这就需要开发提供的接口文档了,接口文档和功能测试的需求说明书的功能是一样的.包括:接口说明.调用的url,请求方式(get or post),请求参数.参数类型.请求参数说明,返回结果说明.有 ...
随机推荐
- oracle11gR2 手工创建基于asm存储的oracle实例
http://www.cnblogs.com/beanbee/archive/2012/09/22/2697689.html使用命令行手工建立Oracle11gR2数据库 通过命令行建立一个数据库可以 ...
- java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer
启动eclipse报错:java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer 解决办法: 删除以下文件.metad ...
- P1754 球迷购票问题
题目背景 盛况空前的足球赛即将举行.球赛门票售票处排起了球迷购票长龙. 按售票处规定,每位购票者限购一张门票,且每张票售价为50元.在排成长龙的球迷中有N个人手持面值50元的钱币,另有N个人手持面值1 ...
- 转 spring配置文件
spring配置文件 pom文件: <properties> <commons-lang.version>2.6</commons-lang.version> ...
- 类似Visual Studio一样,使用Qt Creator管理多个项目,创建子项目
1. 简介 QtCreator是一个十分好用的跨平台IDE,由于最近需要在Windows和Mac同时写一个C++的代码,使用VS和XCode不能实现项目的统一管理(可以使用cmake来组织源码,但是每 ...
- centos7搭建filebeat
filebeat的环境搭建 cd /home/elk wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4 ...
- Hive 数据的导入导出
数据的导入: 通过文件导入,使用load命令 一.导入本地文件: load data local inpath '/home/hadoop/files/emp.txt' overwrite into ...
- C#一些常用的图片操作方法:生成文字图片 合并图片等
生成文字图片: /// <summary> /// 生成文字图片 /// </summary> /// <param name="text">& ...
- item 2: 理解auto类型的推导
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你已经读过item 1的模板类型推导,你已经知道大部分关于au ...
- LeetCode Search Insert Position (二分查找)
题意 Given a sorted array and a target value, return the index if the target is found. If not, return ...