postman接口测试
一、接口:
1、什么是接口
外部接口:开发人员自己开发的为自身系统提供的接口;
外部接口:为外部系统开发的接口。微信、支付宝支付接口。
所谓接口,就是软件提供给外部的一种服务,用于数据传输。
2、软件为什么需要接口
接口能对系统内的数据进行修改
3、为什么要进行接口测试
a 现在的系统都是前后端分离的,开发进度不一致,需要把最先开发的接口进行测试;
b 基于安全考虑,前端有些验证很容易被绕过;
c 测试推崇的是测试左移,测试用尽早介入。
接口测试的本质: 测试接口能否正常交互数据,权限控制以及对异常场景的反应。
二、接口返回数据和json
1、接口返回数据
通常有三种格式:
1.1 json: 返回数据中包含三组规则(当前所公认的)(市面上占到80%以上)
返回数据格式:
{“error_code”:200, “msg”: “查询成功”, “data”: […]}
error_code: 响应状态码
msg: 响应信息
data: 返回数据
1.2 html:
1.3 xml:
三、接口测试协议
1、webserver协议: http://…?wsdl 如例:以 http 开头,以 ?wsdl 结尾。
是基于soap协议的,一般传输wsdl文件。
restful架构风格:
请求的url地址只有一个,通过不同的请求方式区分增删改查。
get请求用来获取数据,post请求提交数据,put请求修改数据,delete请求删除数据。
2、dubblo协议: 以dubbo://…开头,适合少量数据传输,大并发
3、http协议: 以http或https开头。占到市面上80%以上
3.1 什么是http协议:
即 超文本传输协议,用于浏览器和服务器之间的数据传输,包含两部分,
请求:
请求方式:get、post、put、delete四种;
请求内容包括:
请求行(请求方式、地址、协议) 请求头 请求内容
响应头(协议、状态码、信息) 响应行 响应内容
响应: 1XX 信息、2XX 成功、3XX 重定向、4XX 浏览器错误、5XX 服务器错误
四、企业接口测试流程和方案
1、流程:
a 拿到api文档,熟悉接口业务、地址、鉴权、入参、出参、错误码等信息;
b 接口测试计划和方案;
c 编写测试用例,进行用例评审;
d 执行接口测试;
e 输出接口测试报告。
五、测试工具的使用
1、主界面
系统设置区为:环境配置区
Tests 是断言。
2、请求
2.1、 get请求直接在params中以键值对的方式添加参数;
2.2、 post请求,参数要在Body中添加,json格式要选中 raw ,并且要注意将text改为json;
2.3、postman内置的动态函数
这三个函数在postman中可以直接使用
获取时间戳:{{KaTeX parse error: Expected 'EOF', got '}' at position 10: timestamp}̲} 生成0-1000的随机整…randomInt}}
生成一个GUID的随机字符串:{{$guid}} 一个很长的字符串
2.4、全局变量使用,与环境的使用
环境变量与全局变量定义好之后都是使用与全局的。
环境的使用: 实际工作中,可能有多个环境,比如 开发环境、测试环境、线上环境。不同的环境可能使用不同的url地址,这里我们可以将不同的url分别定义在不同的环境里,这样直接更换不同的测试环境就可以了。
全局变量
全局变量可以手动添加,也可以通过脚本的方式从响应结果中提取,大多数情况都是从结果中提取的,自动化。
1、手动设置
设置简单,但是设置的值是固定不变的,不能随着响应而发生改变
值1是:初始值 值2是:当前值
2、从响应中提取
从响应中提取,直接将值赋给变量,然后再引用,这种方式更为便捷灵活,提取的值会随着响应结果而发生改变,利于自动化实现。
并且有已经封装好的函数,直接点击自动生成。
脚本编写 在Tests(断言)中编写相关脚本,点击右侧小窗中的 Set a Collection variable 会自动生成相关代码
一些简单的JS代码
//打印、输出
console.log()
// 获取当前时间戳
Date.now()
//正则匹配相关
字符串.match(new RegExp('"city": "(.*?)",'))
match() // 匹配
具体的实现
//设置全局变量
//方式一: JSON 提取器
//第一步:将响应结果转换为json格式并赋值给变量
var response = JSON.parse(responseBody) // responseBody 是返回的响应结果
//第二步:生成定义全局变量的函数(点击右侧小窗中的 Set a Collection variable)
//第三步:将参数传入函数对应位置,前边是变量名,后边是对应的值
pm.globals.set("city", response.result.city);
//第四部:调用,对应的位置填入 {{city}}
//方式二: 正则匹配。取第一个值
var city = responseBody.match(new RegExp('"city": "(.*?)",'))[1]
断言
postman中一共有八种断言方式,对应着selenium中的八种元素定位方式。
添加断言的位置:Tests 标签 ,直接在里边编写即可,右侧小窗口已经有提前设置好的片段,可以直接调用。
详细的信息可以参考官方文档:https://learning.postman.com/docs/writing-scripts/test-scripts/
1、八种断言方式:
//1. 断言状态码为200 常用于状态断言
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
//2. 断言响应结果中是否包含指定字符串 常用于业务断言(精确断言)
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
//3. 断言,对返回的结果做json字段检查 常用于业务断言
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
//4. 断言返回的结果是否等于某一字符串 常用于业务断言
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
//5. 断言响应头中是否包含指定响应头
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
//6. 断言接口请求时间是否少于200ms 常用于性能断言
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
//7. 断言post请求返回的状态码是够在指定范围中
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});
//8. 断言返回的状态码信息包含指定字符串
pm.test("Status code name has string", function () {
pm.response.to.have.status("Created");
});
2、
在使用第二种精确断言时,需要匹配精确的字符串。但是实际中,响应结果可能是随机生成的,响应结果并不确定,所以需要进行
动态匹配,也可以在这里编写脚本获取。
eg:需要获取的是由 固定字符串跟时间戳 生成的字符串,可以在请求前获取当前时间戳并定义为一个全局变量,然后在断言中使用
发送请求前获取时间戳:
//获取当前时间戳并赋给times
var times = Date.now()
//将times设置为全局变量
pm.globals.set("times", times);
精确断言
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("固定字符串"+pm.globals.get("times"));
});
//需要注意的是,在这里不能使用大括号变量名 的方式引用变量,要使该函数获取
3、全局断言
对于状态码这样的断言,每一个接口都需要进行判断。这种类似的断言,直接写在全局断言里,应用于全局,每个接口下,只需要编写对应的业务断言就可以了。
4、cookie提取器
在断言中编写cookie提取脚本
//提取,得到的是一个cookie对象
var cookie = postman.getResponseBodyCookie('要提取的字段');
//将需要的值提取出来
cookie = cookie.value //如果不清楚哪一个字段是自己想要的,可以先打印一下 console.log(cookie)
//也可以直接一步完成 var cookie = postman.getResponseBodyCookie('要提取的字段').value;
//定义为全局变量
pm.globals.set("cookie", cookie);