# Postman的使用

相关工具的安装

  • 安装 newman : npm install -g newman
  • 安装 newman-reporter-htmlextra : npm install -g newman-reporter-htmlextra

Postman的介绍

Postman的介绍

  • Postman 一款支持调试和测试的工具,开发、测试工程师都可以使用
  • 特点:支持MAC、Windows和Linux
  • 官网地址:https://www.getpostman.com/

image-20231209130121253

Postman示例

image-20231209130258155

发送 get 请求

发送get请求

image-20231209130326066

案例

image-20231209130441713

发送 Post 请求

发送 Post 请求

image-20231209130506240

案例一

image-20231209130553741

案例二

  • 需求:发送IHRM项目的登录接口请求并查看响应结果
  • 分析:
    • • 请求方式:POST
    • • 请求URL:http://ihrm-test.itheima.net/api/sys/login
    • • 请求数据:
      • • 请求头:Content-Type: application/json
      • • 请求体:{"mobile":"13800000002", "password":"123456"}

思考

  1. Postman中get请求查询参数如何设置?
  2. Postman中如何发送表单数据格式的post请求?
  3. Postman中如何发送JSON数据格式的post请求?

发送其他请求

发送其他请求

  • 思考:如何发送put请求和delete请求?
    • 答:修改请求方法,其他设置均与get/post请求类似

案例

  • 案例:
    • 发送ihrm修改员工接口请求并查看响应结果
    • 发送ihrm删除员工接口请求并查看响应结果

Postman断言

学习目标

  • 能够使用Postman对响应结果自动断言

断言介绍

  • Postman断言:让Postman工具代替人工自动判断预期结果和实际结果是否一致

  • 用法:

    • ‘Tests’后置脚本标签页编写JavaScript断言代码
    • 断言结果(PASS/FAIL)在‘Test Results’标签页中展示
  • 在 Tests 输入框的右侧配置了一些常用的断言代码片段,点击后自动填写到 Tests 输入框中,然后再进行修改

image-20231209132502530

响应状态码断言

  • 模板名称:Status code: Code is 200

  • 模板内容:

  • 参数一 : 这个参数可以任意修改,不影响断言

    • 作用:在断言结束后,显示给用户,断言结果的提示文字
  • 参数二 : 一个匿名函数的调用

image-20231209132542533

1
2
3
4
// 响应状态码
pm.test("断言响应状态码为:200", function () {
pm.response.to.have.status(200);
});

包含指定字符串断言

  • 模板名称:Response body: Contains string
  • 模板内容:
  • 参数一 : 这个参数可以任意修改,不影响断言
    • 作用:在断言结束后,显示给用户,断言结果的提示文字
  • 参数二 : 一个匿名函数的调用

image-20231209132612781

1
2
3
4
// 指定字符串
pm.test("断言包含指定字符串: ok ", function () {
pm.expect(pm.response.text()).to.include("ok");
});

JSON数据断言

  • 模板名称:Response body: JSON value check
  • 模板内容:

image-20231209132639586

1
2
3
4
5
// 响应的数据 json 格式
pm.test("响应 json 格式数据的 msg 属性值为 ok ", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.msg).to.eql("ok"); // 期望响应数据的 msg 属性的值为指定的 "ok" 数据
});

案例

1
2
3
4
5
6
7
8
// 响应体
{
"msg": "ok",
"data": {
"token": "175988c4fdac35cfe1b4f5e4b252d6ae2a3050ec"
},
"path": "观看完整课程地址:https://study.163.com/course/courseMain.htm?courseId=1212775807&share=2&shareId=480000001892585"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 断言响应状态码
pm.test("断言响应状态码为:200", function () {
pm.response.to.have.status(200);
});

// 断言指定字符串
pm.test("断言包含指定字符串: ok ", function () {
pm.expect(pm.response.text()).to.include("ok");
});

// 断言响应的数据 json 格式
pm.test("响应 json 格式数据的 msg 属性值为 ok ", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.msg).to.eql("ok"); // 期望响应数据的 msg 属性的值为指定的 "ok" 数据
});

image-20231227115345740

断言的工作原理

image-20231225220328116

思考

  • 断言的作用是什么?
  • 常见断言有哪些方式
    • ★ 响应状态码断言
    • ★ 包含字符串断言
    • ★ JSON数据断言

Postman自动关联

学习目标

  • 能够使用Postman进行自动关联数据处理

应用场景

  • 当接口和接口之间,有依赖关系时,需要借助postman关联技术,来实现。
  • 如:
    • 登录接口返回的令牌数据,被添加员工接口依赖。
    • 添加员工接口返回员工id,被查询员工接口依赖。

自动关联解决思路

  • 假定:接口B产生的数据,被接口A依赖。
    • 1.发送接口B请求,获取响应数据。
    • 2.将响应数据,放入公共容器器(全局变量、环境变量)中
    • 3.接口A从公共容器中,提取数据,发送请求。

image-20231209133200903

1
2
3
4
5
6
7
8
9
10
11
// 1. 获取 响应数据,转为 json格式,保存到变量 jsonData中。
var jsonData = pm.response.json()

// 2.1 使用 全局变量做容器。
pm.globals.set("全局变量名", 全局变量值)

// 2.2 使用 环境变量做容器。
pm.environment.set("环境变量名", 环境变量值)

// 3. 在 postman 界面中(URL、请求头headers、请求体body) 提取 全局、环境变量 数据。
{{全局变量名}}/{{环境变量名}}

案例一_全局变量

  • 需求 :

  • 思路:

    1. 发送 获取天气请求,获取响应结果
    2. 从响应结果中,拿到城市名,存入 全局变量
    3. 百度搜索接口从全局变量中,取城市名,发送搜索请求。
  • 创建环境 :

image-20231227122103762

  • 发起请求设置全局变量 :
1
2
3
4
5
6
7
8
// 1. 获取响应结果
var jsonData = pm.response.json()

// 2. 从响应结果中,提取 城市名
var city = jsonData.weatherinfo.city

// 3. 将城市名保存到 全局变量
pm.globals.set("globals_city", city)

image-20231227122436149

  • 读取全局属性发起请求

image-20231227125105769

案例二_环境变量

  • 使用 postman 关联技术,实现 添加员工 接口。

  • 登录成功,返回的 “令牌” 被 添加员工 接口依赖。

  • 思路:

    1. 发送登录请求(必须登录成功),获取响应结果
    2. 从 json 响应结果中,提取 data 值。拼接上 “Bearer ” 前缀。

    注意:Bearer单词不能拼错,首字母必须大写,只有一个空格
    3. 将拼接无误的 令牌,存入 环境变量。 从 “眼睛” 图标查看。
    4. 添加员工 接口,从 环境变量 中,提取 令牌。设置到请求头中,作为 Authorization 的 值。
    5. 填写 添加管理员 接口 其他信息(post、URL、请求体),发送请求。

  • 登录请求获取 token , 写入环境变量 :

1
2
3
4
5
6
7
8
9
//1.获取响应结果
var jsonData = pm.response.json()

//2.提取data的值,拼接“Bearer空格”前缀。形成完整的令牌
// var token ="Bearer "+jsonData.data.token // 是否需要拼接 "Bearer " 字符串,看实际情况决定
var token =jsonData.data.token

//3.将完整的令牌存入环境变量
pm.environment.set("env_token",token)

image-20231227130443575

  • 读取环境变量,发起请求

image-20231227132131450

思考

image-20231209133404020

Postman参数化

学习目标

  • 能够使用Postman进行接口参数化处理

参数化简介

  • 什么是参数化:将测试数据,组织到数据文件中,通过脚本的反复迭代,使用不同的数据,达到测试不同用例的目标。
  • 应用场景:一般在测试同一个接口的不同测试点时,只有测试数据不同。考虑使用参数化。

数据文件

数据文件简介

  • CSV:
    • 优点:数据组织格式简单
    • 缺点:
      • 不能测试 bool 类型。因为 postman 读取 csv后,将所有非数值类型数据,自动添加 ”“ 变为字符串
      • 不能存储复杂数据类型(元组、列表、字典)。
      • 不能实现 参数测试。
    • 应用场景:数据量较大,数据组织格式简单。
1
2
3
4
5
6
// xxxx.csv

mobile,sp
13012345678,联通
13712345678,移动
13838383388,移动
  • JSON:
    • 优点:
      • 可以测试 bool 类型
      • 能使用 复杂数据类型
      • 可以实现 参数测试。
    • 缺点:相同数据量,json文件要远大于 csv 文件。
    • 应用场景:数据量较少,数据组织格式复杂。需要进行参数测试!
1
2
3
4
5
6
// xxxx.json
[
{"username":"13012345678","password":"123456"},
{"username":"13500001111","password":"222444"},
{"username":"18922220000","password":"777888"}
]

读取数据文件

image-20231227135818045

读取数据

  • 根据 使用位置 不同,有两种方法。
    • 第一种:请求参数(请求行、请求头、请求体)中,使用 数据文件中 的数据
      • csv文件:;
      • json文件:
    • 第二种:代码(Tests)中,使用 数据文件中 的数据
      • 使用 postman 内置的 关键字 data,索引 字段名 或 键名
      • csv文件:data.字段名;
      • json文件:data.键名

CSV案例_查询手机运营商

  • 需求:批量查询 手机号 所属运营商,校验运营商数据正确性

  • 接口: http://cx.shouji.360.cn/phonearea.php?number=13012345678

  • 测试数据:

    • 手机号: 13012345678 运营商: 联通
    • 手机号: 13800001111 运营商: 移动
    • 手机号: 18966778899 运营商: 电信
  • 编写断言与数据文件

image-20231227141735086

1
2
3
4
5
6
// xxxx.csv

mobile,sp
13012345678,联通
13712345678,移动
13838383388,移动
  • 读取数据获得结果

image-20231227142156698

image-20231227142204774

JSON案例_查询手机运营商

1
2
3
4
5
[
{"phone":"13012345678","abc":"联通"},
{"phone":"13912345678","abc":"移动"},
{"phone":"18912345678","abc":"电信"}
]

image-20231227144505963

image-20231227144500115

思考

  1. 参数化解决的问题是什么?
  2. 如何引用数据文件批量执行测试用例?

Postman测试报告

学习目标

  • 掌握使用Newman生成测试报告

测试报告

  • 测试统计分析 + 测试结果确认
  • Newman生成测试报告

image-20231209134422927

Newman

Newman安装

  • Newman:基于nodejs,在命令行执行Postman脚本的插件
  • 安装nodejs
    • 校验:node -v
  • 安装newman插件
    • 安装n ewman
    • npm install -g newman
    • 校验 newman -v
    • 安装 newman-reporter-htmlextra
    • npm install -g newman-reporter-htmlextra

生成测试报告命令

  • 命令 :

    • newman run 测试集文件 -e 环境变量文件 -d 测试数据文件 -r htmlextra --reporter-htmlexport-export report.html

    • newman run 测试集文件.json -e 环境变量文件.json -d 测试数据文件.json -r htmlextra --reporter-htmlexport-export 测试报告.html

  • 命令说明:

    • run xxx.json:执行测试集文件
    • -e source:环境变量文件 , 非必须参数
    • -d source:测试数据文件, 非必须参数
    • -r htmlextra:生成测试报告类型
    • –reporter-htmlexport-export source:存放报告的路径

用例集的导入导出

用例集导出

image-20231227154033698

用例集导入

image-20231227154229824

环境文件的导出

image-20231227154922796

案例

  • 针对ihrm系统的登录接口进行参数化,并批量运行产出测试报告

  • 分析测试报告:

    • 总共运行了多少条测试用例?

    • 成功了多少条case?失败了多少条case?

    • 查看每一天case的请求数据是否正确引用了数据文件

    • 查看断言响应是否正确

    • 分析失败的case是什么原因造成的?

思考

  1. 请描述生成测试报告的步骤?
  2. newman run 用例集名称.json -e 环境文件名称.json -d 数据文件名称.json -r html --reporter-htmlexport-report.html
  3. 分析测试报告:查看用例的具体数据,分析失败原因

帝莎商城接口实战

登录接口

登录成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 响应状态码
pm.test("断言响应状态码为:200", function () {
pm.response.to.have.status(200);
});

// 指定字符串
pm.test("断言包含指定字符串: ok ", function () {
pm.expect(pm.response.text()).to.include("ok");
});

// 响应的数据 json 格式
pm.test("响应 json 格式数据的 msg 属性值为 ok ", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.msg).to.eql("ok"); // 期望响应数据的 msg 属性的值为指定的 "ok" 数据
});

image-20231227173523264

image-20231227173544561

image-20231227173611368

用户不存在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 响应状态码
pm.test("断言响应状态码为:400", function () {
pm.response.to.have.status(400);
});

// 指定字符串
pm.test("断言包含指定字符串: 用户名错误", function () {
pm.expect(pm.response.text()).to.include("用户名错误");
});

// 错误码
pm.test("断言错误码为 20000 ", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.errorCode).to.eql(20000);
});

// 响应的数据 json 格式
pm.test("响应 json 格式数据的 msg 属性值为 用户名错误 ", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.msg).to.eql("用户名错误"); // 期望响应数据的 msg 属性的值为指定的 "ok" 数据
});

image-20231227175530318

密码错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 响应状态码
pm.test("断言响应状态码为:400", function () {
pm.response.to.have.status(400);
});

// 指定字符串
pm.test("断言包含指定字符串: 密码错误", function () {
pm.expect(pm.response.text()).to.include("密码错误");
});

// 错误码
pm.test("断言错误码为 20000 ", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.errorCode).to.eql(20000);
});

// 响应的数据 json 格式
pm.test("响应 json 格式数据的 msg 属性值为 密码错误 ", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.msg).to.eql("密码错误"); // 期望响应数据的 msg 属性的值为指定的 "ok" 数据
});

image-20231227175632941

用例的批量执行

image-20231228092354525