文章目录
1 接口测试概述
1.1 什么是接口
接口测试是测试系统组件之间的一种测试。
硬件接口:USB接口,鼠标键盘接口
软件接口:称为API。例如:微信中的提现和充值,这两个功能需要和银行卡关联,想要调用银行接口,就必须拿到鉴权码(token/key/appkey),软件的接口主要使用数据交互。
软件接口分类:
(1)系统对外提供的接口。这种接口外部是可以接触到的,对安全性要求高。例如:银行系统提供提现和充值接口给微信使用。
(2)系统调用外部的接口。例如:某电商系统需要支付宝或微信支付,即该电商系统调用支付宝或微信支付接口。
1.2 为什么需要做接口测试
前后端分离,系统和子系统分离,需要查看数据传输。
基于安全考虑。
测试前移。
1.3 目前市面上的接口架构设计以及其基于的协议
(1)SOAP的接口架构,是一种轻量级的简单的XML的协议规范。基于webservice协议,地址是以?wsdl
结尾,是一种很旧的技术,了解即可。
(2)RPC的接口架构,是一种远程调用,调用服务器的接口和调用本地一样。
dubbo协议,阿里的RPC的接口架构,地址是以dubbo://
,适合传输高并发数据量少的数据。springcloud的微服务也是RPC接口架构。
此外,还有htrift,rmi,hessian。
(3)RestFul接口架构,默认使用http协议,是主流技术。默认使用json传输数据。
对于同样一个接口地址http://127.0.0.1/yuser
,使用不同的请求方式得到的结果是不同的。get请求用于查询用户,post请求用于增加用户,put请求用于修改用户,delete用于删除用户。
1.4 http协议
http协议是超文本传输协议,主要用于浏览器和服务器之间交互数据。交互分为请求和响应两部分。
请求有请求行,请求头和请求正文。
响应有响应行,响应行和响应正文。响应码,1xx表示信息,2xx表示请求成功,3xx表示重定向(页面跳转),4xx客户端错误,5xx服务器错误。
请求头的部分信息,如下表:
信息 | 描述 | 例子 |
---|---|---|
Accpet | 客户端接受的数据类型 | application/json,text/javascript,/;q=0.01 |
X-Requested-With | ajax异步请求(不需要刷新) | XML HttpRequest |
User-Agent | 客户端类型 | Mozilla/5.0 |
Content-Type | 内容的格式 | application/x-www-form-urlencoded;charset=UTF-8 |
Cookie | Cookie信息 | token=21398sdlah |
Cookie的原理
Cookie不是缓存,是保存在客户端的一小段文本信息,格式是dict格式。
当客户端第一次访问服务器时,服务器就会生成Cookie信息,这个Cooike信息通过响应头里面的Set-Cookie传输到客户端。从第2-N次请求,只要访问当前的域名和路径,客户端就会在请求头的Cookie里面自动带上客户端的Cookie信息。
2 接口测试的流程以及其工具
2.1.1 接口测试的流程
1 拿到接口API文档,熟悉接口业务,接口地址,鉴权方式,入参,出参,错误码。规范方式是把API文档存放在swagger或者showdoc中,不规范是把API文档存放在word文档中,没有API文档则通过抓包或录制方式获得。
2 编写接口用例以及评审。
思路。
正向用例,输入正常参数,接口能够成功返回数据。
反向用例有鉴权反向用例、参数反向用例、错误码覆盖和其他错误场景。
鉴权反向用例包括鉴权码为空,鉴权码错误和鉴权码过期等等。
参数反向用例包括参数为空,参数类型异常,长度异常等等。
错误码覆盖根据业务而定。
其他错误场景包括接口黑名单,接口调用次数限制和分页场景。
3 编写接口测试用例。
4 使用接口测试用例工具执行接口测试。
5 输出接口测试报告(html格式)
2.1.2 市面上的接口测试工具
第一套:Postman+newman+git+Jenkins实现接口自动化,并且输出参数报告和发送邮件。
newman是专门为postman使用的,主要用于和Postman进行持续集成。
第二套:Jmeter+Ant+git+Jenkins实现接口自动化。Ant是Jmter的插件,主要用于和Postman进行持续集成。
其他工具:soupui,apipost,fiddler,charles
3 mall_cms_v2接口
测试的接口为Postman官方例子的API,如下:
https://documenter.getpostman.com/view/12387168/TzzDKb12#7f0beb33-e365-420b-bbcf-67df9c87749e
name,password,token。
4 Postman界面介绍
Home主页
workpaces工作空间
collections集合,项目集合。
APIs api文档。
Environments 环境变量,全局变量。
Mock Servers 虚拟服务器。
Monitors 监听器。
Hoistory 历史记录。
5 Postman执行接口测试
5.1 请求页面模块
Postman 请求页面模块如下图:
Parsam:get请求传参
Authorization:鉴权
Headers:请求头
Body:post请求传参,传参方式如下表:
方式 | 描述 |
---|---|
form-data | 可用键值对和文件传参数 |
x-www-from-urlencoded | 只能以键值对方式传参数 |
raw | json,text,xml,html,javascript |
binary | 把文件以二进制的方式传参 |
具体位置如下图:
pre-request-script:请求之间的脚本
tests:请求之后的断言
Settings:设置
cookies:用于管理Cookie信息
5.2 响应页面模块
Body:接口返回的数据,传参的形式如下表:
方式 | 描述 |
---|---|
Pretty | 以json,html,xml等不同的格式查看返回的数据 |
Raw | 以文本的方式查看返回的数据 |
PreView | 以网页的方式查看返回的数据 |
Cookies:响应的Cookies信息。
Headers:响应头。
Test Results:断言的结果。
响应页面模块如下图:
200 为状态码
OK 为状态信息
12.64s为响应时间
347.84kb为响应的字节数
get请求和post请求的区别!!!:
1 get请求是获取数据,post请求是提交数据。
2 本质区别是传参的方式不一样。get请求在地址栏后面以?
的方式传参,多个参数之间用&
分隔。post请求是在body以表单的方式传参。
3 post请求比get请求安全。
post请求例子,请求模块如下图:
响应模块如下图:
6 Postman的环境变量和全局变量
6.1 环境变量
第一,添加多个环境变量,如下图:
第二,在环境变量中设置变量以及变量值,变量为url,变量值为152.136.185.210:4000/login
,如下图:
第三,在Collections切换环境变量,如下图:
6.2 环境变量和全局变量的区别
环境变量:重点在环境下,切换环境,运行接口。
全局变量:重点在变量,全局变量可以给任何接口使用。
环境变量是在创建接口之前就要创建好,选择好了环境变量,才进行接口测试。
获取环境变量和全局变量的值通过:{{变量名}}
7 接口关联
7.1 使用json提取器实现接口关联
以152.136.185.210:4000/login
为例子
请求之后的断言
第一步,查看响应之后的结果,如下代码:
console.log(responseBody);
第二步,将获取的access_token的值的格式转换为对象的数据,结果存储在result变量中,如下代码:
var result = JSON.parse(responseBody)
第三步,将access_token设置为全局变量,如下代码:
pm.globals.set("token", "result.token");
综上,在请求模块中的Tests子模块中输入以下代码:
//查看响应之后的结果
console.log(responseBody);
//把返回的字符串格式的数据转换成对象的数据
var result = JSON.parse(responseBody)
//把token的中的值设置为全局变量
pm.globals.set("token", "result.token");
运行结果如下图:
查看全局变量是否添加了token,如下图:
上述两张图片的token一致,则证明成功添加了token全局变量!
即其他接口都是直接使用token,使用格式{{token}}
,实现了与接口相关联。
7.2 使用正则表达式提取器实现接口关联
//使用正则表达式提取器实现接口关联,math匹配。
var result = responseBody.match(new RegExp('"access_token":"(.*?)"'));
//获取鉴权码
console.log(result[1])
//将鉴权码设置为全局变量
pm.globals.set("access_token", result[1]);
分析上述代码:
responseBady返回结果,math方法将结果与token匹配,从而获token,再将token设置为全局变量。
在Console框运行结果如下图:
在全局变量页面中也可以查看token值,如下图:
8 Postman内置动态参数以及自定义动态参数
8.1 内置动态参数
postman内置动态参数写在请求模块的Body子模块中的row点上,以json形式传入,内置动态参数如下:
{{$timestamp}} 生成当前时间的时间戳
{{$randomInt}} 生成0-1000之间的随机数
{{$guid}} 生成随机GUID字符串
8.2 自定义动态参数
自定义动态参数一般写在请求页面的Pre-request Script中,如下代码:
//手动获得时间戳
var times = Date.now()
//设置为全局变量
pm.globals.set("times", times);
使用times全局变量变量格式如下:
{{times}}
注:
(1)业务闭环的实现。遵从创建、修改、查询和修改的顺序。
(2)上传文件,如下图所示:
9 Postman断言
9.1 常用的6种断言
断言 | 描述 |
---|---|
Status code: Code is 200 | 判断状态码是否为200 |
Response boby: Contains string | 判断响应内容是否包含string字符串 |
Response boby: JSON value check | 判断响应内容的json是否为对应的值 |
Response boby: Is equal to string | 判断响应内容是否等于string字符串 |
Response headers: Content-Type header check | 判断响应头是否包含Content-Type header |
Response time is less than 200ms | 判断响应时间是否少于200ms |
9.2 动态参数的断言方式
一般情况下,我们都会把动态参数设置成全局变量,即在断言中需要调用全局变量,方法如下:
其一,使用Postman中自带的获取全局变量的方法,如下:
pm.globals.get("variable_key");
其二,使用列表取值的方式,如下:
globals["variable_key"]
其三,使用对象引用的方式,如下:
globals.variable_key
9.3 全局断言
在项目选择Edit,如下图:
在Tests模块下设置全局断言,即每一个接口都会进行该全局断言。一般地,我们将状态码断言设置为全局断言,如下图:
10 Postman批量运行测试用例
添加进runner中
若测试用例中有上传文件,则需要在设置中进行调整,首先找到设置界面,如下图:
选择settings。
然后,允许Postman读取外部文件,如下图:
最后,将需要上传的文件放在D:\Users\DELL\Postaman\files
目录中。