1、什么是接口(API)?
内部接口:开发人员自行开发,对自己的系统提供模块之间数据交互。
用户接触不到,对安全性的要求不高。
外部接口:
对安全非常重视,所以测试的覆盖率需达到极致。
只需要测试正例即可。
总结:软件提供给外部的一种服务,主要用于交互数据。
2、为什么需要接口?
能够让内部的数据被外部进行修改(银行—微信)。
3、为什么要做接口测试?
①项目前后端分离(mock server—前端)。
②基于安全考虑:前端js认证容易绕过,直接攻击后端接口,所以需要在接口层面对安全性做考虑 。(身份证、银行卡)=>使用鉴权码接口鉴权=>token、access-token、csrf-token、key。
③测试左移。(在开发阶段,尽早发现问题)
接口协议:http/https、webservice、dubbo
接口测试的本质—>测试接口(函数)是否能够正常实现数据交互、异常场景提示、权限控制(token)
1、json:http、dubbo
返回数据常见规则:{error_code:错误码,message:错误码的中文说明,data:[]}
json数据详解:是一种数据格式,两种数据类型:
①键值对{key:value}
②列表[value1,value2,value3]
2、html:http
3、xml:webservice
1、SOAP:webservice协议,接口地址:http://…wsdl
2、RPC:
3、RestFul(最主流):http协议,接口地址:http://…
它将网络上的事物看成是资源,含xml、json、jpg,所有的操作无状态。
同样的接口地址(例如用户地址),不同的请求方式结果不同,get查询用户、post新增用户、put修改用户、delete删除用户。
1、拿到api接口文档(没有的情况下可通过抓包拿到),熟悉接口业务流程,包括地址、鉴权方式、入参、出参、错误码;
2、编写计划和方案;
3、编写用例并评审;
4、执行用例;
5、输出报告。
1、请求页面:
Params:表示get请求方式传参,自动把路径中 ?后的参数填充
Authorization:表示鉴权
Headers:请求头
Body:post请求方式传参,其中最主要的四个类型:
form-data:表单传参(可以传键值对,也可以传文件);
x-www-form-url:传键值对;
raw:多种格式;
binary:传二进制文件;
Pre-request Script:请求之前的断言
Text:请求之后的断言(状态断言、业务断言)
Settings:设置(某一请求)
Cookies:用来自动化管理cookie信息
右侧列表:
Documentation:中文说明
Comments:备注
Code:导出接口自动化测试脚本
Info:信息
2、响应页面:
Body:返回的数据
Pretty:可切换多种格式;
raw:文本;
Preview:网页;
Cookies:响应的cookie信息
Headers:响应头
Test Results:断言结果
菜单栏右侧:响应码、响应信息、响应时间、响应的字节数、保存响应
3、Console(最下方):
控制台,用于调适接口。
注意:提取中的字典需有下标。(例:data[1])
//1、通过JSON提取器实现
//①在第一个接口中提取token
//打印返回值
//console.log(responseBody)
//通过JSON提取器提取鉴权码(把返回值转化为json格式的字典,保存到jsData)
var jsdata = JSON.parse(responseBody)
//提取token值
//jsdata.access-token
//把鉴权码设置为全局变量,点击右侧列表中的set a global variable(变量名称、值)
pm.globals.set("access-token",jsdata.access-token)
//②在第二个接口中使用{{access-token}}的形式取值
//2、正则表达式提取器
//match 匹配(new RegExp('值的前(.+?)后边界') 新创建的正则表达式)
var jsdata = responseBody.match(new RegExp('"access-token":(.+?)",'))
//打印
// console.log(jsdata[1])
//设置为全局变量
pm.globals.set("access-token",jsdata[1])
//3、cookie提取器,key为cookie中含此值的键
var cookie = postman.getResbonseCookie("key")
1、内置动态参数:
{{$timestamp}} 获得时间戳(当前时间到1900年的秒数,也可以理解为较长的随机数)
{{$randint}} 获得0~1000的随机数(有局限)
{{$guid}} 获得随机字符串(很长)
2、自定义动态参数(无法精确断言的情况,例如参数中含有时间戳):
Pre-request Script(前置断言):
//Date.now() 获取时间戳
var times = Date.now()
//设为全局变量
pm.globals.set("time", time);
Body:
在body中使用时间戳的地方,将时间戳参数{{$timestamp}}改为自定义动态参数{{times}}
断言中使用的取值方式:
//response body:contains string (断言返回的结果中包括有一个字符串)
//+表示拼接,get a global variable来获取
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("xxx"+pm.globals.get("times"));
});
断言列表说明:
//断言(前6为核心,前四最常用)
status code:code is 200 (断言返回的状态码为200,不可缺少的)
response body:contains string (断言返回的结果中包括有一个字符串)
response body:JSON value check (断言返回结果中对json数据做检查)
response body:Is equal to a string (断言返回的结果等于一个字符串,一般用于接口返回的数据很少的情况下)
response headers:content-Tapy header check (断言响应头中包含有content-type)
response time is less than 200ms (断言相应时间小于200ms)
也属于全局变量(调用方法{{url}} ),作用不同
1、创建mock服务;
2、查看环境变量;
3、重新修改mock接口返回值,增加返回案例,最后请求。
注意:地址中不能有空格
MD5(使用最多):
var user = CryptoJS.MD5("账号").toString();
var pass = CryptoJS.MD5("密码").toString();
console.log()
pm.globals.set("user", user);
pm.globals.set("pass", pass);
接口签名(难度系数高,金融、支付、银行等项目)
1、你对http协议了解吗?
http是一种超文本传输协议,主要作用是用于浏览器和服务器之间交互数据。交互数据分为请求和响应两个部分:
请求中包含:
host:请求主机
Comnction:keep-alive保持活跃
Content-length:内容长度
Accept:客户端接收的数据格式:text、css、applic ation/json
X-Requested-with:XML-HttpRequest:一般用于登录接口,异步请求(ajax的技术)
User-Agent:发送请求的客户端的类型(例如,百度的查询接口必须带这个请求头——用户代理,可能是工具名称、浏览器名称、客户端角色)
Content-Type:请求的内容格式(请求的数据,表单的方式提交)
Cookie:保存cookie信息(通过cookie方式鉴权)
扩展:Cookie的工作原理【Jmeter中HTTP Cookie管理器的作用和工作原理】:
作用:Cookie鉴权,证明后面的请求都是同一个客户端。
响应:响应头(set-cookie)、响应行(状态码)、响应正文(响应数据)
2、Cookie、Session、Token相同和不同点?
相同:都是服务器生成的。
不同:①Cookie保存在客户端,Session保存在服务器内存里。Session和Token可以通过Cookie传输,也可以不通过它传输;Token保存在服务器的数据库或文件里。
②Cookie不够安全,web中,session消耗服务器内存,token用于接口或app鉴权。(app中可能三种方式并存)
3、GET和POST请求的区别?
①GET一般是获取数据,POST是提取数据;
②POST比GET安全;
③最本质:传参方式不同。GET在地址栏之后,以?分隔的方式传参,多个参数之间&相隔;
POST:通过表单传参。
//自定义函数,请求之前睡眠4秒
const sleep = (milliseconds) => {
const start = Date.now();
while (Date.now() <= start + milliseconds){}
};
sleep(4000);