【玩转 Postman 接口测试与开发2_017】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(下)

book cover for the 2nd version

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

文章目录

  • 第十三章 契约测试与 API 接口验证
    • 8 导入官方契约测试集合
    • 9 契约测试集合的详细配置
      • 9.1 env-apiKey 的创建与设置
      • 9.2 env-workspaceId 的设置
      • 9.3 Mock 服务器及 env-server 的配置
      • 9.4 API 测试实例的配置
      • 9.5 契约测试脚本的调试
    • 10 Postman 拦截器的用法
    • 11 契约测试的运维

写在前面
本文为第 13 章笔记的下篇,详细介绍了本书最新版中引入的契约测试模板的具体用法,并结合本地实测情况给出了大量截图。相信随着 Postman 官方对该模板的升级改造,具体的操作很可能和本文介绍的操作步骤有所不同,但这并妨碍我们了解契约测试的构建过程和相关细节。我们要学习的从来不是某个按钮的位置、某个脚本在哪儿书写,而是透过这些表象操作,能够从宏观层面构建完备的关于契约测试的知识体系。毕竟在 AI 时代的大背景下,我们应该学会主动和 AI 合作,不断调整自学的重点,不断更新 “重复造轮子” 的内涵。

(接上篇)

第十三章 契约测试与 API 接口验证

8 导入官方契约测试集合

虽然 API 标签页中的接口实例已经实现了 OpenAPI 规范和集合层的双向检查,但真正的契约测试还需要在请求前后以测试用例的形式确保各个接口的定义和功能相契合,还得要开发者针对不同的 API 集合编写大量性质相同的定制化脚本。正如第一版中看到的那样,这一步看似轻松,实现起来却非常繁琐。

为此,Postman 官方发布了一个专门用于契约测试的公共集合 Contract Test Generator,经过这几年的不断更新迭代,目前已经能够实现对目标集合实施无侵入式的契约测试,极大地省去了从零开始手写契约测试脚本的麻烦。该集合的灵感最初来自 GitHub 社区开发者 allenheltondev 于 2020 年 10 月 9 日贡献的一个开源项目 postman-contract-test-generator,由于解了大家的燃眉之急,开源后不久就被 Postman 官方复刻到 自己名下 进入长期维护并持续迭代。这就是开源的魅力——既方便了后来者,也让项目本身更加完善,同时也提高了开发者自身的影响力。本章唯一美中不足的,应该就是书中漏掉了大量的配置细节,实测时踩了不少的坑(当然也不排除从出书到实测这段时间差里,项目本身的更新迭代导致配置出现些许差异)。无论如何,我都将重新完整梳理一遍这个彩蛋级福利的用法,也算为开源社区略尽绵力吧。

首先从官方社区导入这个测试集合。在 Postman 顶部的搜索框中检索关键字 Contract Test Generator 就可以看到基于 OpenAPI v3.x 规范的测试集合 (Generator) Contract Tests - OAS3

图 13.9 在 Postman 的顶部搜索框检索契约测试生成工具

【图 13.9 在 Postman 的顶部搜索框检索契约测试生成工具】

点击后将打开对应的 API 首页,并通过右边的 Fork 按钮复刻到自己的帐号下:

图 13.10 从生成工具的文档首页点击 Fork 复刻到自己帐号下

【图 13.10 从生成工具的文档首页点击 Fork 复刻到自己帐号下】

然后在弹出的新页面确认 Fork 的相关配置,其中务必勾选与该集合关联的测试环境:

图 13.11 Fork 操作时务必勾选对应的测试环境(非常重要)

【图 13.11 Fork 操作时务必勾选对应的测试环境(非常重要)】

复制到自己名下后将在 Collection 导航页看到这样的结构:

图 13.12 复刻到自己帐号下看到的契约测试集合结构

【图 13.12 复刻到自己帐号下看到的契约测试集合结构】

9 契约测试集合的详细配置

该集合的工作原理也很简单,只要配置好测试环境中的相关参数,就能通过运行 Collection Runner 一次性得到目标集合的契约测试结果。当然,它只实现了契约测试最基本的校验逻辑,开发者可以在此基础上做进一步补充,比起从零开始编写已经好很多了。

以下是此次实测(截至 2025 年 2 月 5 日)需要补全的环境变量(先选中 Contract Test Environment 环境):

变量名变量值
env-apiKey当前个人帐号生成的有效 API 秘钥
env-workspaceId当前工作空间的唯一标识
env-server目标集合的服务器基础 URL,也可以是该集合对应的 Mock 服务器的基础 URL
env-apiId目标 API 的唯一标识
env-apiDefinitionId目标 API 定义唯一标识

书中只讲了前三个变量,其实还有很多隐含信息:

  • 为了配置示例 API 的 env-server,需要 先创建一个对应的 Mock 服务器,并填入该 Mock 服务器的 URL;否则使用导入时默认的 http://localhost:5000/budgeting/api 会报错;
  • 新版的 Generator 集合必须先发布一版 API,即指定一个 API 版本号,否则后面有个 Validate API In Workspace 请求也会报错;
  • 契约测试脚本中大量使用旧版 Postman 的断言写法,需要逐一改为最新的版本,导入必要的 npm 模块(例如 lodash 等);

下面逐一进行说明——

9.1 env-apiKey 的创建与设置

首先是 env-apiKey:为安全起见,生成的 Mock 服务器都设为私有服务器,用自己帐号生成的 API 秘钥进行加密。

图 13.13 点开 Postman 右上角的个人帐号图标,从浏览器进入对应的设置页面

【图 13.13 点开 Postman 右上角的个人帐号图标,从浏览器进入对应的设置页面】

图 13.14 找到 API keys 导航页,按 Generate API Key 按钮生成秘钥

【图 13.14 找到 API keys 导航页,按 Generate API Key 按钮生成秘钥】

图 13.15 输入一个秘钥名称,以便后续管理(如 DemoContractTesting)

【图 13.15 输入一个秘钥名称,以便后续管理(如 DemoContractTesting)】

图 13.16 复制秘钥妥善保管(注意:新生成的 API 秘钥只有一次机会可供复制,错过后只能重新生成)

【图 13.16 复制秘钥妥善保管(注意:新生成的 API 秘钥只有一次机会可供复制,错过后只能重新生成)】

图 13.17 秘钥生成后,可在列表中找到该记录,可从右边的隐藏菜单中重新生成或删除

【图 13.17 秘钥生成后,可在列表中找到该记录,可从右边的隐藏菜单中重新生成或删除】

然后就可以赋给 env-apiKey 变量(顺便将该变量的类型设为 secret):

img13.25

9.2 env-workspaceId 的设置

当前工作空间的 ID,从首页右侧的隐藏菜单项 Workspace info 获取:

img13.26

img13.27

img13.28

9.3 Mock 服务器及 env-server 的配置

找到 Collection 侧边栏,从测试集合 Budgeting API 的隐藏菜单中创建 Mock 服务器:

img13.29

img13.30

img13.31

然后填入环境变量:

img13.32

最后别忘了还要将该 URL 更新到 API 实例中的 YAML 定义文件中:

img13.33

以及最初导入 YAML 文件时自动创建的测试集合变量 baseUrl(这个坑非常隐蔽,浪费了很多次 Collection Runner 免费额度才发现问题):

img13.38

9.4 API 测试实例的配置

根据契约测试生成工具的最新版本,目标 API 实例需要先发布一个版本,具体操作如下:

img13.34

发布后的 API 实例首页如下图所示:

img13.35

接着,点击上图右侧的图标,找到 API 对应的唯一标识,以及 API 定义层的唯一标识(后续契约测试有用):

图 13.18 从 API 实例的详情信息栏找到对应 API 唯一标识与定义层标识

【图 13.18 从 API 实例的详情信息栏找到对应 API 唯一标识与定义层标识】

然后粘贴到环境变量中:

img13.37

9.5 契约测试脚本的调试

完成测试环境 Contract Test Environment 的配置后,为了提高 Collection Runner 的一次性通过率,接下来需要手动发送一遍契约测试集合中的每个请求,一边学习不同的测试脚本的写法,一边打开 Postman 的控制台,根据警告信息完善脚本。实测时发现的主要问题包括:

  • Using "_" is deprecated. Use "require('lodash')" instead.
    • 解决方案:新版 lodash 模块需要显式声明,需要在脚本开头处添加一句:const _ = require('lodash');
  • Using "postman.setNextRequest" is deprecated. Use "pm.execution.setNextRequest()" instead.
    • 解决方案:按提示改为最新版写法即可:pm.execution.setNextRequest()

接着,就可以启动 Collection Runner 了:

img13.39

【图 13.19 完成环境配置和脚本微调后,就可以启动契约测试集合的 Collection Runner 了】

第一次运行后,部分请求测试不通过:

图 13.20 首次运行后,部分请求校验未通过(有意为之)

【图 13.20 首次运行后,部分请求校验未通过(有意为之)】

根据断言提示,主要发现三类问题:

  1. Schema 对象名称的首字母没有大写:
    1. Schema 'item' begins with an uppercase letter | AssertionError: expected 'i' to equal 'I'
    2. Schema 'items' begins with an uppercase letter | AssertionError: expected 'i' to equal 'I'
    3. Schema 'itemId' begins with an uppercase letter | AssertionError: expected 'i' to equal 'I'
  2. 缺失 description 属性问题:Schema property 'item.transaction_date' has a description between 10 and 100 characters | AssertionError: expected { type: 'string', format: 'date' } to have property 'description'
  3. 缺失 example 属性问题:Schema property 'item.transaction_date' has an example | AssertionError: expected { type: 'string', format: 'date' } to have property 'example'

根据这些断言提示,回到 YAML 定义文件逐一修改后(重要提醒:不仅是定义的地方要改,所有引用了该定义的地方也要同步更新):

img13.42

再次运行 Runner

图 13.21 按要求修改 YAML 文件后,再次运行 Collection Runner 进行验证(全部通过测试)

【图 13.21 按要求修改 YAML 文件后,再次运行 Collection Runner 进行验证(全部通过测试)】

10 Postman 拦截器的用法

拦截器的作用:可用于捕获契约测试中实际用到的集合请求。

拦截器可作为逆向工程的一部分反观实际调用的接口请求,但由于需要安装 Chrome 插件,用户体验较差,仅供参考。

11 契约测试的运维

契约测试的主要目的:确保 API 提供者在修改 API 时不会违反接口契约。

责任划分:API 消费端可 偶尔运行 契约测试;主要责任仍在 供应端

契约测试的运行

  • 供应端:
    • 这些测试应作为 API 开发团队的构建流程的一部分运行。
    • 可参考第 9 章构建基于命令行的契约测试运行模式。
  • 消费端:
    • 不需要在每次更改时运行测试,因为用户界面的更改通常不会影响 API 的工作方式。
    • 可利用 Postman 的监视器机制定期检查 API 是否仍符合合同,参考第10章(使用 Postman 监控 API)。

契约测试失败的原因分析

  1. 存在 bug:需更新代码,修复 Bug。
  2. 需求变更:API 可能需要以违反契约的形式进行更改。此时需要相关方进行沟通并更新契约。

契约测试的共享

  • 必要性:合同测试需要由提供者和消费者共同访问和维护。
  • 共享方式
    • 创建一个专门的工作空间(Workspace)来存储和共享合同测试。
    • 设置工作空间的可见性为团队,并邀请相关人员加入。
    • 共享合同测试集合到该工作空间,并分配不同的角色权限(如管理员、查看者、编辑者)。
  • 注意事项:免费版 Postman 账户有请求共享限制,大量合同测试可能需要升级到付费计划。

后记
Postman 官方发布并长期维护的契约测试集合 (Generator) Contract Tests 极大地简化了 API 接口契约测试的难度,让测试人员和开发者有个可以学习参考的基础模板;尽管如此,也要清醒地意识到,想要真正发挥好契约测试的作用,还得多方参与,从长计议。毕竟当中的很多问题并非几行测试脚本就可以轻松解决的。

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

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

相关文章

使用DeepSeek R1 + 了解部署

官网注册 R1模型,推理模型 参考视频理解 理解大语言模型的本质 大模型在训练时是将内容token化的大模型知识是存在截止时间的大模型缺乏自我认知、自我意识记忆有限输出长度有限 智商理解,例如下面的DeepSeek的测试: 用DeepSeek 官网手…

2024年12月 Scratch 图形化(三级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化(三级)真题解析 中国电子学会全国青少年软件编程等级考试 一、选择题(共18题,共50分) 第 1 题 气温和对应的穿衣建议如下表所示,下列选项能正确给出穿衣建议的是?( ) A. …

深度学习-100-RAG技术之最简单的RAG系统概念和效果优化提升方向

文章目录 1 数据是基础2 Naive RAG(最简单的RAG系统)2.1 RAG周边技术2.2 标准的RAG流程2.3 RAG的潜在问题2.4 如何应对RAG的问题3 优化方向3.1 原始数据创建/准备3.1.1 易于理解的文本3.1.2 提高数据质量3.2 预检索优化3.2.1 分块优化3.2.2 添加元数据3.2.3 选对嵌入模型3.2.4 …

Gauss高斯:建表语法,存储方式,OLTP和OLAP,系统时间,数组,分组(grouping set,rollup)

数据库和表的语法 数据库 表 oracle,高斯, hive的默认存储方式都是列式存储 存储方式 高斯数据库(GaussDB)支持列式存储和行式存储 OLTP 与 OLAP OLTP(联机事务处理,Online Transaction Processing)是一种用于管理…

数据中心服务器对PCIe测试的需求、挑战和应用

人工智能和机器学习技术的迅猛发展,尤其是大语言模型(LLM)的兴起,对计算资源和数据传输速度提出了更高的要求,从而激发了对更高带宽解决方案的迫切需求。PCIe作为数据中心服务器间互联的主力军,承担着高速数…

(9)下:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同。小例子的实验

(4)本实验代码的蓝本,是伊圣雨老师里的课本里的代码,略加改动而来的。 以下是 服务器端的代码: 每当收到客户端的报文时,就测试一下对应的 epoll 事件里的事件标志,不读取报文内容,…

【C语言篇】“三子棋”

一、游戏介绍 三子棋,英文名为 Tic - Tac - Toe,是一款简单而经典的棋类游戏。游戏在一个 33 的棋盘上进行,两名玩家轮流在棋盘的空位上放置自己的棋子(通常用 * 和 # 表示),率先在横、竖或斜方向上连成三个…

wsl+phpstorm+xdebug|windows子系统配置phpstorm开发调试|断点调试

安装wsl 安装apache php 安装xdebug扩展,并配置 这里是通过宝塔9.4面板安装的xdebug3.0 [xdebug] xdebug.modedebug xdebug.start_with_requesttrue xdebug.discover_client_hosttrue xdebug.client_host127.0.0.1配置PHPSTORM 注意:新建服务器一定要…

VSCode源码分析参考资料

VSCode Architecture Analysis - Electron Project Cross-Platform Best Practices 中文版 VSCode 架构分析 - Electron 项目跨平台最佳实践 Sihan Li博客上的vscode源码分析系列:分析了微服务架构、事件体系、资源管理、配置系统等 文召博客上的vscode 源码解析…

20250204将Ubuntu22.04的默认Dash的shell脚本更换为bash

20250204将Ubuntu22.04的默认Dash的shell脚本更换为bash 2025/2/4 23:45 百度:dash bash https://blog.csdn.net/2201_75772333/article/details/136955776 【Linux基础】dash和bash简介 Dash(Debian Almquist Shell)和 Bash(Bou…

Meta财报解读:营收超预期,用户增长放缓,AI与元宇宙仍是烧钱重点

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

如可安装部署haproxy+keeyalived高可用集群

第一步,环境准备 服务 IP 描述 Keepalived vip Haproxy 负载均衡 主服务器 Rip:192..168.244.101 Vip:192.168.244.100 Keepalive主节点 Keepalive作为高可用 Haproxy作为4 或7层负载均衡 Keepalived vip Haproxy 负载均衡 备用服务…

LabVIEW如何有效地进行数据采集?

数据采集(DAQ)是许多工程项目中的核心环节,无论是测试、监控还是控制系统,准确、高效的数据采集都是至关重要的。LabVIEW作为一个图形化编程环境,提供了丰富的功能来实现数据采集,确保数据的实时性与可靠性…

整个 PVE 系统崩溃后,怎么恢复 PVE 给虚拟机分配的虚拟硬盘中的数据

背景 我有一块 ssd 用于 PVE 系统和 虚拟机 安装,还有一块 HDD 用来存储数据。这个HDD按照 把 PVE 下的机械硬盘(非SSD系统盘)分配给虚拟机使用 进行挂载和配置。主要过程是 PVE中 “数据中信” -> “存储” -> “添加” -> “目录…

Linux: 网络基础

1.协议 为什么要有协议:减少通信成本。所有的网络问题,本质是传输距离变长了。 什么是协议:用计算机语言表达的约定。 2.分层 软件设计方面的优势—低耦合。 一般我们的分层依据:功能比较集中,耦合度比较高的模块层…

Python sider-ai-api库 — 访问Claude、llama、ChatGPT、gemini、o1等大模型API

目前国内少有调用ChatGPT、Claude、Gemini等国外大模型API的库。 Python库sider_ai_api 提供了调用这些大模型的一个完整解决方案, 使得开发者能调用 sider.ai 的API,实现大模型的访问。 Sider是谷歌浏览器和Edge的插件,能调用ChatGPT、Clau…

STM32 串口发送与接收

接线图 代码配置 根据上一章发送的代码配置,在GPIO配置的基础上需要再配置PA10引脚做RX接收,引脚模式可以选择浮空输入或者上拉输入,在USART配置串口模式里加上RX模式。 配置中断 //配置中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE…

猫眼前端开发面试题及参考答案

对网络了解吗?说一下 OSI 七层模型 OSI 七层模型是国际标准化组织(ISO)制定的一个用于计算机网络通信的概念模型,从下到上依次为: 物理层:主要负责处理物理介质上的信号传输,包括电缆、光纤、无…

Ubuntu 24.04 安装 Poetry:Python 依赖管理的终极指南

Ubuntu 24.04 安装 Poetry:Python 依赖管理的终极指南 1. 更新系统包列表2. 安装 Poetry方法 1:使用官方安装脚本方法 2:使用 Pipx 安装 3. 配置环境变量4. 验证安装5. 配置 Poetry(可选)设置虚拟环境位置配置镜像源 6…

挑战项目 --- 微服务编程测评系统(在线OJ系统)

一、前言 1.为什么要做项目 面试官要问项目,考察你到底是理论派还是实战派? 1.希望从你的项目中看到你的真实能力和对知识的灵活运用。 2.展示你在面对问题和需求时的思考方式及解决问题的能力。 3.面试官会就你项目提出一些问题,或扩展需求…