接口测试工具Postman(四)生成代码段、脚本以及变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuyunier/article/details/88024476

一、生成代码段

在postman中完成并保存请求后,可能希望从自己的应用程序发出相同的请求,postman允许生成各种语言和框架的代码片段。需要单击Send按钮下的“Code”链接以打开GENERATE CODE SNIPPETS模式。
在这里插入图片描述

  • 选择语言
    使用下拉菜单选择语言(某些语言有多种选择),可以选择不同的框架来发出请求。
    在这里插入图片描述

二、脚本简介

Postman包含一个基于Node.js的强大的运行时环境,它允许我们为请求和集合添加动态行为。这使的我们可以编写测试用例,构建可包含动态参数的请求,在请求之间传递数据等等。

我们可以在流程中以下2个事件执行期间添加JavaScript代码:

  • 在请求被发送到服务器之前;就是在“Pre-request Script”标签页下添加的脚本内容;
  • 在服务器响应内容被接收到以后;就是在“Tests”标签页下添加的脚本内容。
    在这里插入图片描述
    用户可以将请求前置脚本和测试脚本添加到集合,文件夹,集合中的请求或未保存到集合的请求中。

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语言来开发测试脚本。
在这里插入图片描述

  • 编写测试脚本
    Postman测试脚本本质上是在发送请求后执行的JavaScript代码,我们可以通过访问pm.response对象获取服务器返回的报文。
    在这里插入图片描述
    以下是一些测试脚本样例:
// 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");
});
  • 检查JSON值
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");
});
  • 响应时间小于200毫秒
pm.test("Response time is less than 200ms", function () {
    pm.expect(pm.response.responseTime).to.be.below(200);
});
  • 状态代码是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");
});
  • 成功的POST请求状态代码
pm.test("Successful POST request", function () {
    pm.expect(pm.response.code).to.be.oneOf([201,202]);
});
  • 使用TinyValidator获取JSON数据
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;
});
  • JSON模式验证器
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;
});
  • 解码base64编码数据
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());
});
  • 将XML主体转换为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()的一些重点:

  • 指定后续请求的名称或ID,集合运行器将负责其余的请求。
  • 它可以用在预请求或测试脚本中。 如果有多个赋值,则考虑最后一个赋值。
  • 如果请求中缺少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}}将被数据文件中的相应值替换:
在这里插入图片描述

  • 预请求和测试脚本中的数据变量
    这是Inside预请求和测试脚本的示例。 假设在预请求和测试脚本中有pm.iterationData.get(“username”)方法。 该方法允许从数据文件中访问username变量的值。
    在这里插入图片描述
    (7)动态变量

Postman有几个动态变量,我们可以在请求中使用它们。动态变量不能在沙盒中使用。只能在请求URL、请求头或者请求体中以{{…}}格式使用它们。

  • {{$ guid}}:添加v4样式guid
  • {{$ timestamp}}:添加当前时间戳
  • {{$ randomInt}}:添加0到1000之间的随机整数

2、环境

环境是一组键值对。 键表示变量的名称。 您可以使用数据编辑器修改环境

使用API时,通常需要为本地计算机,开发服务器或生产API提供不同的设置。 环境允许我们使用变量自定义请求,以便可以在不更改请求的情况下轻松切换不同的设置。

  • 创建环境

在这里插入图片描述在这里插入图片描述

  • 选择环境

单击Postman应用程序右上角的下拉菜单以选择活动环境,或键入环境名称。

选择环境后,可以访问活动环境范围中的变量。
在这里插入图片描述

  • 打开环境

使用快捷键CMD/CTRL + ALT + E
在这里插入图片描述
3、全局变量
全局变量提供了一组可在所有范围内使用的变量。 您可以拥有多个环境,但一次只能有一个环境可以使用一组全局变量。
(1)管理全局变量
要管理全局变量,请单击Postman应用程序右上角的齿轮图标,然后选择“管理环境”。
在这里插入图片描述
单击模式底部的Globals按钮以显示用于添加,编辑和删除全局变量的键值编辑器。
在这里插入图片描述要查看全局变量,请单击Postman应用程序右上角的“快速查看”图标以显示环境和全局变量。

单击“编辑”链接时,它会打开一个用于编辑键和值的模式。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhuyunier/article/details/88024476
今日推荐