首页>软件资讯>常见问题

常见问题

接口测试_工具篇Postman

发布时间:2023-03-07 14:59:47人气:366

Postman工具.png

一、Postman简介和安装

简介: Postman 是一款非常流行的接口调试工具,它使用简单,而且功能也很强大。不仅测试人员会使用,开发人员也经常使用。


特征:

1)简单易用的图形用户界面

2)可以保存接口请求的历史记录

3)使用测试集 Collections 可以更有效的管理组织接口

4)可以在团队之间同步接口数据

安装:

联系本站客服,下载安装,傻瓜式安装,过程略

二、Postman高级用法

1、管理测试用例

创建 collections(用例集)

创建子目录

创建请求

用例集导出(Export)导入(Import)

2、全局变量和环境变量

全局变量:


定义:在 Postman 全部生效的变量,全局唯一。不可重复定义的变量。命名可以为:glb_名称。

设置:

代码设置格式: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}}

环境变量:


定义:在特定环境(生产环境、开发环境、测试环境)下,生效的变量,在本环境内唯一。)命名可以为:env_名称。

注意:

1)一个变量只能属于某个环境,在某一个环境中变量不可重复定义

2)在环境与环境之间可以重复的变量

3)一个环境可以包含多个环境变量

4)常见环境分类:开发环境、测试环境、生产环境

设置:

代码设置格式: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}}

3、请求前置脚本

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


假设场景: 调某接口时,要输入“时间戳”,如果输入的“时间戳”的绝对值,超过标准时间10分钟,则不允许调用。


时间戳: 对应绝对时间,从1970年1月1日 00:00:00 到现在 所经历的秒数。一天为86400秒,则距现在为51年6月9天,即1624665600秒。


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


实现步骤:


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

拿到时间戳:var timestamp = new Date().getTime()

将时间戳设置到 全局变量:pm.globals.set("glb_timestamp", timestamp)

2.png

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

3)查看写入的变量

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

3.png

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

postman 前置脚本工作原理:


postman 界面:

组织http请求:方法、url、头、体

在 Test 中添加断言代码

在 Pre-request Script 中添加请求前置脚本

在 Test Results(或Tests) 中查看断言结果

Send 发送给 postman 内部

postman 内部:

解析请求前置脚本代码 set glb_timestamp 全局变量 {{glb_timestamp}}

分析 http请求方法、url、头、体 ......

执行断言代码,得到断言结果

服务器:

解析 http请求

回发http响应

4、关联

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


实现步骤: 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)

4.png

3)点击 Send按钮,发送请求,查看设置的全局变量。

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

5.png

5、断言

简介: postman 断言借助 JavaScript-js语言编写代码,写在 Tests 标签页里,自动判断预期结果与实际结果是否一致。


postman 断言工作原理:


postman 界面:

组织http请求:方法、url、头、体

在 Test 中添加断言代码

在 Test Results(或Tests) 中查看断言结果

Send 发送给 postman 内部

postman 内部:

分析 http请求方法、url、头、体 ......

执行断言代码,得到断言结果

服务器:

解析 http请求

回发http响应

postman常用断言:


Status code:Code is 200:断言响应状态码

Response body:Contains string:断言响应体是否包含某个字符串

Response body:Is equal to a string:断言响应体是否等于某个字符串(对象)

Response body:JSON value check:断言 JSON 数据

Response headers:Content-Type header check:断言响应头

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:匿名函数function ()。pm.response.to.have.status(200):postman 的响应结果中应该包含状态码 200。200 ——> 预期结果!

代码格式二:tests["Status code is 200"] = responseCode.code === 200;

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" ——> 预期结果。可以修改

代码格式二:tests["Body matches string"] = responseBody.has("string_you_want_to_search");

示例:tests["断言响应体包含“操作成功”"] = responseBody.has("操作成功!");

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" ——> 预期结果。可以修改。

代码格式二:tests["Body is correct"] = responseBody === "response_body_string";

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 = pm.response.json();中var jsonData是用js语法定义一个变量名为jsonData的变量。pm.response.json()代表响应的json结果。

示例1:

pm.test("断言响应结果success的值为true", function () { var jsonData = pm.response.json();

pm.expect(jsonData.success).to.eql(true); });

示例2:

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

pm.expect(jsonData.code).to.eql(10000); });

示例3:

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

pm.expect(jsonData.message).to.eql("操作成功!"); });

代码格式二:

var jsonData = JSON.parse(responseBody);

tests["Your test name"] = jsonData.value === 100;

示例:

var jsonData = JSON.parse(responseBody);

tests["断言相应结果success的值为true"] = jsonData.value === true;

5、断言响应头


名称: Response headers: Content-Type header check


示例:断言响应头


代码格式一:

pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); }); 

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");});

代码格式二:tests["Content-Type is present"] = postman.getResponseHeader("Content-Type");

示例:tests["Content-Type is present"] = postman.getResponseHeader("Content-Type","application/json;charset=UTF-8");

6、数据驱动

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


数据文件简介: CSV、JSON


CSV:


优点:数据组织形式简单,适用于大量数据的场合

缺点:

1)不支持bool类型数据(数据被postman读入后,自动添加“”包裹bool值)

2)不支持多参、少参、无参、错误参数的接口测试

3)不支持复杂数据类型(如:嵌套字典、列表等)

JSON:


优点:

1)支持bool类型

2)支持多参、少参、无参、错误参数

3)支持复杂数据类型

缺点:对于相同数据量,json数据文件大小远大于CSV文件

导入外部数据文件: CSV文件、JSON文件


CSV文件:


1、创建 xx.csv 文件

2、将数据写入到 csv 文件中

第一行:写入的是数据对应的“字段名”

从第二行向后依次是对应的数值,数据间用英文逗号隔开。

3、在 Postman 中,选中使用数据文件的用例集,导入数据文件

1)点击用例集名称,使用Run按钮,进入“Runner”页面

2)使用“Select File”按钮选择 xx.csv文件

3)点击预览(Preview)按钮,校验数据文件是否正确

JSON文件:


1、创建 xx.json 数据文件

2、在数据文件中,按json语法写入json数据。postman要求,json格式的数据文件,数据内容的最外层,必须是[ ]。内容所有的数据用{}存储。(建议:使用json.cn在线网站编写)

3、在 Postman 中,选中使用数据文件的用例集,导入数据文件

1)点击用例集名称,使用Run按钮,进入“Runner”页面

2)使用“Select File”按钮选择 xx.json 文件

3)点击 预览(Preview)按钮,校验数据文件是否正确

读取数据文件数据:


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


第一种: 请求参数(请求行、请求头、请求体)中,使用数据文件中的数据


使用{{}}包裹csv文件 字段名或json文件中的key

如:{{username}}或{{password}}

第二种: 代码(断言、请求前置脚本)中,使用数据文件中的数据


需要借助 postman 提供的关键字data点csv文件的字段名或json文件的key

如:data.username 或 data.password

特性:


1)postman会循环一行一行的读取{}中的数据

2)postman会自动给所有非数值数据,添加 "" 进行包裹。建议书写json数据时,无论是不是字符串,都可以用""包裹value的值

案例:


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

接口: 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请求。

生成测试报告:

1)批量执行测试用例(借助数据文件)

2)导出 测试用例集(建议与数据文件放在一起)

3)终端(cmd)执行测试报告命令:newman run 用例集名称.json -e 环境文件.json -d 数据文件名.csv/.json -r html --reporter-html-export 报告名称.html

7、批量执行测试用例

1)进入 Runner 页面,选择要批量执行的用例集

2)自动选中所有http请求,设置迭代次数、延时、引入外部文件

3)点击 Run 批量执行测试用例,完成批量执行

8、测试报告

安装插件newman:


1)先下载安装Node.js:https://nodejs.org/en/

2)打开cmd,输入node,如果没有报错,而是显示“>”,说明node安装成功。

3)安装newman,打开cmd,输入npm install -g newman (npm cache clean --force)

4)通过查看newman版本测试安装是否成功,打开cmd,输入newman -v,出现版本信息

5)newman基于postman生成html测试报告,所以还需安装html插件(必须和newman在同一路径下):nmp install newman-reporter-html

使用newman生成测试报告:


1)批量执行测试用例集。(确认无误)

2)导出Export用例集。(得到xxx.json文件)(建议与数据文件放在一起)

3)在终端(cmd)中执行命令,生成测试报告

# 现在 终端中,测试一下。

newman run xxxx.json

# 完整的命令

newman run xxxx.json -e 环境变量文件 -d 外部数据文件 -r html --reporter-html-export 测试报告名.html

# 示例:

newman run 批量执行测试用例.postman_collection.json -r html --reporter-html-export 我的第一个测试报告.html

# 如果添加 -r html 就报错!说明: newman-reporter-html 安装失败!

三、Postman接口测试实践

以某公司的人力资源管理系统接口测试为例,来具体说明Postman在具体项目中的实践。


1、项目环境说明

目标:熟悉项目功能以及业务流程,了解项目架构

项目简介:功能模块、技术架构

功能模块:组织管理、组织管理、员工管理、招聘管理、劳动合同、培训管理、考勤管理、绩效管理、福利管理、工资管理

技术架构:前端,后端,技术架构图,业务流程图等

2、初始化项目环境

新建用例集 Collection:

1)用例集名称可以用项目名称,如:xxx项目测试用例集

2)用例集中,按照模块建立文件夹folder,folder名称可以就用模块名称,如:登录模块

3)功能模块中,按照接口建立该模块的接口请求等,也可以继续新建folder

创建环境变量:将生产环境与测试环境分开。如:线上地址和测试地址,base_url等。

6.png

3、设计编写测试用例

以登录模块和员工管理模块为例,来说明用Postman设计编写接口测试用例。


步骤:


首先,根据开发的接口文档整理出接口测试用例文档,并过审。

然后,根据过审的接口测试用例文档到Postman中编写接口测试用例。

登录模块:


接口共性分析:

1)由于是同一个接口,因此他们的请求方法、URL、请求头完全一致

2)请求体(请求数据),各不相同

3)预期结果,大致分为3类:操作成功——登录成功、多参、全部参数;用户名密码错误——其他情况;抱歉系统繁忙——无参。

实现接口用例编写:

登录模块:登录成功、用户名为空、用户名包含特殊字符、用户名超过11位(12位)、用户名不足11位(10位)、用户名错误、用户名未注册;密码为空、密码包含特殊字符、密码为1位、密码为100位、密码错误;必选参数(全部参数)、多参、少参(少mobile)、无参、参数错误(mobile参数名错误)等。用例编写就集中在Body和Tests中,不同的只是Body中的参数数据不一样和断言内容的不同。

以登录成功接口为例:

1)添加请求(Add Request): 请求方法为POST;接口地址为:{{base_url}}/api/sys/login;请求头(Headers)参数:KEY为Content-Type,VALUE为application/json;图片请求体参数为:JSON格式的数据,mobile和password的值。图片

2)添加断言:在Tests界面添加响应状态码断言和JSON响应断言图片

员工管理模块:


步骤分析:


1)登录成功,返回的“令牌”,被 添加、查询、修改、删除 员工接口依赖。

2)添加员工成功,返回“员工id”,被 查询、修改、删除 员工接口依赖。

以上依赖关系,可借助postman关联和环境变量来实现!

步骤实施:


提取并使用令牌:

1)发送http登录请求,在响应体中得到data值

发送请求:


2)将data值拼接“Bearer”和“空格”,组成一个合法令牌

3)将拼接后的令牌设置在环境变量中(在Tests中通过代码写入)

拼接合法令牌,并设置环境变量:

代码:


// 拼接 data 的值,添加 Bearer 和 空格,组成合法令牌


// 获取响应体,保存在 jsonData变量中

var jsonData = pm.response.json()

// 提取 data 值,保存在 tmp_token中

var tmp_token = jsonData.data


// 拼接 Bearer 和 空格 到 data 值的前面,"Bearer" + " " + tmp_token

pm.environment.set("env_token", "Bearer" + " " + tmp_token)

4)在添加员工的Headers中调用令牌(Authorization)发送请求图片

添加员工:保证手机号的唯一性,如果手机号有添加过则修改新的未添加过的手机号

提取添加员工的id:

1)获取添加员工成功的data下面的id值

2)将员工id,设置环境变量(代码写入Tests中)

3)发送send之前,注意先修改手机号,保证手机号唯一!

4)点击“眼睛”查看,确认环境变量添加成功 提取新增员工id,并设置环境变量和添加断言:

代码:


// 获取响应体,保存到jsonData变量中

var jsonData = pm.response.json()


// 提取 data 值,保存tmp_id 变量中

var tmp_id = jsonData.data.id


// 设置 tmp_id 到环境变量中

pm.environment.set("env_emp_id", tmp_id)


pm.test("Status code is 200", function () {

    pm.response.to.have.status(200);

});


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("操作成功!");

});

查询员工:路径参数,url/:target

查询员工请求Params:

查询员工请求Headers:

查询员工请求Tests:

断言代码:


pm.test("Status code is 200", function () {

    pm.response.to.have.status(200);

});


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("操作成功!");

});


pm.test("断言data中id的值为 1447229608624652288", function () {

    var jsonData = pm.response.json();

    pm.expect(jsonData.data.id).to.eql(pm.environment.get("env_emp_id"));

});

4、批量运行测试用例

1)给 每个http请求添加 断言(成功断言)

2)点击用例集名称-run-进入Runner界面-点击批量执行

3)导出用例集(用例集-Export)

5、生成测试报告

1)导出环境文件(environments-环境-Export)

2)将环境文件 与 测试用例集文件,放置在同一个目录下

3)cmd终端中执行命令:newman run 批量执行后导出的测试用例集文件.json -e 环境文件.json -d 外部数据文件 -r html --reporter-html-export 测试报告名.html



上一条:接口工具Postman知多少

下一条:实用工具Postman快速入门