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 命令行工具:

  1. npm install -g newman

Postman 安装成功之后,需要注册账号,然后登陆之后,才能使用功能。

3. 发送请求

3.1 创建Collection集合

在刚开始一个项目时,为了后续便于组织和管理,把同属该项目的多个 API,放在一组里。所以要先去新建一个 Collection: New -> Collection

3.2 创建Request请求

新建接口,即对应的RequestNew -> Request

Postman - 图1

设置 HTTP 的 Method 方法和输入 api 的地址以及请求参数或请求体

Postman - 图2

请求URL的路径中可以通过变量来设置:

Postman - 图3

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、设置环境变量

  1. pm.environment.set("key", "value");

2、获取环境变量

  1. pm.environment.get("variable_key");

全局变量(Global Variable)顾名思义是针对于所有脚本和所有环境将生效的变量,它的作用域大于环境变量。设置全局变量的方法与环境变量相似:

1、设置全局变量

  1. pm.globals.set("variable_key", "variable_value");

2、获取全局变量

  1. pm.globals.get("variable_key");

postman中常用的动态变量:

  • guid:生成一串guid字符串

  • timestamp:以秒为单位计算当前时间

  • randomint:生成1到1000之间的随机整数

引用方式:

  1. {{$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,在断言中此种断言价值不高
  1. pm.test("Status code is 200", function () {
  2. pm.response.to.have.status(200);
  3. });
  • 断言响应文本中是否包含某个数据串,常用
  1. pm.test("Body matches string", function () {
  2. pm.expect(pm.response.text()).to.include("string_you_want_to_search");
  3. });
  • 使用 JsonPath 断言
  1. pm.test("Your test name", function () {
  2. var jsonData = pm.response.json();
  3. pm.expect(jsonData.value).to.eql(100);
  4. });
  • 使用正则表达式
  1. pm.test("Your test name", function () {
  2. var jsonData = pm.response.json();
  3. pm.expect(jsonData).match(new RegExp('"id":(.+?)'));
  4. });
  • 检查响应正文中是否包含某个子串
  1. pm.test("Body is correct", function () {
  2. pm.response.to.have.body("response_body_string");
  3. });
  • 检查响应header中是否包含某个子串
  1. pm.test("Content-Type is present", function () {
  2. pm.response.to.have.header("Content-Type");
  3. });
  • 检查响应时间
  1. pm.test("Response time is less than 200ms", function () {
  2. pm.expect(pm.response.responseTime).to.be.below(200);
  3. });
  • 响应信息包含列表中其中某一个
  1. pm.test("Successful POST request", function () {
  2. pm.expect(pm.response.code).to.be.oneOf([201,202]);
  3. });
  • 将xml响应转为json
  1. var jsonObject = xml2Json(responseBody);

也可以使用断言并赋值的形式,相对而言,以下方式会更为简洁实用。

常见的断言代码有:

  • 检 查response的body中是否包含字符串
  1. tests["Body matches string"] = responseBody.has("string_you_want_to_search");
  • 检查JSON节点的值和节点元素的个数为5
  1. var data = JSON.parse(responseBody).city; //把JSON字符串转化为对象
  2. tests["Your test name"] = data.value===100;
  3. tests["program's lenght"] = data.programs.length===5;
  • 验证Response time是否小于某个值
  1. tests["Response time is less than 200ms"] = responseTime < 200;

我们可以引用数据用例csv文档中的预期结果进行断言。

  1. var jsonData = JSON.parse(responseBody) ;
  2. # data.expected csv数据文件中的预期结
  3. tests["测试结果通过"] = jsonData.expires_in===data.expected ;

在tests还可以使用判断语句进行断言

  1. pm.test("预期结果包含:长沙,实际结果为:"+result, function () {
  2. if(JSON.parse(responseBody).city==="长沙"){
  3. pm.expect(pm.response.text()).to.include("千里");
  4. pm.expect(pm.response.text()).to.include("长沙");
  5. }else if(JSON.parse(responseBody).city==="Changsha"){
  6. pm.expect(pm.response.text()).to.include("千里");
  7. pm.expect(pm.response.text()).to.include("Changsha");
  8. }else if(JSON.parse(responseBody).city==="長沙"){
  9. pm.expect(pm.response.text()).to.include("千里");
  10. pm.expect(pm.response.text()).to.include("長沙");
  11. }
  12. });

4.2 前置脚本

8. 关联技术

关键技术是将前一个请求的响应结果保存到变量中,再将此变量在后续请求中进行引用。

保存前一个请求的响应数据

因为Test模块是后置模式,可对响应进行处理。我们可以通过赋值方式把响应结果保存到变量中。

Postman - 图4

参考代码如下:

  1. var res = pm.response.json();
  2. if (res.data) {
  3. pm.globals.set("token", res.data);
  4. }

对后一个请求进行参数化

因前面将token的值保存到了环境变量中,所以在该请求中,只需要进行参数引用即可。

Postman - 图5

关联的高级操作

利用Send a request实现前置步骤,例如:用户登陆的前置步骤是获取验证码,我们可在Pre-request Script前置步骤中发送请求,将该请求的结果保存到环境变量中,然后在主请求中引用该环境变量即可。

先获取验证码:

Postman - 图6

  1. const url=pm.environment.get("baseUrl")+"/v1/captcha"
  2. pm.sendRequest(url, function (err, res) {
  3. console.log(err ? err : res.json());
  4. var data=res.json().data;
  5. pm.environment.set("code",data.code);
  6. pm.environment.set("key",data.key);
  7. });

然后请求体中使用环境变量:

Postman - 图7

POST请求相比GET请求要复杂一点,因为其需要加入请求Header和请求Body,以下是Pre-request Script在发送POST请求的案例:

  • 构造一个登录请求
  1. const loginRequest = {
  2. url: 'http://localhost:8080/user/login/',
  3. method: "POST",
  4. body: {
  5. mode: 'urlencoded', // 模式为表单url编码模式
  6. urlencoded: 'name=张三&password=123456'
  7. }
  8. };
  • 发送请求
  1. pm.sendRequest(loginRequest, function (err, res) {
  2. console.log(err ? err : res.text());
  3. });

发送JSON格式请求与发送POST请求类似,以下采用了raw模式发送请求体。

  • 构造一个注册请求
  1. const regRequest = {
  2. url: 'http://localhost:8080/user/reg/',
  3. method: 'POST',
  4. header: 'Content-Type: application/json', //注意要在Header中声明内容使用的类型
  5. body: {
  6. mode: 'raw', // 使用raw(原始)格式
  7. raw: JSON.stringify({ name: '小小', password: '123456' }) //要将JSON对象转为文本发送
  8. }
  9. };
  • 发送请求
  1. pm.sendRequest(regRequest, function (err, res) {
  2. console.log(err ? err : res.json()); // 响应为JSON格式可以使用res.json()获取到JSON对象
  3. });

因为HTTP请求都支持raw格式,我们只要能够获取请求的raw格式,便可采用raw模式发送任意类型的请求体了。

9. 运行集合

10. 持续集成