Postman 是一个用于构建和使用 API 的 API 平台,Postman 简化了 API 生命周期的每个步骤并简化了协作,可以更快地创建更好的 API。
Postman 包含一个基于Node.js
的强大的运行时,允许您向请求和分组添加动态行为,这允许您编写测试套件,构建可以包含动态参数的请求,在请求之间传递数据等等。
执行流程的2个脚本事件:
pre-request script
:请求前脚本,在请求接口前执行test script
:测试脚本,在请求接口并响应数据后执行脚本的执行顺序:
注意:
pre-request script
和test script
脚本。为什么Postman可以执行JavaScript代码?
Postman Sandbox
(沙箱),是一个 JavaScript 执行环境,可以在为请求编写预请求和测试脚本时使用(在Postman和Newman都是如此),无论您在这些部分中编写什么代码,都将在这个沙箱中执行。
我的Postman版本是Windows桌面端Version 10.16.0
,最新版下载 1。
基于该版本进行调试和说明,如果版本不一致,会有点差异,不影响具体使用,当然你也可以尝试更新版本。
postman最新版本已经不维护离线模式(即未登录),要体验全部功能需要注册登录,若没有postman账号可以去注册一个。postman界面右上角可以看到这两个,根据自己的情况,创建账号后再登录;若已经有账号了,就只要登录就可。
登录/注册是先跳到浏览器登录/注册,再回到桌面端。
Version 10.16.0版本
创建工作空间必须登录后才能操作
集合和目录能够细化管理接口,根据项目的实际情况,进行分类、分级,能快速定位要请求的接口
可以导入collections(集合)、Environments(环境配置)通过分享的链接或导出的JSON文件导入数据(还可以从第三方仓库导入,例如:GitHub)
导出postman中所有数据,包括所有集合和环境配置,在设置中的Data导出
跳转到网页上操作
参数就像变量一样,它可以是固定的值,也可以是变化的值,比如:会根据一些条件或其他参数进行变化。我们如果要使用该参数就需要引用它。
引用动态参数的方式:
{{varibale_key}} /**{{}}里面是参数名**/
注意:
Postman的内置动态参数 2 ,postman自带不需要进行任何设置。
常用的内置动态参数:
{{$timestamp}}
{{$randomInt}}
{{$guid}}
{{$randomUUID}}
参数设置可以在集合、全局环境和独立环境里,如下所示:
注意事项:
pm.collectionVariables.set("varibale_key", "varibale_value");
pm.globals.set("variable_key", "variable_value");
// 设置环境变量
pm.environment.set("variable_key", "variable_value");
// 删除环境变量
pm.environment.unset("variable_key");
只有当前环境有效,切换其他独立的环境是没有设置的,所有独立环境互不影响!
pm.variables.get("variable_key");
pm.globals.get("variable_key");
pm.collectionVariables.get("variable_key");
pm.environment.get("variable_key");
为了在响应中执行断言,首先需要将数据解析为断言可以使用的JavaScript对象。
const responseJson = pm.response.json();
const responseXml = xml2Json(pm.response.text());
const parse = require('csv-parse/lib/sync');
const responseCsv = parse(pm.response.text());
const $ = cheerio.load(pm.response.text());
console.log($.html());
如果不解析成JavaScript对象是不是就不可以断言?当然不是,也可以不解析响应体断言:
// 测试响应体是否包含某个字符串
pm.test("Body contains string", () => {
pm.expect(pm.response.text()).to.include("customer_id");
}
let body = pm.request.body.raw;
let data = JSON.parse(body);
let param = pm.request.body.formdata.get("[请求参数名]");
let param = pm.request.body.urlencoded.get("[请求参数名]");
// create a cookie jar
const cookieJar = pm.cookies.jar();
cookieJar.set(URL,{
name: cookie name,
value: cookie value,
httpOnly: true
}, callback (error, cookie));
cookieJar.get(URL, cookie name, callback(error, cookie);
// get the created cookies
cookieJar.getAll(URL, callback(error, cookies));
// Delete the created cookie
cookieJar.unset(URL , cookie name, callback (error));
// delete the set cookies
cookieJar.clear(URL, callback (error));
断言测试可以在集合、目录和请求的pre-request script
和test script
中编写,测试脚本可以检测请求响应的各个方面,包括正文、状态代码、头、cookie、响应时间等,只有测试符合自定义的要求后才能通过。
pm对象提供了测试相关功能:
pm.test(testName:String, specFunction:Function):Function
:测试函数pm.expect(assertion:*):Function → Assertion
:允许在响应数据上做测试,使用ChaiJS expect BDD语法可以使用pm.response.to.have.*
和pm.response.to.be.*
来构建断言。
演示:在目录下的pre-request script
和test script
中编写测试
查看测试执行结果
测试状态码
pm.test("请求状态码200", function() {
pm.response.to.have.status(200);
});
pm.test("请求状态码200", function() {
pm.expect(pm.response.code).to.eql(200);
});
测试响应时间
pm.test("请求响应时间少于200ms", () => {
pm.expect(pm.response.responseTime).to.be.below(200);
});
是否满足指定条件
tests["字符串asdf包含a字符"] = "asdf".includes("a"); //旧的语法(已弃用,不推荐使用)
多断言组合测试
测试脚本也可以包含多个断言作为单个测试,可以将相关断言组合在一起。如果包含的任一个断言失败,整个测试将失败,所有断言都必须成功,测试才能通过。
pm.test("The response has all properties", () => {
const responseJson = pm.response.json(); //将响应体body转换成JSON格式
pm.expect(responseJson.type).to.eql('vip'); // type等于vip
pm.expect(responseJson.name).to.be.a('string'); // name值的类型为string类型
pm.expect(responseJson.id).to.have.lengthof(1); // id的长度为1
}
当你在测试脚本中遇到错误或意外行为时,postman控制台可以帮助你识别,通过将console.log调试语句与你的测试断言相结合,你可以检查http请求和响应的内容,以及变量之类的postman数据项。
通常可以使用控制台日志来标记代码执行,有时也称为“跟踪语句”。
if (pm.response.json().id) {
console.log("id was found!");
} else {
console.log("no id ...");
}
也可以异步进行测试
pm.sendRequest("https://postman-echo.com/get", function (err, response) {
console.log(response.json());
});
let token = CryptJS.MD5("[文本内容]").toString();
let token = CryptJS.SHA256("[文本内容]").toString();
let timestamp = Date.now();
//---------------或-----------
let timestamp = new Date().getTime();
postman官网下载:https://www.postman.com/downloads/ ↩︎
postman内置动态参数参考文档:https://learning.postman.com/docs/writing-scripts/script-references/variables-list/ ↩︎