Postman接口测试教程【6】_Postman脚本

一、   Postman脚本

1、什么是postman脚本

Postman包含一个基于Node.js的强大的运行时,它允许请求和集合添加动态行为;可允许编写测试套件,构建可以包含动态参数的请求,在请求之间传递数据等等;
可在流程中的两个事件中添加要执行的JavaScript代码;
postman中单个请求的请求执行流程:Pre-request Script--》request--》response--》Tests;
①、在将请求发送到服务器之前,作为Pre-request Script选项卡下的预请求脚本;
②、收到响应后,作为“Tests”选项卡下的测试脚本;
③、Postman Sandbox是一个JavaScript执行环境,您可以在为请求(在PostMan和纽曼州)撰写预请求和测试脚本时可用;这些部分中写入的代码都是在这个沙盒中执行的;
④、调试脚本可以在“ Pre-request scripts” 选项卡或“Tests” 选项卡下编写,并在Postman Console中记录有用的消息;

2、预请求脚本(Pre-request Script)

预请求脚本是与发送请求之前执行的收集请求相关联的代码片段;
在请求头中包含时间戳或在URL参数中发送随机字母数字字符串的用例非常适用;
(1)、例如,要在请求标头中包含时间戳,可以使用从函数返回的值来设置环境变量,postman.setEnvironmentvariable('timestampHeader',new Date());

(2)、通过键入来访问头数据编辑器中的timestampHeader变量;
当请求发送时,预请求脚本将被执行,并且timestampHeader的值将被发送代替,{{timestampHeader}};

注意:要设置环境变量,环境必须处于活动状态。
预请求脚本使用JavaScript编写,语法与Tests script完全相同,但响应对象不存在。

3、测试脚本(Tests)

使用Postman,您可以使用JavaScript语言为每个请求编写和运行测试;

 

 (1)、写postman测试

Postman测试本质上是为特殊测试对象设置值的JavaScript代码;测试脚本在发送请求后执行,允许访问响应对象;可以为对象中的元素设置描述性键,然后说明是否为true;
例如,tests[“Body contains user_id”] = responseBody.has(“user_id”); 将检查响应正文是否包含user_id字符串;

(2)、Sandbox

PostMan测试在沙盒环境中运行,这与应用程序的执行环境是分开的;

(3)、代码段
Postman在编辑器旁边列出常用的代码段,可以选择要添加的代码段,并将相应的代码添加到测试编辑器中;

 (4)、查看结果

PostMan每次运行请求时都会运行测试;结果显示在响应查看器下的“Tests”选项卡中。该选项卡标题显示了传递了多少测试,并在此列出了在测试变量中设置的键。如果值为true,则测试通过;

 

3、测试脚本示例

设置环境变量 postman.setEnvironmentVariable("key", "value"); 
将嵌套对象设置为环境变量

var array = [1, 2, 3, 4];
postman.setEnvironmentVariable("array", JSON.stringify(array, null, 2));
var obj = { a: [1, 2, 3, 4], b: { c: 'val' } }; postman.setEnvironmentVariable("obj", JSON.stringify(obj));

获取环境变量 postman.getEnvironmentVariable("key"); 
获取一个环境变量(其值是一个字符串对象)

var array = JSON.parse(postman.getEnvironmentVariable("array"));
var obj = JSON.parse(postman.getEnvironmentVariable("obj"));

清除环境变量 postman.clearEnvironmentVariable("key"); 
设置一个全局变量 postman.setGlobalVariable("key", "value");
获取全局变量 postman.clearGlobalVariable("key"); 
清除全局变量 postman.clearGlobalVariable("key"); 
检查响应体是否包含一个字符串 tests["Body matches string"] = responseBody.has("string_you_want_to_search");
将XML体转换为JSON对象 var jsonObject = xml2Json(responseBody); 
检查响应体是否等于一个字符串 tests["Body is correct"] = responseBody === "response_body_string";
检查JSON值

var data = JSON.parse(responseBody);
tests["Your test name"] = data.value === 100;

内容类型存在(不区分大小写的检查) tests["Content-Type is present"] = postman.getResponseHeader("Content-Type");
内容类型存在(区分大小写) tests["Content-Type is present"] = responseHeaders.hasOwnProperty("Content-Type");
响应时间小于200ms tests["Response time is less than 200ms"] = responseTime < 200;
响应时间在一个特定的范围内(包括下限,上限排除) tests["Response time is acceptable"] = _.inRange(responseTime, 100, 1001);
状态码是200 tests["Status code is 200"] = responseCode.code === 200;
代码名称包含一个字符串 tests["Status code name has string"] = responseCode.name.has("Created");
POST请求状态代码成功 tests["Successful POST request"] = responseCode.code === 201 || responseCode.code === 202;
将TinyValidator用于JSON数据

var schema = {"items": { "type": "boolean" }};
var data1 = [true, false];
var data2 = [true, 123];
tests["Valid Data1"] = tv4.validate(data1, schema);
tests["Valid Data2"] = tv4.validate(data2, schema);
console.log("Validation failed: ", tv4.error);

解码base64编码数据

var intermediate,base64Content,rawContent;
rawContent = base64Content.slice('data:application/octet-stream;base64,'.length);
intermediate = CryptoJS.enc.Base64.parse(base64content);
tests["Contents are valid"] = CryptoJS.enc.Utf8.stringify(intermediate);

 

4、分支和循环

运行集合时,可以使用该postman.setNextRequest("request_name"),功能在Postman中分支和循环使用API​​请求,为setNextRequest提供当前运行的名称会导致Postman连续运行当前请求;
(1)、设置接下来的请求:postman.setNextRequest("request_name");
(2)、循环当前的请求:为setNextRequest提供当前运行的名称会导致Postman连续运行当前请求;
(3)、结束工作流执行:postman.setNextRequest(null);
注意:在连续循环一个请求时,应该在某些逻辑中封装setNextRequest,以确保请求不会无限期地运行,否则需要强制关闭收集运行器;

一些关键点postman.setNextRequest():
指定后续请求的名称或ID,集合运行者将处理其余请求;
它可以在预请求或测试脚本中使用。在多于一个作业的情况下,考虑最后一个设定值;
如果postman.setNextRequest()在请求中不存在,则收集运行器默认为线性执行并移动到下一个请求;

5、Postman沙盒

postmanSandbox是一个JavaScript执行环境,可以在编写预请求脚本和测试脚本(在Postman和Newman中)时可用;沙箱中执行预请求/测试脚本部分中写入的代码;

Lodash:JS实用程序库;
cheerio:一个快速,精简的核心jQuery API实现(版本4.6.0及更高版本);
BackboneJS 已弃用:提供简单的模型,视图和集合。这将在以后版本的沙箱中删除;
SugarJS 已弃用:使用有用的方法扩展本机JS对象。这将在以后版本的沙箱中删除;
tv4 JSON模式验证器:根据json-schema草案的v4验证JSON对象;
CryptoJS:标准和安全的加密算法。支持的算法:AES,DES,EvpKDF,HMAC-MD5,HMAC-SHA1 / 3/256/512,MD5,PBKDF2,Rabbit,SHA1 / 3/224/256/512,TripleDES;
xml2Json(xmlString):这个功能在Newman和Postman中是一样的;
xmlToJson(xmlString) 已弃用:此功能在Newman和Postman中的行为不相同;
postman.getResponseHeader(headerName) Test-only:返回名称为“headerName”的响应头(如果存在)。如果没有这样的头存在,则返回null。 注意:根据W3C规范,头名不区分大小写。这个方法是照顾这个。 postman.getResponseHeader("Content-type") 并  postman.getResponseHeader("content-Type") 返回相同的值。
注意:自4.6.0版本以来,jQuery支持已经停用;

6、环境和全局变量

postman.setEnvironmentVariable(variableName, variableValue)

设置一个环境变量“variableName”,并为其分配字符串“variableValue”;
您必须为此方法选择一个环境才能工作;
注意:只能存储字符串;
存储其他类型的数据将导致意外的行为;

postman.getEnvironmentVariable(variableName) 返回环境变量“variableName”的值,用于预先请求和测试脚本。您必须为此方法选择一个环境才能工作;
postman.setGlobalVariable(variableName, variableValue)

设置一个全局变量“variableName”,并为其分配字符串“variableValue”;
注意:只能存储字符串。存储其他类型的数据将导致意外的行为;

postman.getGlobalVariable(variableName) 返回全局变量“variableName”的值,用于预请求和测试脚本
postman.clearEnvironmentVariable(variableName) 清除名为“variableName”的环境变量。您必须为此方法选择一个环境才能工作
postman.clearGlobalVariable(variableName) 清除名为“variableName”的全局变量。
postman.clearEnvironmentVariables() 清除所有环境变量。您必须为此方法选择一个环境才能工作。
postman.clearGlobalVariables() 清除所有全局变量
environment

当前环境中的变量字典。使用 environment["foo"] 访问“foo”的环境变量的值;
注意:这只能用于读取变量;
使用 setEnvironmentVariable() 设置值;

globals

全局变量字典 使用 globals["bar"] 访问“栏中的”全局变量的值;
注意:这只能用于读取变量;
使用 setGlobalVariable() 设置值;





7、环境和全局变量

PostMan还有一些动态变量,可以在请求中使用;
请注意,动态变量不能在沙盒中使用。只能以请求URL / headers / body 中的格式使用,格式:{{..}};

8、Cookies

9、请求/响应相关属性

(1)、request {object}:Postman在写脚本时使请求对象可以使用。该对象是只读的。更改此对象的属性将不起作用。注意:变量不会在请求对象中解析。请求对象由以下内容组成:
       ①、data {object} - 这是请求的表单数据字典。(request.data[“key”]==”value”)
       ②、headers {object} - 这是请求的标题字典(request.headers[“key”]==”value”)
       ③、method {string} - GET / POST / PUT等
       ④、url {string} - 请求的url。
(2)、responseHeaders {object} 已弃用, 仅测试:这是响应头的映射。这是区分大小写的,不应该使用。检查postman.getResponseHeader() 上面列出的 方法。
(3)、responseBody {string} 仅测试:包含原始响应正文文本的字符串。您可以将其用作JSON.parse或xml2Json的输入。
(4)、responseTime {number} 仅测试:响应时间(以毫秒为单位)
(5)、responseCode {object} 测试:包含三个属性:
        ①、code {number}:响应代码(200为OK,404为Not Found等)
        ②、name {string}:状态码文本
        ③、detail {string}:响应代码的说明
(6)、tests {object} 仅测试:此对象用于填充。PostMan将将此对象的每个属性作为布尔测试。
(7)、iteration {number}:仅在Collection Runner和Newman中可用。表示当前测试运行索引。从0开始。

仅测试:此对象仅在测试脚本部分可用,在预先请求的脚本中使用它会抛出错误。

10、数据文件

如果在Collection Runner或Newman中使用数据文件,则可以访问data对象,该对象是当前测试运行中数据值的字典;

猜你喜欢

转载自www.cnblogs.com/sjl179947253/p/13196371.html