【玩转 Postman 接口测试与开发2_015】第12章:模拟服务器(Mock servers)在 Postman 中的创建与用法(含完整实测效果图)

book cover for the 2nd version

《API Testing and Development with Postman》最新第二版封面

文章目录

  • 第十二章 模拟服务器(Mock servers)在 Postman 中的创建与用法
    • 1 模拟服务器的概念
    • 2 模拟服务器的创建
      • 2.1 开启侧边栏
      • 2.2 模拟服务器的两种创建方式
      • 2.3 私有模拟器的 API 秘钥的用法
    • 3 常见的模拟服务器用法演示
      • 3.1 Mock 服务器的工作原理
      • 3.2 模拟 GET 请求:生成指定的响应内容
      • 3.3 模拟报 500 错误码的请求
      • 3.4 模拟路径参数
      • 3.5 模拟从请求 JSON 中提取信息
      • 3.6 模拟 PUT 请求
      • 3.7 模拟第三方接口返回随机数据

写在前面
本章主要介绍了 Postman 中的模拟服务器(mock server)的基本用法。时隔四年,当初的操作界面和设置流程已经大大简化了,掌握了本章介绍的基本用法,再结合 Postman 官方文档的强大加持,模拟服务器这块基本可以在工作中胜任了。

第十二章 模拟服务器(Mock servers)在 Postman 中的创建与用法

本章概要

  • 模拟服务器的概念
  • Postman 创建模拟服务器的方法
  • Postman 设置模拟数据的方法

Postman 中的模拟服务器(mock server)经过不断地完善,现在已经比刚推出时好用很多了。本章内容看似很多,其实核心知识点只有几个。重点把握模拟服务器的工作原理和常见的数据模拟方法即可。


1 模拟服务器的概念

基本概念

  • 本书中的模拟服务器(mock server),特指 API 接口的模拟服务器;
  • 主要用途:模拟真实 API 服务器,可返回预设的 硬编码 响应。
  • 既可以模拟单一端点(简单),也可以模拟多个端点(复杂),复杂程度取决于要测试的目标。

Mock 服务器的常见应用场景:

  1. 目标应用引入了第三方 API,但又不想为了测试专门去调该接口;
  2. 前端需要测试,但后端接口尚未就绪时;
  3. 进行与后端隔开的 UI 测试时(假设架构支持),通过 Mock 服务器提高测试速度与稳定性;
  4. 需要模拟特定错误场景来测试前端的响应时。

其他注意事项:

  • Mock 服务器需要定期更新,以保持与真实服务的一致性。
  • 要确保模拟数据的准确性,避免测试结果出现偏差。
  • Postman 对普通用户仅提供每月累计 1000 次的模拟服务器总调用额度(注意:是对所有服务器的总调用次数),想要更多调用次数只能开通会员,或者换用其他免费帐号。

2 模拟服务器的创建

2.1 开启侧边栏

首先开启 Mock servers 侧边栏:

图 12.1 点击侧边栏配置图标,并开启 Postman 模拟服务器侧边栏

【图 12.1 点击侧边栏配置图标,并开启 Postman 模拟服务器侧边栏】

2.2 模拟服务器的两种创建方式

创建模拟服务器的方法主要有 两种

  1. 从专门的 Mock servers 侧边栏创建:

    img12.3

  2. Collection 测试集合中创建:

    img12.2

具体创建根据界面提示进行即可,都没有什么难度。

书中演示的是第一种,并且是从同步创建一个新的 Collection 集合开始:

图 12.2 Postman 模拟服务器创建页面详解

【图 12.2 Postman 模拟服务器创建页面详解】

2.3 私有模拟器的 API 秘钥的用法

最后一项可将该模拟服务器变为私有服务器,除非提供有效的 API 秘钥,否则任何人都无法访问。API 秘钥通过个人帐号的设置页(https://web.postman.co/settings/me/api-keys)创建:

图 12.3 设置私有模拟服务器时需要的 API 秘钥的创建页面截图

【图 12.3 设置私有模拟服务器时需要的 API 秘钥的创建页面截图】

创建好后,将秘钥存为一个变量(如 api_key),然后在测试请求的 Authorization 标签作如下配置即可:

图 12.4 用于访问私有模拟服务器的 API 秘钥的具体用法示例

【图 12.4 用于访问私有模拟服务器的 API 秘钥的具体用法示例】

3 常见的模拟服务器用法演示

3.1 Mock 服务器的工作原理

按照刚才的流程创建出 Mock 服务器后,Postman 会自动生成一个同名的 Collection 测试集合,并在该集合下创建一个名为 url 的变量存放其基础 URL,操作起来很轻松(Mock serverCollection 尽管同名,但各自的图标有所不同):

图 12.5 创建好 Mock 服务器后,Postman 会自动创建同名集合与 url 变量

【图 12.5 创建好 Mock 服务器后,Postman 会自动创建同名集合与 url 变量】

Postman 中使用 Mock 服务器,其实就是通过对 请求示例 的各种配置,实现各种想要的 响应效果

图 12.8 在 Postman 使用 Mock 服务器的基本流程

【图 12.8 在 Postman 使用 Mock 服务器的基本流程】

3.2 模拟 GET 请求:生成指定的响应内容

通过修改请求示例的状态码和响应正文(Body),可以模拟想要的响应内容:

图 12.9 修改请求示例的响应内容截图

【图 12.9 修改请求示例的响应内容截图】

注意,修改示例后 一定要保存,否则修改内容无法生效

另外,响应正文的 JSON 代码也支持 Alt + Shift + F 格式化,与 VSCode 一致,非常贴心。

3.3 模拟报 500 错误码的请求

除了模拟正常情况,还可以新增一个示例,模拟请求报 500 错误的情况。方法只需两步:

  1. 新建一个示例(Example),状态码改为 500,响应内容自拟;
  2. 在测试请求的请求头添加 x-mock-response-code 属性,值设为 500 即可;

示例的设置如下:

img12.10

对应的请求设置及测试结果如下:

img12.11

3.4 模拟路径参数

需求:从路径中获取 task_id,并将该信息放入响应正文中。

方法:

  1. 定义示例:

    1. URL 改为 {{url}}/tasks/{{task_id}}

    2. 状态码暂定 200;

    3. 在响应正文中通过以下语法引用 task_id

      {"description":"Mock Task {{task_id}}","status":"Draft"
      }
      
  2. 修改测试请求:URL 直接写 {{url}}/tasks/{{task_id}} 即可。

实测情况:

图 12.10 路径参数的定义和获取该参数的写法示例

【图 12.10 路径参数的定义和获取该参数的写法示例】

图 12.11 实测请求参数的定义与捕获情况(符合预期)

【图 12.11 实测请求参数的定义与捕获情况(符合预期)】

3.5 模拟从请求 JSON 中提取信息

需求:从创建待办事项的 POST 请求体 JSON 中,提取 descriptionstatus 字段信息,并作为响应内容的一部分。

方法:

  1. 创建一个名为 Create TaskPOST 请求:URL 设为 {{url}}/tasks,状态栏填 201 Created,请求体的 JSON 内容如下:

    {"description": "Read this book","status": "Draft","created_by": "user1"
    }
    
  2. 再在该请求下创建一个同名示例 Create Task,其请求方式、URL、状态信息均与上述请求一致,唯独响应体内容不同:

    {"description": "{{ $body 'description' }}","status": "{{ $body 'status' }}"
    }
    

    img12.14

  3. 保存示例,回到 POST 请求,发送请求即可看到如下效果:

    img12.15

重要提示

$body 是 Postman 引用请求体对象的固定写法;访问其中的某个属性要写成 {{ $body 'key_name' }} 的形式,并且为了返回正确的数据类型,括号两边必须加引号,这一点书中是忽略的,很容易出现类型报错。

3.6 模拟 PUT 请求

除了引用请求体的属性值,Postman 还支持对该属性设置默认值。例如,需要响应的 JSON 包含两个字段 descriptionstatus,示例还可以这样设置默认值:

{"description": "{{$body 'description' 'Mock Task {{task_id}}'}}","status": "{{$body 'status' 'Draft'}}"
}

上述代码中,如果请求体的 description 字段有效,则使用该字段值,否则以默认值 "Mock Task {{task_id}}" 进行响应,这里的 {{task_id}} 即上面演示过的路径参数。同理,如果 status 能拿到有效值,则响应时返回对应的 status 属性值,否则按默认值 "Draft" 处理。

实测示例:

img12.16

实测请求1:两个属性值均有效

img12.17

实测请求2:仅 description 有效

img12.18

实测请求3:仅 status 有效

img12.19

注意

经实测,Postman 判定某个字段是否有效的方法,其实就是看该字段是否存在。如果存在,但赋值为 ""null"undefined",都会被视为有效值,如果不符合 JSON 语法规范,则会直接报 400 错误:

图 12.12 违反 JSON 语法规范强行发送请求,Postman 将按 400 报错处理

【图 12.12 违反 JSON 语法规范强行发送请求,Postman 将按 400 报错处理】

3.7 模拟第三方接口返回随机数据

Postman 内置了大量随机变量,以应对各种需要设置随机值的情况,例如城市名称 $randomCity、基于 uuid-v4 的唯一标识字符串 $guid 等,底层参考的是著名的第三方前端随机模块 Faker(详见:https://www.npmjs.com/package/@faker-js/faker)。更多内置变量列表及用法,详见 Postman 官方文档:https://learning.postman.com/docs/tests-and-scripts/write-scripts/variables-list/。

书中给出的示例写法为:

{"country": "US","city": "{{$randomCity}}","language": "en_US","street": "{{$randomStreetAddress}}","Currency": "USD","id": "738964000000291009","state": "New York","first_name": "{{$randomFirstName}}","email": "{{$randomEmail}}","zip": 12345,"created_time": "{{$randomDateRecent}}","last_name": "{{$randomLastName}}","time_zone": "GMT","phone": "{{$randomPhoneNumber}}","dob": "{{$randomDatePast}}","status": "active"
}

可以得到如下结果:

{"country": "US","city": "East Hardyshire","language": "en_US","street": "73801 Isadore Villages","Currency": "USD","id": "738964000000291009","state": "New York","first_name": "Kylie","email": "Piper1@hotmail.com","zip": 12345,"created_time": "Sun Feb 02 2025 20:49:40 GMT+0000 (Coordinated Universal Time)","last_name": "Purdy","time_zone": "GMT","phone": "676-353-0567","dob": "Thu Jan 09 2025 19:30:06 GMT+0000 (Coordinated Universal Time)","status": "active"
}

实测截图:

img12.21

img12.22

注意

Postman 中的内置随机变量还可以用在测试脚本中,通过 pm.variables.replaceIn() 函数进行访问,例如:pm.variables.replaceIn('{{$randomFirstName}}'),实测效果如下:

图 12.13 实测内置随机变量在 Post-response 测试脚本中的用法

【图 12.13 实测内置随机变量在 Post-response 测试脚本中的用法】


由此也可以看出引号的重要作用,千万不可忽略(感觉作者在这个细节上做得很不够,多次出现漏掉引号的情况)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】回溯算法专题③ ——排列型回溯 python

目录 前置小试牛刀回归经典举一反三总结 前置 【算法】回溯算法专题① ——子集型回溯 python 【算法】回溯算法专题② ——组合型回溯 剪枝 python 小试牛刀 全排列 https://leetcode.cn/problems/permutations/description/ 给定一个不含重复数字的数组 nums ,返…

8.原型模式(Prototype)

动机 在软件系统中,经常面临着某些结构复杂的对象的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 之前的工厂方法和抽象工厂将抽象基类和具体的实现分开。原型模式也差不多&#…

LabVIEW如何高频采集温度数据?

在LabVIEW中进行高频温度数据采集时,选择合适的传感器(如热电偶或热电阻)和采集硬件是关键。下面是一些建议,帮助实现高效的温度数据采集: 1. 传感器选择: 热电偶(Thermocouple)&am…

Kotlin 委托详解

Kotlin 委托详解 引言 Kotlin 作为一种现代化的编程语言,在 Android 开发等领域得到了广泛的应用。在 Kotlin 中,委托(Delegation)是一种强大的特性,它可以让我们以更简洁的方式实现代码的复用和扩展。本文将详细解析…

npm 和 pip 安装中常见问题总结

安装路径的疑惑:NPM 和 PIP 的安装机制 NPM 安装路径规则: 依赖安装在项目目录下: 当你运行 npm install --save-dev jest,它会在当前目录(例如 F:\)下创建一个 node_modules 文件夹,把 jest 安…

人工智能:农业领域的变革力量

在当今科技飞速发展的时代,人工智能正以前所未有的态势渗透进各个领域,农业也不例外。想象一下,未来的农田里,农民不再是弯腰劳作的形象,而是坐在高科技的“智能农场”里,悠闲地喝着咖啡,指挥着…

LLM的Deep Research功能:重构人类认知与创新的新范式

在人工智能迅速发展的今天,大语言模型(LLM)的deep research功能正在成为重构人类认知方式的关键力量。 这一突破性的技术进展不仅带来了工具层面的革新,更深刻地触及了人类认知能力的本质。 本文将从认知科学的视角出发&#xf…

【Cadence仿真技巧学习笔记】求解65nm库晶体管参数un, e0, Cox

在设计放大器的第一步就是确定好晶体管参数和直流工作点的选取。通过阅读文献,我了解到L波段低噪声放大器的mos器件最优宽度计算公式为 W o p t . p 3 2 1 ω L C o x R s Q s p W_{opt.p}\frac{3}{2}\frac{1}{\omega LC_{ox}R_{s}Q_{sp}} Wopt.p​23​ωLCox​Rs…

前端力扣刷题 | 6:hot100之 矩阵

73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 法一: var setZeroes function(matrix) {let setX new Set(); // 用于存储需要置零的行索引let setY new Set(); //…

每日一题——有效括号序列

有效括号序列 题目描述数据范围:复杂度要求: 示例题解代码实现代码解析1. 定义栈和栈操作2. 栈的基本操作3. 主函数 isValid4. 返回值 时间和空间复杂度分析 题目描述 给出一个仅包含字符 (, ), {, }, [, ] 的字符串,判断该字符串是否是一个…

集合通讯概览

(1)通信的算法 是根据通讯的链路组成的 (2)因为通信链路 跟硬件强相关,所以每个CCL的库都不一样 芯片与芯片、不同U之间是怎么通信的!!!!!! 很重要…

红黑树的封装

一、封装思路 在 STL 中 map set 的底层就是封装了一棵红黑树。 其中连接红黑树和容器的是迭代器,map set 暴露出的接口都不是自己写的,而是红黑树写的,外部接口封装红黑树接口。 所以写出红黑树为 map set 写的接口,再在上层的…

java异常处理——try catch finally

单个异常处理 1.当try里的代码发生了catch里指定类型的异常之后,才会执行catch里的代码,程序正常执行到结尾 2.如果try里的代码发生了非catch指定类型的异常,则会强制停止程序,报错 3.finally修饰的代码一定会执行,除…

使用QMUI实现用户协议对话框

使用QMUI实现用户协议对话框 懒加载用于初始化 TermServiceDialogController 对象。 懒加载 lazy var 的作用 lazy var dialogController: TermServiceDialogController {let r TermServiceDialogController()r.primaryButton.addTarget(self, action: #selector(primaryC…

C++进阶: 红黑树及map与set封装

红黑树总结整理 红黑色概述: 红黑树整理与AVL树类似,但在对树的平衡做控制时,AVL树会比红黑树更严格。 AVL树是通过引入平衡因子的概念进行对树高度控制。 红黑树则是对每个节点标记颜色,对颜色进行控制。 红黑树控制规则&…

在Qt中,slots 关键字有什么用?

有下面的Qt代码&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr…

列表标签(无序列表、有序列表)

无序列表 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><…

Kanass基础教程-创建项目

Kanass是一款国产开源免费的项目管理工具&#xff0c;工具简洁易用&#xff0c;开源免费&#xff0c;之前介绍过kanass的一些产品简介及安装配置方法&#xff0c;本文就从如何创建第一个项目来开始kanass上手之旅吧。 1. 创建项目 点击项目->项目添加 按钮进入项目添加页面…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.10 ndarray内存模型:从指针到缓存优化

2.10 ndarray内存模型&#xff1a;从指针到缓存优化 目录 #mermaid-svg-p0zxLYqAnn59O2Xe {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-p0zxLYqAnn59O2Xe .error-icon{fill:#552222;}#mermaid-svg-p0zxLYqAnn59O…

80-《红球姜》

红球姜 红球姜&#xff08;学名&#xff1a;Zingiber zerumbet (L.) Smith&#xff09;是姜科姜属多年生草本植物&#xff0c;根茎块状&#xff0c;株高可达2米。叶片披针形至长圆状披针形&#xff0c;无柄或短柄&#xff1b;总花梗长可达30厘米&#xff0c;花序球果状&#xf…