8

Postman 脚本的奥秘:JavaScript 的内置对象和方法

 1 year ago
source link: https://www.51cto.com/article/769445.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Postman 的前后置脚本中是完全支持 JavaScript 编写代码,JavaScript 有很多内置的对象和方法,可以帮助我们完成各种任务,比如生成随机数和测试响应数据。

f2a450f31fcae40fd4200478a44a63947d4bfe.jpg

一、生成随机数

使用Math.random()方法来生成一个 0 到 1 之间的随机小数,比如:

Math.random() // 0.0-1.0之间的数字,小数 0.465413246541

生成一个指定范围内的随机数:

Math.random()*10  // 0.0-10.0之间的数字,小数 9.465413246541

生成一个整数,可以使用Math.floor()、Math.ceil()或者Math.round()方法来对小数进行取整:

Math.floor(Math.random()*10)  // 直接舍弃小数部分 0,1,2,3,4,5,6,7,8,9
Math.floor(9.232323123313213)=9 // 直接舍弃小数部分 9
Math.ceil(Math.random()*10)  // 进1法,整数部分加1, 1,2,3,4,5,6,7,8,9,10
Math.ceil(9.232323233231121)=10 // 进1法,整数部分加1, 10
Math.round(Math.random()*10) // 四舍五入法,最接近的整数 0,1,2,3,4,5,6,7,8,9,10
Math.round(9.232323233231121)=9 // 四舍五入法,最接近的整数 9

场景 1:随机生成一个用户名

生成一个用户名,规定格式为 kira001,kira002,jkira003。

var num="";
// 循环生成3位数
for(var i=0;i<3;i++){
    num +=Math.floor(Math.random()*10);
}
// 拼接用户名
var username = "kira" + num;
// 打印用户名
console.log(username) // kira456

场景 2:随机生成一个电话号码

生成一个电话号码,规定前三位为 135,138,156,181,199。

// 定义前三位列表
var list=["135","138","156","181","199"];
// 随机获取一个下标
var index= Math.floor(Math.random()*list.length)
// 获取前三位
var pre_phone3=list[index];
// 定义后八位为空字符串
var back_phone8 ="";
// 循环生成后八位数字
for(var i=0;i<8;i++){
    back_phone8 +=Math.floor(Math.random()*10);
}
// 拼接电话号码
var phonenum = pre_phone3+back_phone8;
// 打印电话号码
console.log(phonenum) // 15612345678
// 设置为临时变量,请求直接{{phonenum}}调用
pm.variables.set('phonenum',phonenum);

二、请求数据或响应数据处理

接口测试的时候,我们需要对请求数据或者响应数据进行一些逻辑处理和断言,以确保数据的正确性和完整性。

方法 1:pm 对象

pm 对象是一个全局对象,它提供了一些属性和方法来访问请求和响应的信息。

console.log(pm.response.code)   // 提取状态码 200
console.log(pm.response.reason())  // 提取响应信息 OK
console.log(pm.response.headers)  // 提取响应头
console.log(pm.response.responseTime)  // 提取响应时间
console.log(pm.response.text())  // 提取响应体,不管body是什么格式的,都可以采用这个函数来提取
console.log(pm.response.json())  // 提取json格式的响应数据,并转化为json对象(即python字典)

方法 2:responseCode、responseTime 等对象

responseCode、responseTime 等对象是一些全局对象,它们也可以用来访问请求和响应的信息。

var code=responseCode.code;       // 获取响应中的状态码200
var codename=responseCode.name;   // 提取响应信息 OK
var time=responseTime;            // 提取响应时间
var headers=postman.getResponseHeader('Content-Type');  // 提取响应头中的Content-Type
var cookies=postman.getResponseCookie('name').value;    // 获取响应cookies中的value值,括号中填写cookies的name值
var body=getResponseBody;        // 获取响应正文(是字符串,如果是json格式,那就是json字符串)
var jsonData= JSON.parse(body)   // 将json字符串转化为json对象(字典)

三、断言响应信息

pm.test()是一个全局函数,用来定义一个测试用例,接受一个回调函数作为参数。

断言状态码

状态码是指服务器对请求的处理结果的一种表示,如: 200 表示成功,404 表示未找到,500 表示服务器错误等等。

(1) 方法 1:pm.response.to.have.status()

pm.response.to.have.status()用来判断响应的状态码。

pm.test("Status code is 200", function () {
     pm.response.to.have.status(200);
});

(2) 方法 2:pm.expect()

pm.expect()是一个全局函数,用来创建一个期望值,并接受一个实际值作为参数。`pm.expect()还提供了一些链式方法,可以用来进行各种断言。

var code=pm.response.code;
pm.test("链式断言简单示例",function(){
    pm.expect(code).to.equal(200);
    pm.expect({a: 1}).to.deep.equal({a: 1});
    pm.expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]');
    pm.expect({'.a': {'[b]': 'x'}}).to.nested.include({'\\.a.\\[b\\]': 'x'});
    pm.expect({a: 1}).to.have.own.property('a');
    pm.expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd');
    pm.expect({a: 1, b: 2}).to.have.all.keys('a', 'b');
    pm.expect([]).to.be.an('array').that.is.empty;
});

pm.expect()有非常多的链式方法,具体参考链接:https://www.chaijs.com/api/bdd/

(3) 方法 3:if 语句和 tests 对象

tests 是一个全局对象,用来存储测试结果,接受一个布尔值作为参数。

var code =pm.response.code;
if(code==200){
    tests['状态码一致!']=true;
}else{
    tests['状态码不一致']=false;
}

(4) 方法 4:tests 对象和比较运算符

比较运算符是一种运算符,用来比较两个值的大小或相等性,并返回一个布尔值。

tests['状态码的检验']=pm.response.code===200;

断言响应体

响应体是指服务器返回给客户端的数据,它可以是文本、图片、音频、视频等等。

(1) 方法 1:pm.expect()

全量匹配或者部分匹配:

pm.test("全量匹配或者部分匹配", function () {
     var body =pm.response.text();
     pm.expect(body).to.equal('{"status":2,"msg":"请求成功"}');// 全量匹配
     pm.expect(body).to.include('请求成功');// 部分匹配
});

响应的具体内容不固定,但它的格式和结构固定,则可以结构匹配或者键值匹配:

pm.test("响应结构匹配", function () {
     var jsonData = pm.response.json();
     // 结构匹配
     pm.expect(jsonData).to.eql({
          "errcode": 0,
          "data": { "user_id": 1 }
     });
     // 键值匹配
     pm.expect(jsonData.status).to.equal(2);
     pm.expect(jsonData.msg).to.equal("请求成功");
});

(2) 方法 2:pm.response.to.have.jsonBody()

pm.test("Body is json", function () {
  //检查响应体是否为 json 格式。
  pm.response.to.have.jsonBody();
  //检查响应体中是否存在某个键或者某个值。  
  pm.response.to.have.jsonBody('status');// 检查键是否存在
  pm.response.to.have.jsonBody(2);// 检查值是否存在
});

(3) 方法 3:pm.response.to.have.jsonSchema()

检查响应体是否符合某个 json 模式(schema),包含两个必需的属性 errcode(数字) 和 errmsg(字符串)。

pm.test("Body matches schema", function () {
  var schema = {
     "type": "object", // 对象
     "properties": {
          "errcode": {
               "type": "number" // 数字类型
          },
          "errmsg": {
               "type": "string" // 字符串类型
          }
     },
     "required": ["errcode", "errmsg"]  // 必须
};
  pm.response.to.have.jsonSchema(schema);
});

常见特殊场景断言思路分析

(1) 场景 1:响应体 json 格式的数量比较大,不能全量匹配整个 json 格式,如何断言?

只检查响应体中的一些关键的键或者值

(2) 场景 2:返回的 json 格式的数据是变化的,如何断言?

这种情况下,使用 json 模式来检查响应体的结构和约束,而不是具体的内容。

(3) 场景 3:如果返回的 json 格式的 Body 数据是动态变化的怎么办?

  • 首先检查是否为 json 格式
  • 可以只检查 body 中是否存在期望的键,主要检查哪些核心的键
  • 可以检查返回 json 结构是否正确

Recommend

  • 25
    • blog.xiehuanjin.cn 5 years ago
    • Cache

    【Postman】pm.response.headers 对象探究

    是什么 顾名思义,这个对象包含响应头信息。 是数组吗 网上很多介绍都说他是“以数组的形式返回当前请求成功后的response的headers”,用console.log() 输出,发现它也像是数组。

  • 43

    在 V8 引擎中扩展 JavaScript 标准内置对象徐鹏跃免费承包 Promise 相关问题本文会以在...

  • 6
    • qiwsir.github.io 3 years ago
    • Cache

    通过内置对象理解 Python(七)

    sorted and reversed 用于序列排序和反转数据序列可能是任何编程语言中最常用的算法操作,Python 中的内置函数 sorted 和 reversed 都用于实现这些功能。 sorted...

  • 58
    • qiwsir.github.io 3 years ago
    • Cache

    通过内置对象理解 Python(六)

    bytearray and memoryview: 字节接口bytearray 与 bytes 类似,它的意义体现在: bytearray 在一些低级操作中,比如有关字节和位运算,使用 bytearray

  • 2
    • qiwsir.github.io 3 years ago
    • Cache

    通过内置对象理解 Python(五)

    dir and vars :一切皆字典你有没有想过 Python 是如何存储对象、变量、方法等等的?我们知道所有对象都有自己的属性和方法,但是 Python 到底是如何跟踪它们的呢? 简单的答案是,所有内容都存储在字典中。 v...

  • 6
    • 3wapp.github.io 3 years ago
    • Cache

    常用内置对象操作

    1. 0x01 string 1.1. 编码 # unicode chinese = '\u4e2d\u6587' >>> print chinese.decode('unicode-escape') 中文 1.2. 基本操作 >>> "a" + "b" 'ab' >>> "a" * 3 'aa...

  • 11
    • jiac3366.github.io 3 years ago
    • Cache

    K8s | API对象的奥秘!

    +c编程手记 Guangzhou, ChinaK8s是如何对 Resource、Group 和 Version 进行解析,从而找到 对象的定义呢1、会匹配 API 对象的组

  • 4

    javaScript中Math内置对象基本方法入门 原创 概念

  • 8

    Python进阶(10)—获取对象信息的内置函数◎知识点内置函数issubclass()和isinstance()内置函数type()内置函数dir()

  • 9

    16 1月 2023 • 微信内置浏览器点击浏览器「返回」后不执行js脚本 最近遇到一个很奇葩的问题同一套代码,部署在测试和生产两套服务上

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK