- Published on
Postman全功能指南:从接口调试到自动化测试实战
- Authors
- Name
- Liant
Postman介绍
https://www.getpostman.com/
官网地址:https://www.getpostman.com/docs/
官方文档地址:https://go.pstmn.io/app-issues
问题反馈官方地址:https://github.com/postmanlabs
官方git地址:http://blog.getpostman.com/case-studies/
官方实例学习:http://blog.getpostman.com/
官方blog:https://www.getpostman.com/apps
官方下载地址:版本分别有:
chrome插件版本
mac版本
linux版本(32/64)
windows客户端版本(32/64)
https://www.npmjs.com/package/newman,本说明不涉及newman。
newman:介绍:
很好用的一款API/接口功能测试工具,很方便的塞数据,查看响应,设置检查点/断言,能进行一定程度上的自动化测试,但是不要指望它能代替你进行性能测试,一次批量执行太多太久的话容易崩溃掉。 有免费版、pro版、企业版三个版本。个人学习及日常工作免费版完全够用。 本系列介绍中,如无特殊说明,均以postman chrome插件版为例。
https://www.runoob.com/js/js-tutorial.html
注: POSTMAN里的各种语法是基于JS的,很容易上手;推荐学习网址:Postman安装
Chrom版本
方法1.Chrom应用商店直接安装,需要科学上网。 方法2.搜索下载postman 的crx扩展文件,把crx后缀修改成rar或者zip,然后解压,修改解压目录下的”_metadata”文件夹名为” metadata”,然后打开chrom扩展页面chrome://extensions/
,打开开发者模式,加载已解压的扩展,把刚刚解压后的扩展加载进去。 点击详细信息,在桌面创建快捷方式。 此种方法安装的postman可正常使用,但不能配合Postman Interceptor抓包使用,应该是谷歌商店不认此种方法安装的原因。
客户端版本
Postman官网,下载客户端版本,直接默认安装。安装完之后会在桌面创建一个快捷方式。 客户端版本与chrom版本不冲突,可以同时安装。客户端版本比chromapp版本多了编辑及调试功能,但是不支持请求URL中包含中文,需要encode一下才能使用。日常chrom版本够用。
IOS版本appstore里搜索安装。
linux版本未使用过,暂不介绍,欢迎补充。
注:postman官网可直接访问,不需要科学上网。
Postman Sendbox界面介绍
安装后首次打开postman,会提示你是否需要登录,登录的话可以云端保存你的收藏及历史记录,不登陆不影响使用。
进入后就是如下图所示的界面了。

我把postman主界面大概分为图示中的三个大黄框,代表不同的功能区域
左边:
请求历史栏
点击该处可看到所有使用postman发出的请求记录,在配合postmaninterceptor进行抓包时,抓取的请求记录也在该处显示。点击clear all可清除所有记录。

收藏夹
就是保存所有请求的地方。点击带+号那个图标 可创建新的文件夹,方便归类
用例文件夹
如图所示。需要注意的是大文件夹下还可以再创建一级子文件夹。如下图所示:

图中几个菜单的意思分别是:
1重命名
2编辑
3新建子文件夹
4复制一个当前文件夹
5导出当前文件夹下所有用例
6监控当前文件夹(免费版不可用)
7mock当前文件夹用例(免费版不可用)
8发布当前文件夹下接口用例文档
9删除

其他的按钮,用到了再说。
右上
标签栏
可以看待你当前执行的是那个接口用例
接口请求方法
目前支持: 15种请求方式,实际应用中常用到 GET、POST、PUT、DELETE这4中请求方法

接口请求URL
请求url,需要注意的是GET请求的参数是直接跟在URL后边的。
认证
某些接口需要认证。

报文头
请求报文头。 报文头有三列,Key是报文头参数列,Value是报文头参数值列,description是说明列

右侧的Presets是可以预先设置几组报文头,拼装报文的时候可以直接选中使用。Bulk Edit是文本编辑报文头。
报文体
请求报文体,GET请求下不可用。有四种报文体类型。

其中form-data和x-www-form-urlencoded两种类型是key-value格式的报文。Raw里可以自由选择报文格式,binary是自由选择文件作为报文体。

预处理脚本
预处理脚本,你可以理解为这里是在你接口请求之前执行代码的地方,支持JS语言。举例说明: 请求参数中有个参数time,参数值格式为YYYYMMDD24HHMMSS格式,每次请求时该time参数为当前时间,我们可以在预处理脚本这里直接生成一个当前时间,然后传给postman座位环境变量,在请求参数中引用这个变量,就可以了。如下图,上边是生成当前时间time,最后一句是把time存到环境变量里,这环境变量叫做Time。

{{Time}}
会是红色的。
如果环境变量中该变量已经有值,鼠标放上去,就会显示当前值。

这里只是简单的说了一种使用方法,更多功能,还请自行摸索
断言/检查点
有各种叫法,但是意思是一样的,可以理解为检查报文内容的地方, 支持JS语言。比如要判断响应报文中某个参数值等不等于预期值,就是在这里写代码。
Postman自带的接口用例中有示范如何使用,请自行摸索,多上网搜索,多练习,很快就会熟起来的。

下图是响应,上图中检验的就是这个res是不是等于0:

环境变量集
Postman中可以预先设置几组环境变量,使用的时候直接选择就行,比如测试、灰度、生产这三个环境的地址和请求里的参数值不一样,我们就可以把地址和参数值参数化,设置三个环境变量集,三个环境变量对应测试环境,生产环境,灰度环境。非常方便
设置环境变量
设置环境变量
发送请求
发送请求
保存
保存此时的请求报文信息
源代码
这是一个很有意思的地方,这里可以方便的把你的请求报文转换成各种程序语言,例如:

直接点击copy就能去代码中粘贴了。
右下
响应报文体
响应报文体、返回cookies、返回报文头、断言/检查点执行结果这四个是响应内容选择标签,点击就能看到对应内容
返回cookies
如果有,就返回。
返回报文头
如下图所示:

断言/检查点执行结果
12中的断言、检查点执行结果展示区域,如下图所示:

报文体展示方式
下图示例相同报文三种展示方式,一般使用pretty。



报文体展示类型
仅在Pretty模式下可用

该图标推测为自动换行图标~
报文体正文
httpstatus响应码及耗时


为复制图标,点击就复制响应报文体至剪切板,

为搜索图标,可以在响应报文中搜索制定内容。
Runner 介绍
概述
Runner是用来批量调用collection里某个文件夹里的全部接口的。 (注意,是文件夹内所有接口,可以是一级文件夹,也可是二级文件夹) 示意图 在Sendbox界面里左上角打开runner,runner界面如图所示

说明
历史记录
历史执行记录
导入

当前执行
执行详情
点击这个会跳到历史记录
选择用例集合
选择需要执行的用例集合
环境变量
选择执行时需要使用的环境变量
迭代次数
输入需要执行的次数 注意:在使用csv文件进行参数化时,最好有多少组数据,这里就填多少。
延时/间隔
每个请求之间的间隔
参数文件
在批量执行时,如果遇到想参数化的情况,在此处配置。举例: 一个登录请求为:http://127.0.0.1:80/login,请求方式为post,请求data为:
{
"account": "zhangsan",
"pwd": "123"
}
其中account和pwd分别是帐号、密码,在实际中,有一大批帐号需要登录,这时可以利用runner的参数化来解决。在本例中,需要把account和pwd的值参数化,首先在请求时先定义这两个值为分别变量{{user}}
和{{密码}}
如下:
{
"account": "{{user}}",
"pwd": "{{mima}}"
}
然后创建一个csv格式的文件,文件首行为两个变量名,其余各行值,如下图所示:

然后选中这个csv文件

点击preview,可以看到参数信息

然后就可以开始了。
监控
Pro收费版本才有的功能,本文不作介绍
newman
本教程不做介绍
doc文档
Runner的相关官方英文文档。
当前结果
会显示tests的执行结果
开始按钮
常用操作说明
环境变量
环境变量就是我们存放一组公共数据的地方,比如我有100个接口,三套环境(开发环境、测试环境、生产环境),我们没有必要把这100个接口根据三个环境分别写一套用例。只需要维护一套用例脚本,然后设置对应三个环境的变量就行了。 如下图所示:


这样对比应该能看出,我们在请求接口的时候,只需要把请求地址用参数 {{这里是地址}}
替换掉就行了。在测试的时候,测哪个环境就切换到哪个环境的环境变量组。 下图是我的请求:

另外,在postman的脚本里,还可以用postman.setEnvironmentVariable("key",value); 来直接设置环境变量,下面就会说到。 Pre-request Script 顾名思义,这是一个在请求前执行脚本的地方。 举例说明: 还是刚刚那个接口,请求时需要带上YYYYMMDD格式的当天日期作为参数值。那么我们就可以在这里用JS语法生成一个当前时间nowtime,然后把这个nowtime用上边说道的postman.setEnvironmentVariable(key,value)设置为环境变量NOWTIME,在请求的时候,在引用这个变量NOWTIME就行了。 如下图所示是我的测试接口

常用语法
//获取一个环境变量
pm.environment.get("variable_key");
//获取一个全局变量
pm.globals.get("variable_key");
//获取一个普通变量
pm.variables.get("variable_key");
//设置一个环境变量
pm.environment.set("variable_key", "variable_value");
//设置一个全局变量
pm.globals.set("variable_key", "variable_value");
//清空一个环境变量
pm.environment.unset("variable_key");
//清空一个全局变量
pm.globals.unset("variable_key");
//发送一个请求
pm.sendRequest("https://postman-echo.com/get", function (err, response) {
if(err){
console.log(err);
}else{
console.log(response.json());
}
});
/*pm.globals*/
//检测全局变量是否包含某个变量---返回布尔值
pm.globals.has(variableName:String)
//获取全局变量中的某个值
pm.globals.get(variableName:String)
//为某个全局变量设置值
pm.globals.set(variableName:String, variableValue:String)
//销毁某个全局变量
pm.globals.unset(variableName:String)
//清除全局变量
pm.globals.clear()
//将全局变量以一个对象的方式全部输出
pm.globals.toObject():function → Object
其他语法
//获取请求body某个字段值
request.data["key"]=="value"
//获取请求headers某个字段值
request.headers["key"]=="value"
//获取请求方法
request.method
//获取请求地址
request.url
//获取get请求的参数
request.url.query.members
//将请求参数转化为json对象
—--post:JSON.parse(request.data)
—--get:JSON.parse(request.url.query.members)
//将字符串进行shal加密
CryptoJS.SHA1(“string”)
//将字符串进行md5加密
CryptoJS.MD5(“string”)
Tests
常用语法
设置环境变量
pm.environment.get("key", "value");
设置全局变量
pm.globals.set("variable_key", "variable_value");
断言
pm.test("响应状态码为200", function () {
pm.response.to.have.status(200);
});
pm.test("响应数据中包含json_key1", function () {
pm.expect(pm.response.text()).to.include("json_key1");
});
pm.test("响应中的url值正确", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.url).to.eql("http://10.0.6.2/post");
});
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
pm.test("响应头信息中包含Content-Type", function () {
pm.response.to.have.header("Content-Type");
});
pm.test("响应时间小于300ms", function () {
pm.expect(pm.response.responseTime).to.be.below(300);
});
pm.test("Status code name has string", function () {
pm.response.to.have.status("Created");
});
其他语法
//获取响应Cookies
responseCookies
//获取响应body
responseBody
//将响应体转化为json对象
JSON.parse(responseBody.data)
//将响应体转化为json字符串
JSON.stringify (responseBody.data)
关联
以OA登录为例:
先请求接口获取登录code,再用code值去请求token接口,以获取token
1、通过接口获取code
(1)、接口如下
curl --location --request POST 'http://api-oa.test.com/api/user/auth-code' \
--header 'X-Client-Id: oa' \
--header 'X-Timestamp: 1651050337' \
--header 'X-Random: 6417' \
--header 'Content-Type: application/json' \
--header 'X-Signature: 9f448334198d0db1f42c72846528a994' \
--header 'Cookie: API_SESSID=vo17i0ifhlodmln5hk6cc9uv4n; _csrf_api=435b921e89ea007573acdb6e3d07a9f62d18dcbbc364507a975101159528c2b4a%3A2%3A%7Bi%3A0%3Bs%3A9%3A%22_csrf_api%22%3Bi%3A1%3Bs%3A32%3A%22xVHmwETTMKww5tKKVqLM0P2RAu0DWWCE%22%3B%7D' \
--data-raw '{
"number": "10084"
}'
(2)、Pre-request Script代码
var time = Math.round(new Date()/1000);
var str_ranmod = Math.ceil(Math.random() * 10000);
var sign_str="oa" + "_q0LEyk5D8RxJX4O_fOh8tIahXjq2pt4" + time.toString()+str_ranmod.toString();
var sign_md5 = CryptoJS.MD5(sign_str).toString()//.toUpperCase();
pm.environment.set("sign_md5",sign_md5);
pm.environment.set("time",time);
pm.environment.set("str_ranmod",str_ranmod);
(3)、tests代码如下
var body=JSON.parse(responseBody);
console.log(body);
var code = body.data.code;
var client_id = body.data.oauth_client.client_id;
var redirect_uri = body.data.oauth_client.redirect_uri;
console.log(code)
pm.environment.set("code",code);
pm.environment.set("client_id",client_id);
pm.environment.set("redirect_uri",redirect_uri);
2、通过接口获取access_token,请求参数中需要带上code
(1)、接口如下
curl --location --request POST 'http://oauth-oa.test.com/token' \
--header 'Content-Type: application/json' \
--data-raw '{
"grant_type": "authorization_code",
"code": "1ee94e2941c12159ede6d6e371bc8dbd63885570",
"client_id": "oa",
"client_secret": "_q0LEyk5D8RxJX4O_fOh8tIahXjq2pt4",
"redirect_uri": "http://oa.test.com/login/"
}'
(2)、tests代码如下
var body=JSON.parse(responseBody);
console.log(body);
var access_token = body.access_token;
var token_type = body.token_type;
var Authorization = token_type + " " + access_token
console.log(Authorization);
pm.environment.set("Authorization",Authorization);