介绍
什么是接口测试
基于HTTP协议,通过代码或者工具模拟请求,检查服务器返回的响应结果是否符合接口说明文档的描述
接口测试的分类
系统对外的接口测试:比如你要从别人的网站或者服务器获取资源或者信息,别人肯定不会把数据库共享给你。他只能写一个方法,提供一个接口,我们通过接口访问他写好的方法,最终达到数据共享的目的
系统内部的接口测试:前端显示的数据都是来自服务器,前端发送请求给服务器,服务器通过接口获取前端发送的请求,并返回响应数据
接口测试的意义
接口测试测的是服务端,检查服务器端是否做校验,保存服务器的安全性和稳定性
接口测试属于集成测试阶段,介入时间早,更早发现bug,bug修复成本低
接口测试的执行效率比较高
接口测试比UI自动化测试更稳定,更适合做回归测试,满足后端快速发版的需求,实现持续集成,缩短项目周期
如何做接口测试
找开发要接口说明文档
设计测试用例
通过代码或者工具模拟请求
接口测试开发环境搭建
JDK(1.8以上版本)、maven、IDEA
maven:找到maven安装路径,找到conf,找到settings.xml,在159行添加代码
?
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
打开IDEA,新建项目,点击左侧maven,点击从原型创建,选择quickstart,下一步?
?
??
?给项目取名??
?
??
选择对应版本?
?
??
?新建包名
点击pom.xml,下载代码库?
?
?
??
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.8</version>
<scope>test</scope>
</dependency>
代码实现
手工操作思路:打开浏览器→输入网址→敲回车→检查响应结果是否正确
代码思路:1.创建一个支持HTTP协议的客户端
可以理解为这是一种特殊的浏览器
2.构造网址
网址分为五部分:协议scheme、域名host、端口号port、路径path、参数parameter
3.创建请求
请求分为三部分:请求行、信息头、消息体
4.通过客户端把请求发送给服务器,最后从服务器获取响应结果
5.检查响应结果是否符合接口说明文档
代码实现
以微信公众平台测试账号为例(https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index)
登录账号,可以获得自己的appID和appsecret
下方有可以体验的接口权限表?
???
??
点击第一个获取access_token,查看接口说明文档,会有请求方式、参数说明以及返回码说明????
?
????
打开IDEA,创建accesstoken.java
1.创建HttpClient
CloseableHttpClient client = HttpClients.createDefault();
2.构造网址
URI uri = new URIBuilder()
.setScheme("协议")
.setHost("域名")
.setPort(端口号)
.setPath("路径")
.setParameter("键","值")
.setParameter("键","值")
....
.build();
根据网址的五部分,带入到代码中
底部代码异常,点击添加异常到方法签名】
3.创建请求
HttpGet get = new HttpGet(uri);
4.通过client发送请求,获取响应结果
CloseableHttpResponse response = client.execute(get);
5.检查响应结果
状态行
response.getStatusLine();
信息头
response.getAllHeaders();
消息体
response.getEntity();
测试结果
代码整合
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.http.Header;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.testng.annotations.Test;
public class AccessToken {
@Test
public void f() throws URISyntaxException, ClientProtocolException, IOException {
// 1.创建HttpClient
// 导包快捷键: ctrl + shift + o
CloseableHttpClient client = HttpClients.createDefault();
// 2.构建网址
// https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
URI uri = new URIBuilder()
.setScheme("https")
.setHost("api.weixin.qq.com")
.setPort(443)
.setPath("/cgi-bin/token")
.setParameter("grant_type","client_credential")
.setParameter("appid"," ")
.setParameter("secret"," ")
.build();
// 3.创建请求
HttpGet get = new HttpGet(uri);
// 4.执行请求,获取响应
CloseableHttpResponse response = client.execute(get);
// 5.检查响应结果是否正确
// 5.1 状态行 response.getStatusLine()
System.out.println(response.getStatusLine());
// 5.2信息头 response.getAllHeaders();
Header[] headers = response.getAllHeaders();
for (int i=0; i<headers.length; i++) {
System.out.println(headers[i]);
}
// 5.3消息体response.getEntity()
// {"access_token":"ACCESS_TOKEN","expires_in":7200}
// {"access_token":" ","expires_in":7200}
String responseText = EntityUtils.toString(response.getEntity());
System.out.println(responseText);
}
}