在postman中完成并保存请求后,可能希望从自己的应用程序发出相同的请求,postman允许生成各种语言和框架的代码片段。需要单击Send按钮下的“Code”链接以打开GENERATE CODE SNIPPETS模式。
Postman包含一个基于Node.js的强大的运行时环境,它允许我们为请求和集合添加动态行为。这使的我们可以编写测试用例,构建可包含动态参数的请求,在请求之间传递数据等等。
我们可以在流程中以下2个事件执行期间添加JavaScript代码:
1、脚本执行顺序
在Postman中,单个请求的脚本执行顺序如下所示:
具体如下图所示:
对于集合中的每一个请求,脚本会按照下面的这个顺序进行执行:
具体如下图所示:
对于集合中的每个请求,脚本将始终按照以下层次运行:集合级脚本(如果有),文件夹级脚本(如果有),请求级脚本(如果有)。 请注意,此执行顺序适用于前置请求和测试脚本。
例如,假设现在拥有以下集合,其中包含一个文件夹,文件夹中包含两个请求。如下图所示:
如果我们在集合,文件夹和请求的前置请求和测试脚本部分中添加了日志语句,则可以在Postman控制台中清楚地看到执行顺序。如下图所示:
2、工作原理
其实这一切都是在Postman中的一个沙箱(Sandbox)中完成的。Postman Sandbox是一个JavaScript执行环境,可以为我们编写的前置请求和测试脚本提供运行环境。
3、调试脚本
我们可以在预“Pre-request Script”标签页或“Tests”标签页下编写调试脚本,然后在Postman控制台中输出有用的日志信息。
4、前置请求脚本
前置请求脚本是在请求发送之前执行的代码片段。对于前置请求脚本的使用一般有以下场景:
比如,现在需要在请求头中添加一个timestamp字段,而该字段值是表示当前的时间戳,是一个动态变化值,所以该字段就需要动态设定。此时,我们就可以通过前置请求脚本来实现,具体如下图所示:
在Pre-request Script标签页下输入以下的一行代码:
pm.environment.set("timestampHeader", new Date());
在设置请求头时,我们只需要使用{{timestampHeader}}表达式,就可以正确获取在前置请求脚本中设置的值。如下图所示:
也可以对集合、集合中的文件夹添加前置请求脚本,添加方法如下图所示:
console.log('Collection 测试请求 runs');
5、测试脚本
对于Postman中的每个请求,我们都可以使用JavaScript语言来开发测试脚本。
// example using pm.response.to.have
pm.test("response is ok", function () {
pm.response.to.have.status(200);
});
// example using pm.expect()
pm.test("environment to be production", function () {
pm.expect(pm.environment.get("env")).to.equal("production");
});
// example using response assertions
pm.test("response should be okay to process", function () {
pm.response.to.not.be.error;
pm.response.to.have.jsonBody("");
pm.response.to.not.have.jsonBody("error");
});
// example using pm.response.to.be*
pm.test("response must be valid and have a body", function () {
// assert that the status code is 200
pm.response.to.be.ok; // info, success, redirection, clientError, serverError, are other variants
// assert that the response has a valid JSON body
pm.response.to.be.withBody;
pm.response.to.be.json; // this assertion also checks if a body exists, so the above check is not needed
});
6、测试例子
在发送请求并从服务器收到响应后运行测试脚本。
我们来看一些Postman测试的例子。 其中大多数都是Postman内部的片段。 可以根据需要为请求提供尽可能多的测试。
pm.environment.set("variable_key", "variable_value");
var array = [1, 2, 3, 4];
pm.environment.set("array", JSON.stringify(array, null, 2));
var obj = { a: [1, 2, 3, 4], b: { c: 'val' } };
pm.environment.set("obj", JSON.stringify(obj));
pm.environment.get("variable_key");
// These statements should be wrapped in a try-catch block if the data is coming from an unknown source.
var array = JSON.parse(pm.environment.get("array"));
var obj = JSON.parse(pm.environment.get("obj"));
pm.environment.unset("variable_key");
pm.globals.set("variable_key", "variable_value");
pm.globals.get("variable_key");
pm.globals.unset("variable_key");
pm.variables.get("variable_key");
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
pm.test("Status code name has string", function () {
pm.response.to.have.status("Created");
});
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201,202]);
});
var schema = {
"items": {
"type": "boolean"
}
};
var data1 = [true, false];
var data2 = [true, 123];
pm.test('Schema is valid', function() {
pm.expect(tv4.validate(data1, schema)).to.be.true;
pm.expect(tv4.validate(data2, schema)).to.be.true;
});
var Ajv = require('ajv'),
ajv = new Ajv({logger: console}),
schema = {
"properties": {
"alpha": {
"type": "boolean"
}
}
};
pm.test('Schema is valid', function() {
pm.expect(ajv.validate(schema, {alpha: true})).to.be.true;
pm.expect(ajv.validate(schema, {alpha: 123})).to.be.false;
});
var intermediate,
base64Content, // assume this has a base64 encoded value
rawContent = base64Content.slice('data:application/octet-stream;base64,'.length);
intermediate = CryptoJS.enc.Base64.parse(base64content); // CryptoJS is an inbuilt object, documented here: https://www.npmjs.com/package/crypto-js
pm.test('Contents are valid', function() {
pm.expect(CryptoJS.enc.Utf8.stringify(intermediate)).to.be.true; // a check for non-emptiness
});
pm.sendRequest("https://postman-echo.com/get", function (err, response) {
console.log(response.json());
});
var jsonObject = xml2Json(responseBody);
pm.globals.set("variable_key", "variable_value");
pm.globals.set("variable_key", "variable_value");
7、分支和循环
运行集合时,您可以使用postman.setNextRequest("request_name");
在Postman中分支和循环API请求。
postman.setNextRequest("request_name");
postman.setNextRequest(null);
关于postman.setNextRequest()的一些重点:
7、沙箱
Postman Sandbox是一个JavaScript执行环境,我们可以在为请求编写预请求脚本和测试脚本(Postman和Newman)时使用它。 无论在预请求/测试脚本部分编写什么代码,都会在此沙箱中执行。
具体的可以参考以下文档:
1、变量
(1)变量作用域
在Postman中,变量有以下作用域:
如果当前活动环境中的变量与全局变量同名,则环境变量将优先。换句话说,全局变量被环境变量所覆盖,环境变量被数据变量覆盖(仅在集合运行器中可用)。
(2)构建请求时访问变量
在Postman界面上,我们可以用{{variableName}}这样的形式访问变量。当Postman解析变量时,字符串{{variableName}}将被替换为相应的值。例如,对于值为http://localhost的环境变量url,我们必须在请求URL字段中使用{{url}}。发送请求时,{{url}}将被http://localhost替换。
由于请求构建器中的变量是使用字符串替换来访问的,因此它们可以在请求构建器中的任何位置使用。我们可以再请求URL,请求参数,请求呕吐,授权和请求正文中使用变量。Postman根据变量范围部分中讨论的范围规则解析变量,并将它们发送到服务器。
(3)脚本中访问变量
在脚本中定义环境或全局变量:
要在脚本中定义变量,需要根据所需的范围使用pm.environment.set()方法或pm.globals.set()方法。该方法需要使用变量名和变量值作为参数来设置变量。当发送请求时,脚本将被解析。集合中定义变量有点不同,下面会特殊说明。
获取预定义的变量:
一旦设置了一个变量,就可以使用pm.variables.get()方法,或者根据合适的范围使用pm.environment.get()或pm.globals.get()方法来获取变量值。该方法需要将变量名称作为参数来检索脚本中存储的值。
(4)定义集合变量
集合变量可以通过编辑集合来定义。单击集合名称旁边的省略号(…),然后选择“编辑”以打开编辑集合模式。选择“Variables”选项卡以添加和编辑集合变量。我们也可以在创建集合时定义集合变量。
(5)打印变量
我们可以通过console.log(变量名称);
的形式打印变量值。在Postman控制台中可以查看到输出的变量值信息。
(6)数据变量
Collection Runner允许我们导入CSV或JSON文件,然后请求和脚本可以使用导入的数据文件中的值,我们称这些为数据变量。要在Postman中使用它们,同样需要遵循与环境或全局变量相同的语法。
Postman UI中的变量包含在花括号内。
例如,在下面的屏幕截图中,URL参数中的{{username}}和{{password}}将被数据文件中的相应值替换:
Postman有几个动态变量,我们可以在请求中使用它们。动态变量不能在沙盒中使用。只能在请求URL、请求头或者请求体中以{{…}}格式使用它们。
2、环境
环境是一组键值对。 键表示变量的名称。 您可以使用数据编辑器修改环境
使用API时,通常需要为本地计算机,开发服务器或生产API提供不同的设置。 环境允许我们使用变量自定义请求,以便可以在不更改请求的情况下轻松切换不同的设置。
单击Postman应用程序右上角的下拉菜单以选择活动环境,或键入环境名称。
使用快捷键CMD/CTRL + ALT + E
3、全局变量
全局变量提供了一组可在所有范围内使用的变量。 您可以拥有多个环境,但一次只能有一个环境可以使用一组全局变量。
(1)管理全局变量
要管理全局变量,请单击Postman应用程序右上角的齿轮图标,然后选择“管理环境”。
单击模式底部的Globals按钮以显示用于添加,编辑和删除全局变量的键值编辑器。
要查看全局变量,请单击Postman应用程序右上角的“快速查看”图标以显示环境和全局变量。