Postman是访问各种API的客户端。它的强大之处在于其允许在对某一个request访问的之前和之后分别运行自定义的一段Javascript脚本,这样直接就完成了一个chain request的效果,可以将数条request连结成一个流程完成一体化测试。这在很多的API操作中都是极其有用的,所以这里有必要总结一些常用语句。
Script workflow 脚本执行流程
collection pre-request script -> folder pre-request script -> request pre-request script -> collection test -> folder test script -> request pre-request test
- pre-request脚本,是在对API进行请求之前的脚本,一般用于动态生成参数、JSON数据包、链接地址等。
- test脚本,其实更应该叫post-request,实在完成API访问并得到其response回应之后运行的脚本,一般用于获取response的内容,用于之后对于别的资源的请求,如获取页面标题和内容等。
Requirements 运行脚本要求
需要注意,pre-request脚本,在里面直接写代码就可以了,但是test脚本需要在某个指定的函数pm.test(…)中执行才会被识别,且作为test脚本运行。如下图:
pm.test()中第一个参数是测试描述(会在测试结果栏显示,应和其它测试描述做以区分),第二个参数是一个函数,具体执行代码都在这个函数中运行。
另外,pm对象是Postman的主要对象,所有的内置函数,数据调用等,都需要通过它来实现。
Code Snippets 常用语句
一般会在脚本编写栏的右边都会有常用语句片段,点击以下就会出来代码,但是一开始不太了解的话点出来其实也看不懂。如下图:
官方文档解释的各种函数调用链接在这里:Postman Sandbox API
以下是常用代码片段:
// 获取response返回内容
var res = responseBody; // 是字符串格式
// 获取环境变量
var v = pm.environment.get(“variable_key”);
// 获取全局变量
var gb = pm.globals.get(“variable_key”);
// 获取普通变量
var nm = pm.variables.get(“variable_key”);
// 设置环境变量
// 只能存储字符串,如果是对象的话则无法在下次运行时获取到内容
// 如需要存储JSON数据,可以用JSON.stringify(…)存储,再用JSON.parse(…)转化为对象使用
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) {
console.log(response.json());
});
// Javascript 获取变量类型
console.log( typeof pm.enviroment );
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
Pre-request Script 预处理脚本
发送请求之前往往需要准备数据,比如设置header中参数或者计算签名。
使用Pre-request Script可以编写一些准备数据。参考官方文档:Pre-request scripts
常用的准备工作有:
- 获取环境变量
- 环境变量赋值
- 发送一个请求
- 拼接组合提交request请求所需要的参数,比如authentication code。
常用的语句如下:
// 获取环境变量
var v = pm.environment.get("variable_key");
// 获取全局变量
var gb = pm.globals.get(“variable_key”);
// 获取普通变量
var nm = pm.variables.get(“variable_key”);
// 设置环境变量
// 只能存储字符串,如果是对象的话则无法在下次运行时获取到内容
// 如需要存储JSON数据,可以用JSON.stringify(…)存储,再用JSON.parse(…)转化为对象使用
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) {
console.log(response.json());
});
// 获取毫秒级时间戳
var timestamp1 = Math.round(new Date().getTime());
// 获取秒级时间戳
var timestamp2 = Math.floor(new Date().getTime()/1000);
// md5加密
// 获取环境变量password
var tmp = pm.environment.get(“password”);
// 加密
var m = CryptoJS.MD5(tmp).toString();
// 加密后的值写入password
pm.environment.set(“password”, m);
// 设置一个1到4的随机整数,字段名是number,parselnt 是强制转换为整数
pm.globals.set(“number”,parseInt(4*Math.random())+1);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 获取毫秒/秒级时间戳演示
- md5加密演示:
问题:一个登录接口,password需要md5加密后的值
则:在Pre-request Script中拿到环境变量中password的值,进行md5加密,再将加密后的值保存进password变量。
pre脚本执行后,可看到运行后的环境变量password已经是加密后的值
也可在postman console(点击左上角View - Show Postman Console或使用快捷键Alt+Ctrl+C)中查看Request Body
小结:
当postman的请求body或header中使用到了变量,有什么方法可以知道请求发送出去的实际值是什么?
- 通过运行后的环境变量查看
- 通过postman console查看
- 通过fiddler等抓包查看
Test Script 测试脚本
测试脚本是在request之后,对Response的返回值进行下一步处理的脚本
参加postman 官方:Test scripts
参加postman 官方:Test examples
常用的处理有:
- 接口断言,保证用例可回归
- 接口返回值数据的处理
- 可以对环境变量赋值
- 读取response回复的数据,存为环境变量
常用的语句如下:
// 获取response headers中某一个值
ctype = postman.getResponseHeader("Content-Type");
// 获取response body的全部内容
text = pm.response.text();
// 获取response返回的全部JSON
json_data = pm.response.json();
// 获取JSON中某一个值,比如name的值:
var myName = json_data.name;
// 检查一个JSON值
var data = JSON.parse(responseBody);
tests[“Your test name”] = data.value === 100;
// XML转JSON
var jsonObject = xml2Json(responseBody);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
常用断言方法如下,更多详见postman官方:Test scripts:
断言响应时间
// 断言响应事件小于200ms
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
- 1
- 2
- 3
- 4
断言状态码
// 断言状态码200-202区间
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([200,202]);
});
// 断言状态码等于200
pm.test(“Status code is 200”, function () {
pm.response.to.have.status(200);
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
断言response的body中是否包含字符串
// 断言响应body中包含字符串:string_you_want_to_search 可替换为需要检验的内容
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
// 例:需要校验body是否包含"OK"
pm.test(“Body matches string”, function () {
pm.expect(pm.response.text()).to.include(“OK”);
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
断言response的header中是否包含Content-Type
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
- 1
- 2
- 3
断言响应中的字段等于某个值
// 断言响应中"message" = ok"
pm.test("message test", function () {
var jsonData = pm.response.json();
pm.expect(jsonData["message"]).to.eql("ok");
});
- 1
- 2
- 3
- 4
- 5
断言响应中的字段不等于某个值
// 断言响应中"message" != bad"
var jsonData = JSON.parse(responseBody);
tests["message不为bad"] = jsonData["message"] != "bad";
- 1
- 2
- 3
断言响应中的列表长度
// 断言响应中"list"的字段长度
pm.test("data list test", function () {
var jsonData = pm.response.json();
pm.expect(jsonData["data"].length).to.eql(41);
});
- 1
- 2
- 3
- 4
- 5
断言响应中的列表中第几个元素的字段值
// 断言响应中"list 0的"的time字段的值
pm.test("data list 0 test", function () {
var jsonData = pm.response.json();
pm.expect(jsonData["data"][0]["time"]).to.eql("2018-11-28 17:27:41");
});
- 1
- 2
- 3
- 4
- 5
Test Result 测试结果
除了上面的具体功能代码外,经常还需要返回一个结果,告诉Postman这个测试结果是Pass还是Fail,默认是pass。
这里返回值就不是简单的return语句可以,必须要通过Postman自带的对象或方法才可以,一般是通过pm.expect()或tests[]这两个地方返回测试结果。
完整的测试示范:
// 测试接口返回状态码是200:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
- 1
- 2
- 3
- 4
这些方法名看起来都很容易理解,一般都会叫pm.expect()或.to.be()或.to.have()这样的,字面意思就是期待什么或要求它必须是什么或必须有什么,才能通过测试。
另外,同样的测试结果,实际上还有更简单的写法,即不通过pm对象,而是内置tests对象。
常用操作如下:
// 反应时间必须少于200毫秒
tests["Response time is less than 200ms"] = responseTime < 200;
// 判断反应代号是否等于某一个指定的代号
tests[“Status code name has string”] = responseCode.name.has(“Created”);
- 1
- 2
- 3
- 4
- 5
看这个用法,猜测tests是一个JSON格式的对象,tests[…]括号内的字符串是测试的描述, =后面是判断语句,然后将True或False赋予为tests[…]的值,然后postman轮训所有tests对象里的参数,并返回pass与否的结果。
这里是官方总结的常用测试脚本方法:Test examples
以下是常用的返回测试结果的内置函数:
# “期待”返回结果必须包含某一段内容
pm.expect(从response里获取的字符串).to.include("必须包含的内容");
返回body值必须完全等于某一段内容
pm.response.to.have.body(“必须等于的内容”);
反应时间必须少于200毫秒
pm.expect(pm.response.responseTime).to.be.below(200);
必须返回某一个状态 如"Created"
pm.response.to.have.status(“状态名”);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
Debugging 脚本调试
如果要看已经设置的Enviroment变量的话,可以点开右上方小眼睛看到,如下图,我设置了2个环境变量:
调试时要打印的话,一般都是用console.log(…),这样就能在console中看到:
- 如果你的Postman是Chrome app的话,直接在chrome浏览器的开发者工具里调试就行。
- 如果是Mac等桌面软件,则需要打开内置的console才能看到调试信息。
位置在左下角,如下图:
postman console 页面如下图:
Postman Sandbox
Postman的Sandbox是Postman内部默认引入的第三方JS库。
参考:Postman Sandbox API reference 官方引用的脚本库详解
1.常用的库和工具
-
jQuery (Deprecated)
Cross-platform JavaScript library. This will be removed in future versions of the sandbox. -
Lodash
JS utility library -
BackboneJS (Deprecated)
Provides simple models, views, and collections. This will be removed in future versions of the sandbox. -
SugarJS
Extends native JS objects with useful methods -
tv4 JSON schema validator
Validates JSON objects against v4 of the json-schema draft -
CryptoJS
standard and secure cryptographic algorithms. Supported algorithms: AES, DES, EvpKDF, HMAC-MD5, HMAC-SHA1/3/256/512, MD5, PBKDF2, Rabbit, SHA1/3/224/256/512, TripleDES -
xml2Json(xmlString)
This function behaves the same in Newman and Postman -
xmlToJson(xmlString)(Deprecated)
This function does NOT behave the same in Newman and Postman -
postman.getResponseHeader(headerName) (Test-only)
returns the response header with name “headerName”, if it exists. Returns null if no such header exists. Note: According to W3C specifications, header names are case-insensitive. This method takes care of this.
postman.getResponseHeader(“Content-type”) and postman.getResponseHeader(“content-Type”) will return the same value.
生成MD5字符串:
var hashed = CryptoJS.MD5("待加密的字符串").toString();
- 1
文件转base64字符串:
s = 'Hello';
// 先转化成UTF-8编码的字符串
utf8 = CryptoJS.enc.Utf8.parse( s );
// 用CryptoJS第三方库(Postman已经内置了)进行编码
b64 = CryptoJS.enc.Base64.stringify(utf8)
console.log(b64);
// aGVsbG8=
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Postman SDK
不同于Sandbox,这是Postman内部较高级的SDK,可以引用一些方便的方法。
参考官网:Tutorial: Postman SDK Concepts
URL转换成JSON格式,并获取指定的参数值:
var sdk = require('postman-collection');
query = ( new sdk.Url(callback) ).toJSON().query;
for (var i in query) {
console.log(query[i].key +": "+ query[i].value);
}
- 1
- 2
- 3
- 4
- 5
- 6
</div><div><div></div></div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
</div>
转载:https://blog.youkuaiyun.com/fantian_/article/details/106519479