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

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

生成随机数

使用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 等对象

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

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:pm.response.to.have.status()
pm.response.to.have.status()用来判断响应的状态码。

pm.test("Status code is 200", function () {
     pm.response.to.have.status(200);
});
方法 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:if 语句和 tests 对象

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

var code =pm.response.code;
if(code==200){
    tests['状态码一致!']=true;
}else{
    tests['状态码不一致']=false;
}
方法 4:tests 对象和比较运算符

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

tests['状态码的检验']=pm.response.code===200;
断言响应体

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

方法 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: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: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:响应体 json 格式的数量比较大,不能全量匹配整个 json 格式,如何断言?

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

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

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

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

首先检查是否为 json 格式

可以只检查 body 中是否存在期望的键,主要检查哪些核心的键

可以检查返回 json 结构是否正确

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/219356.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql 行转列,把逗号分隔的字段拆分成多行

目录 效果如下源数据变更后的数据 方法第一种示例SQL和业务结合在一起使用 第二种示例SQL和业务结合在一起使用 结论 效果如下 源数据 变更后的数据 方法 第一种 先执行下面的SQL&#xff0c;看不看能不能执行&#xff0c;如果有结果&#xff0c;代表数据库版本是可以的&…

Web端功能测试的测试方向有哪些?

一、功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征&#xff0c;主要是用于页面之间切换跳转&#xff0c;指导用户去一些不知道地址的页面的主要手段&#xff0c;链接测试一般关注三点&#xff1a; 1&#xff09;链接是否按照既定指示那样&#xff0c;确实链接到…

ISIS配置以及详解

作者简介&#xff1a;大家好&#xff0c;我是Asshebaby&#xff0c;热爱网工&#xff0c;有网络方面不懂的可以加我一起探讨 :1125069544 个人主页&#xff1a;Asshebaby博客 当前专栏&#xff1a; 网络HCIP内容 特色专栏&#xff1a; 常见的项目配置 本文内容&am…

09、pytest多种调用方式

官方用例 # content of myivoke.py import sys import pytestclass MyPlugin:def pytest_sessionfinish(self):print("*** test run reporting finishing")if __name__ "__main__":sys.exit(pytest.main(["-qq"],plugins[MyPlugin()]))# conte…

java8 升级 java11

1.安装java11 1.1 安装参考 ​​​​​​LINUX安装JDK_liunx上安装ocean-CSDN博客 1.2 检查 java -version 2.Maven 项目pom文件修改 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEnc…

打车送咖啡?这个冬天,滴滴携Tims带来双倍暖意

天气愈发寒冷&#xff0c;打车出行成为越来越多人的选择。如果打车后还能被送一杯热腾腾的咖啡&#xff0c;是一种什么体验&#xff1f;11月27日&#xff0c;滴滴携手咖啡连锁品牌Tims天好咖啡&#xff08;以下简称“Tims”&#xff09;推出“打车送咖啡套餐”活动&#xff0c;…

高低压供配电智能监控系统

高低压供配电智能监控系统是一种综合运用物联网、云计算、大数据和人工智能等技术的智能化监控系统&#xff0c;用于实时监测高低压供配电设备的运行状态和电能质量&#xff0c;及时发现和处理供配电系统中存在的问题&#xff0c;提高供配电系统的安全性和可靠性。依托电易云-智…

教你用Python+selenium搭建自动化测试环境

一、环境搭建 1、安装pythonpycharm软件 。python安装网址官网&#xff1a;About Python™ | Python.org 根据自己的电脑系统选择最新版本 下载到本地&#xff0c;选择安装路径并配置好环境变量 验证安装是否成功 搜索中录入cmd 打开命令窗口 录入python显示一下版本号表示…

InnoDB的数据存储结构

一 数据库的存储结构&#xff1a;页 索引结构提供了高效的检索方式&#xff0c;不过索引信息和数据记录都是保存在文件上的&#xff0c;确切的说是存储在页结构中。另一方面&#xff0c;索引是在引擎中实现的&#xff0c;MySQL服务器上的存储引擎负责对表中数据的读取和写入。…

高级系统架构设计师之路

前言&#xff1a;系 统 架 构 设 计 师 (System Architecture Designer)是项目开发活动中的众多角色之 一 &#xff0c;它可 以是 一个人或 一个小组&#xff0c;也可以是一个团队。架构师 (Architect) 包含建筑师、设计师、创造 者、缔造者等含义&#xff0c;可以说&#xff0…

JSP控制项目启动后默认去访问指定的WebServlet 而不是index.jsp

我的 index.jsp 代码是这样 现在每次启动 访问的都是index.jsp 这也是它的默认配置 我这里写了一个 WebServlet 代码是这样 简单可以理解为 我们定义了WebServlet 访问路径为1cginServlet 其中在request作用域中 定义了一个userName值为 欢迎来到jsp世界 然后 跳转向 page.j…

荔枝FM语音批量下载

动机 最近想下载一下自己在蜻蜓FM上上传的音频&#xff0c;发现不支持批量下载。于是去找了一些下载器&#xff0c;万万没想到&#xff0c;该下载器只能下载前十条&#xff0c;再下要注册&#xff0c;注册费5元。尼玛&#xff0c;不能忍。本来就不是太难的技术&#xff0c;还搞…

类和对象——(7)this指针

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;想保持平衡…

如何理解微服务体系结构中的 CQRS

本文翻译自 How To Understand CQRS In Microservices Architecture&#xff0c;原作者 OLEKSII。 问题描述 在典型的软件应用程序中&#xff0c;有一个负责写入和读取操作的数据存储。通常&#xff0c;应用程序实现一些 CRUD 操作&#xff0c;并且非常简单。你存储了一些东西并…

如何使用Python核对文件夹内的文件

说明&#xff1a;日常工作中&#xff0c;我们经常会遇到这样的场景&#xff1a;核对A、B文件夹中文件的差异&#xff0c;找出A、B文件夹中不同部分的文件&#xff1b; 本文介绍如何使用Python来实现&#xff1b; 第一步&#xff1a;获取文件清单 首先&#xff0c;我们要获取…

Mysql date类型设置默认值curdate失败解决

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

【华为数据之道学习笔记】1-2华为数字化转型与数据治理

传统企业通过制造先进的机器来提升生产效率&#xff0c;但是未来&#xff0c;如何结构性地提升服务和运营效率&#xff0c;如何用更低的成本获取更好的产品&#xff0c;成了时代性的问题。数字化转型归根结底就是要解决企业的两大问题&#xff1a;成本和效率&#xff0c;并围绕…

AcWing.93.递归实现组合型枚举(Java版)

//递归实现组合型枚举,从n个数中选出不重复的m个. //按字典顺序输出&#xff0c;从小到大每次找三个 //可以用for循环,i 从 start开始, 每次深搜都修改搜索起始点 //数据量较大,用BufferedWriter输出import java.io.*; import java.util.*; public class Main {static int n,m;…

自建网站:零基础手把手教学,非IT技术也能写啦!!!

自建网站 服务器域名WordPress网页美感设计收款系统 服务器 腾讯云链接&#xff1a;https://cloud.tencent.com/act/pro/bestselling?fromSourcegwzcw.7788594.7788594.7788594&utm_mediumcpc&utm_idgwzcw.7788594.7788594.7788594&qz_gdtcthg4zieaaamhubo75ja …

飞行汽车开发原理(上)

前言 小节的安排是由浅入深&#xff0c;要按顺序读&#xff1b;有电路知识基础的同学可跳到“计算机电路”一节开始。因为知识点之间有网状依赖&#xff0c;没办法按分类来讲。 为了避免过于深入、越讲越懵&#xff0c;很多描述仅为方便理解、不求严谨。 半导体特性 导体&a…