1. Postman 简介
Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果,从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上线之后的稳定性和安全性。
它主要是用来模拟各种HTTP请求的,Postman与浏览器的区别在于有的浏览器不能输出Json格式,而Postman更直观接口返回的结果。
2. Postman下载
下载链接:https://www.postman.com/downloads/ ,下载自己平台的版本:
- Mac
- Windows(x86/x64)
- Linux(x86/x64)
浏览器在线访问,访问 https://go.postman.co/home 即可。
下载 newman 命令行工具:
npm install -g newman
Postman 安装成功之后,需要注册账号,然后登陆之后,才能使用功能。
3. 发送请求
3.1 创建Collection集合
在刚开始一个项目时,为了后续便于组织和管理,把同属该项目的多个 API,放在一组里。所以要先去新建一个 Collection: New -> Collection
3.2 创建Request请求
新建接口,即对应的Request:New -> Request
设置 HTTP 的 Method 方法和输入 api 的地址以及请求参数或请求体
请求URL的路径中可以通过变量来设置:
3.3 认证
点击上图中蓝色Send图标即可发送请求,验证请求结果是否正确。下图是对应的响应结果,包含Body和Headers两个部分,Body即响应体正文,Headers即为响应头信息,响应头不包含响应状态码和状态信息部分。
响应体包含三种查看模式,分别为:Pretty默认模式、Raw原始数据格式,Preview预览模式(此模式针对HTML页面效果很好)。
3.4 查看结果
3.5 使用变量
在Postman的设置区有 Environment 和 Global Variable。
环境变量可以使用在以下地方:
URL
URL params
Header values
form-data/url-encoded values
Raw body content
我们可以在Pre-request Script和Test模块中进行环境变量设置。
1、设置环境变量
pm.environment.set("key", "value");
2、获取环境变量
pm.environment.get("variable_key");
全局变量(Global Variable)顾名思义是针对于所有脚本和所有环境将生效的变量,它的作用域大于环境变量。设置全局变量的方法与环境变量相似:
1、设置全局变量
pm.globals.set("variable_key", "variable_value");
2、获取全局变量
pm.globals.get("variable_key");
postman中常用的动态变量:
guid:生成一串guid字符串
timestamp:以秒为单位计算当前时间
randomint:生成1到1000之间的随机整数
引用方式:
{{$timestamp}}
更多变量,请参考 https://learning.postman.com/docs/writing-scripts/script-references/variables-list/
3.6. 管理环境
在测试API期间,往往存在多种环境,对应IP地址(或域名也不同),比如:
- 本地环境
- 开发环境
- 测试环境
- 生产环境
4. 编写脚本
Postman的断言功能在Test模块中,比如要测试返回结果是否含有某一字符串,就需要在Test中编写相应的代码,Test中的代码使用的是JavaScript语法。
4.1 断言
Postman提供了参考代码供我们选择即可,主要断言代码有如下几种:
- 断言状态码是否为200,在断言中此种断言价值不高
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
- 断言响应文本中是否包含某个数据串,常用
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
- 使用 JsonPath 断言
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
- 使用正则表达式
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData).match(new RegExp('"id":(.+?)'));
});
- 检查响应正文中是否包含某个子串
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
- 检查响应header中是否包含某个子串
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
- 检查响应时间
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
- 响应信息包含列表中其中某一个
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201,202]);
});
- 将xml响应转为json
var jsonObject = xml2Json(responseBody);
也可以使用断言并赋值的形式,相对而言,以下方式会更为简洁实用。
常见的断言代码有:
- 检 查response的body中是否包含字符串
tests["Body matches string"] = responseBody.has("string_you_want_to_search");
- 检查JSON节点的值和节点元素的个数为5
var data = JSON.parse(responseBody).city; //把JSON字符串转化为对象
tests["Your test name"] = data.value===100;
tests["program's lenght"] = data.programs.length===5;
- 验证Response time是否小于某个值
tests["Response time is less than 200ms"] = responseTime < 200;
我们可以引用数据用例csv文档中的预期结果进行断言。
var jsonData = JSON.parse(responseBody) ;
# data.expected 为csv数据文件中的预期结
tests["测试结果通过"] = jsonData.expires_in===data.expected ;
在tests还可以使用判断语句进行断言
pm.test("预期结果包含:长沙,实际结果为:"+result, function () {
if(JSON.parse(responseBody).city==="长沙"){
pm.expect(pm.response.text()).to.include("千里");
pm.expect(pm.response.text()).to.include("长沙");
}else if(JSON.parse(responseBody).city==="Changsha"){
pm.expect(pm.response.text()).to.include("千里");
pm.expect(pm.response.text()).to.include("Changsha");
}else if(JSON.parse(responseBody).city==="長沙"){
pm.expect(pm.response.text()).to.include("千里");
pm.expect(pm.response.text()).to.include("長沙");
}
});
4.2 前置脚本
8. 关联技术
关键技术是将前一个请求的响应结果保存到变量中,再将此变量在后续请求中进行引用。
保存前一个请求的响应数据
因为Test模块是后置模式,可对响应进行处理。我们可以通过赋值方式把响应结果保存到变量中。
参考代码如下:
var res = pm.response.json();
if (res.data) {
pm.globals.set("token", res.data);
}
对后一个请求进行参数化
因前面将token的值保存到了环境变量中,所以在该请求中,只需要进行参数引用即可。
关联的高级操作
利用Send a request实现前置步骤,例如:用户登陆的前置步骤是获取验证码,我们可在Pre-request Script前置步骤中发送请求,将该请求的结果保存到环境变量中,然后在主请求中引用该环境变量即可。
先获取验证码:
const url=pm.environment.get("baseUrl")+"/v1/captcha"
pm.sendRequest(url, function (err, res) {
console.log(err ? err : res.json());
var data=res.json().data;
pm.environment.set("code",data.code);
pm.environment.set("key",data.key);
});
然后请求体中使用环境变量:
POST请求相比GET请求要复杂一点,因为其需要加入请求Header和请求Body,以下是Pre-request Script在发送POST请求的案例:
- 构造一个登录请求
const loginRequest = {
url: 'http://localhost:8080/user/login/',
method: "POST",
body: {
mode: 'urlencoded', // 模式为表单url编码模式
urlencoded: 'name=张三&password=123456'
}
};
- 发送请求
pm.sendRequest(loginRequest, function (err, res) {
console.log(err ? err : res.text());
});
发送JSON格式请求与发送POST请求类似,以下采用了raw模式发送请求体。
- 构造一个注册请求
const regRequest = {
url: 'http://localhost:8080/user/reg/',
method: 'POST',
header: 'Content-Type: application/json', //注意要在Header中声明内容使用的类型
body: {
mode: 'raw', // 使用raw(原始)格式
raw: JSON.stringify({ name: '小小', password: '123456' }) //要将JSON对象转为文本发送
}
};
- 发送请求
pm.sendRequest(regRequest, function (err, res) {
console.log(err ? err : res.json()); // 响应为JSON格式可以使用res.json()获取到JSON对象
});
因为HTTP请求都支持raw格式,我们只要能够获取请求的raw格式,便可采用raw模式发送任意类型的请求体了。