接口测试02-Postman的使用

Postman 断言

  • postman 断言借助js 语言编写代码,自动判断预期结果与实际结果是否一致。
  • 断言 代码写在 Tests 的标签中。

1. Postman 常用断言

1.1 断言响应状态码

Status code: Code is 200
1)在 Tests 标签中,选中 Status Code:code is 200, 生成对应代码
2)适当调整 test() 方法参数1,和 匿名函数中的 预期结果。
3)点击 send 按钮,发送请求,执行断言代码。
4)查看断言结果。

// 断言响应状态码 是否为 200
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

pm:代表 postman 的一个实例
test():是 pm实例的一个方法。有两个参数
    参数1:在断言成功后,给出的文字提示。可以修改。"Status code is 200"
    参数2:匿名函数。
pm.response.to.have.status(200); 
// 意思:postman 的响应结果中应该包含状态码 200
        200 ——> 预期结果!
1.2 断言响应体是否包含某个字符串

Response body: Contains string

// 断言响应体包含指定字符串
pm.test("Body matches string", function () {
  pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});

pm:postman的一个实例
test(): postman实例的方法,有两个参数
    参1:断言后显示的文字提示信息,可改。
    参2:匿名函数
pm.expect(pm.response.text()).to.include("string_you_want_to_search"); 
// 意思:pm 期望 响应文本 中,包含 xxxx 字符串。
    "string_you_want_to_search" ——> 预期结果。 可以修改
1.3 断言响应体是否等于某个字符串(对象)

Response body: Is equal to a string

// 断言 响应体 等于某个字符串(对象)
pm.test("Body is correct", function () {
    pm.response.to.have.body("response_body_string");
});

pm.response.to.have.body("response_body_string");

// 意思是,pm 的 响应中应该有 响应体 xxx
"response_body_string" ——> 预期结果。 可以修改
1.4 断言JSON数据

Response body: JSON value check

// 断言json的响应结果
pm.test("Your test name", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.value).to.eql(100);
});
// var jsonData: 用js语法定义一个变量。jsonData 就是变量名
// pm.response.json();  代表响应的json结果

/* 举例:response.json();
{
    "success": true,
    "code": 10000,
    "message": "操作成功!",
    "data": "95c78d75-721c-40fb-b2d5-742fea42cbd5"
}
*/
pm.expect(jsonData.value).to.eql(100);
// 意思:pm 预期 json结果 key对应的值 等于 xxx
// to.eql(100); 中的 100 代表预期结果。可以修改的。

示例:
// 断言json的响应结果-success的值为true
pm.test("断言响应结果success的值为true", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.success).to.eql(true);
});

pm.test("断言响应结果中code的值为10000", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.code).to.eql(10000);
});

pm.test("断言响应结果中message的值为 操作成功", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.message).to.eql("操作成功!");
});
1.5 断言响应头

Response headers: Content-Type header check

// 断言响应头
pm.test("Content-Type is present", function () {
    pm.response.to.have.header("Content-Type");
});
// pm 的响应 头中包含 Content-Type

// 示例:可以在 header 中,添加 响应头中的 key 对应的 value 判定。用 ,隔分。
// 断言响应头
pm.test("Content-Type is present", function () {
    pm.response.to.have.header("Content-Type", "application/json;charset=UTF-8");
});

全局变量和环境变量

1. 全局变量

  • 概念:在 Postman 全局生效的变量,全局唯一
  • 设置:
    代码设置:pm.globals.set(“全局变量名”,全局变量的值)
     pm.globals.set("glb_age", 100)
  • 获取:

    代码获取: var 接收值的变量 = pm.globals.get(“全局变量名”)

     var ret = pm.globals.get("glb_age")  // ret 的值为 100

  请求参数获取:(postman界面获取): {{全局变量名}}

     {{glb_age}}

2. 环境变量

  • 概念:在 特定环境(生产环境、开发环境、测试环境)下,生效的变量,在本环境内唯一。


  • 设置:
    代码设置:pm.environment.set("环境变量名", 环境变量值)
      pm.environment.set("env_age", 99)
  • 获取:
    代码获取:var 接收值的变量 = pm.environment.get("环境变量名")
      var ret = pm.environment.get("env_age")  // ret 的值为 99

  请求参数获取(postman界面获取):{{环境变量名}}

      {{env_age}}

Postman 请求前置脚本

在 send 按钮点击后,请求前置脚本代码,第一时间被执行。在 postman 内部实际 http请求之前。

案例:

调用百度首页接口,传时间戳给服务器

实现步骤:
1) 在 Pre-request Script 标签页中,添加代码。拿到时间戳,写入全局变量

    // 拿到时间戳
    var timestamp = new Date().getTime()
    // 将时间戳设置到 全局变量
    pm.globals.set("glb_timestamp", timestamp)

2)点击 Send 按钮,发送请求。请求发送前执行 上述代码。写入全局变量
3)查看写入的变量



4)在 请求参数(界面)中,使用全局变量。{{全局变量名}}



5)在 postman的 控制台,查看 发送的 http请求

Postman 关联

应用于 多个 http请求之间,有数据关联、或依赖关系时。

1. 实现步骤

A接口 依赖 B接口 的数据
1)向B接口发送http请求,获取数据
2)将数据 设置 至 全局变量(环境变量)中
3)A 接口 获取 全局变量(环境变量)中 数据值,进行使用。

案例:

请求 获取天气接口, 提取响应结果中的 城市, 将城市名,给百度搜索接口使用。

实现步骤:
1)创建 用例集,分别创建 查询天气 请求 和 百度搜索的请求



2)在查询天气请求 Tests 中,编写代码 获取 城市名,写入全局变量

    // 获取 全部响应结果
    var jsonData = pm.response.json()
    // 从响应结果中 获取 城市名
    var city = jsonData.weatherinfo.city
    // 将城市名写入到全局变量
    pm.globals.set("glb_city", city)

3)点击 Send 按钮,发送 请求,查看设置的全局变量。(可以先创建全局变量或者局部变量,就不需要先点击发送请求了,直接批量执行用例即可)


4)修改 百度搜索请求,使用全局变量,按 城市名进行搜索。
http://www.baidu.com/s?wd={{glb_city}}

批量执行测试用例


Postman参数化

当 http请求,使用的 数据有较高相似度,相同的请求时,考虑使用参数化(将数据组织到数据文件中)。

1. 数据文件简介

CSV
- 优点:
数据组织形式简单,适用于大量数据的场合。
- 缺点:
1)不支持 bool类型数据。(数据被 postman读入后,自动添加 “” 包裹bool值。)
2)不支持 多参、少参、无参、错误参数 的接口测试。
3)不支持复杂数据类型。(如 嵌套字典、列表等)
JSON:
- 优点:
1)支持 bool 类型。
2)支持 多参、少参、无参、错误参数。
3)支持复杂数据类型。
- 缺点:
- 对于相同数据量,json数据文件大小远大于 CSV文件。

2. 导入外部数据文件

2.1 CSV文件

1)创建 xxx.csv 文件。
2)将数据写入到 csv文件中。
第一行 写入 的是 数据对应的 “字段名”。
从第二行向后依次是对应的数值,数据间用 英文逗号隔分。




3)在 Postman 中,选中使用数据文件的 用例集,导入数据文件。
  a. 点击用例集名称,使用 Run 按钮,进入 “Runner” 页面。
  b. 使用 “Select File” 按钮选择 xxx.csv 文件。
  c. 点击 预览按钮,校验数据文件是否正确。



2.2 JSON文件

1)创建 xxx.json 数据文件
2)在 数据文件中,按json 语法写入json数据。postman要求,json格式的数据文件,数据内容的最外层,必须是 [ ] 。内部所有的数据用 {} 存储。( 建议:使用 json.cn 在线网站编写。)
3)在 Postman 中,选中使用数据文件的 用例集,导入数据文件。
  a. 点击用例集名称,使用 Run 按钮,进入 “Runner” 页面。
  b. 使用 “Select File” 按钮选择 xxx.json 文件。
  c. 点击 预览按钮,校验数据文件是否正确。


3. 读取数据文件数据

根据使用数据 位置 不同,有两种获取数据文件中数据的方法。

  • 第一种:请求参数(请求行、请求头、请求体)中,使用 数据文件中 的数据 使用 {{}} 包裹 csv 文件 字段名 或 json 文件中的 key
    如: {{username}} 或 {{password}}
  • 第二种:代码(断言、请求前置脚本)中,使用 数据文件中 的数据,需要借助 postman 提供的 关键字data 点 csv 文件的字段名 或 json文件的 key
    如: data.username 或 data.password

案例

需求:批量查询手机号归属地、所属运营商,校验运营商数据正确性
接口: http://cx.shouji.360.cn/phonearea.php?number=13012345678
测试数据:
手机号: 13012345678 运营商: 联通
手机号: 13800001111 运营商: 移动
手机号: 18966778899 运营商: 电信

1)测试单个接口,参数和 响应体 数据对应关系。


2) 写好数据文件,按 csv 或 json 对应语法的语法格式组织数据。

3)替换 上述用例中的 两处:
归属地:在 代码中。 用 data.字段名 替换
手机号:在 查询参数中。 用 {{字段名}} 替换。
4)强调:一旦替换完成,Send 就不再能正常获取 响应数据。(数据必须从数据文件中读取,才能正常发送请求,Send 不具备读取数据文件的功能)

5)选择使用数据文件的用例集, 进入 Runner 页面。导入数据文件。运行。

6)如果有异常,借助 postman 的控制台,查看。


小结:借助 数据文件,实现 “数据驱动”。—— 有多少条数据,对应就有多少个 http请求。

Postman 测试报告

1. 安装newman

需要先安装node.js
npm install -g newman
npm install -g newman-reporter-html

2. 使用newman生成测试报告

步骤:
1)批量执行测试用例集。(确认无误)
2)导出 Export 用例集。(得到 xxxx.json文件)
3)在 终端 中 执行命令,生成测试报告
完整的命令
newman run xxxx.json -e 环境变量文件 -d 外部数据文件 -r html --reporter-html-export 测试报告名.html
示例:
newman run 批量执行测试用例.postman_collection.json -r html --reporter-html-export 我的第一个测试报告.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容