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

book cover for the 2nd version

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

文章目录

  • 第十三章 契约测试与 API 接口验证
    • 1 契约测试的概念
    • 2 契约测试的工作原理
    • 3 契约测试的分类
    • 4 DeepSeek 给出的契约测试相关背景
    • 5 契约测试在 Postman 中的创建方法
    • 6 API 实例的基本用法
    • 7 API 实例的类型实时检查

写在前面
由于微服务和 DevOps 持续集成工作流的需要,API 契约测试逐渐受到人们的关注。本章也是第二版全新升级的内容,创新引入了一个开源项目实现了对目标集合的无侵入式契约测试。但也是因为这部分内容介绍得很不完整,导致我在实际练手时走了很多弯路。特此梳理出来,方便后续复盘。由于篇幅较长,特分为上下两篇进行梳理。本篇为上篇,介绍契约测试的基本概念和在 Postman 中的创建方法。下篇重点演示契约测试生成工具的详细用法,敬请关注。

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

本章概要

  • 理解契约测试相关概念
  • 契约测试在 Postman 中的设置方法
  • 契约测试的执行与维护

1 契约测试的概念

定义:契约测试是确保两个不同的软件服务实现相互通信的一种方式。

API 接口其实就是一份契约:它规定了客户端调用后台服务时必须遵守的一套规则。

契约测试就是对该契约进行检查,确保不出岔子。

2 契约测试的工作原理

契约测试的意义在于,允许人们只验证契约本身是否正确,而无需包含完整的 API 调用。最好是让该契约通过像 OpenAPI 这样的规范完整记录下来 1

从本质上讲,Mock 服务器也是一个契约,可供前端或 API 消费端使用;但其缺陷也很明显:后端无法调用该契约。如果模拟服务器与真实的后端接口不一致,只能逐一排查 Mock 中的各个示例,既耗时又低效。

理想中的契约测试应该是接口供应方也能运行测试的一套 API 接口,可以验证其变更不影响、不破坏消费方的正常使用。例如,对比一个普通的端点测试:

pm.test("Check the name", function () {const jsonData = pm.response.json();pm.expect(jsonData.name).to.eql("Bob");
});

上述代码换作契约测试,则更侧重于是否获取了正确的数据类型(字符串),以及 name 字段是否为响应对象的一级属性。

3 契约测试的分类

按照由哪一方制定契约,契约测试可分为两大类:

  • Consumer-driven contracts:消费者驱动契约(CDC),由 API 消费者定义契约,明确其需求;
    • 优点:
      • 确保 API 提供对消费者有价值的功能;
      • 有助于了解消费者的使用习惯,避免破坏现有工作流。
    • 缺点:
      • 多个消费者的契约测试可能导致冗余和低效;
      • 消费者的特殊需求或将限制 API 的升级改造。
  • Provider-driven contracts:提供者驱动契约(PDC),由 API 提供者定义契约,具有明确支持的数据格式和行为;
    • 优点:
      • 提供者可以明确限定接口用法,避免对未定义行为的依赖;
      • 扩展性更好,适用于存在大量用户的场景。
    • 缺点:
      • 缺乏消费者反馈,难以察觉用户的特有用法和操作习惯;
      • 可能更容易破坏用户所依赖的功能。

知识拓展

本节还提到了著名的 海勒姆定律(Hyrum’s Law)

With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody.
如果一个 API 接口的用户足够多,那么在契约中承诺什么并不重要,因为系统可观测到的一切行为都将被某一部分用户所依赖。

—— Hyrum’s Law

这就意味着:无论契约如何定义,用户总会以预料之外的方式使用 API,契约测试有助于减少破坏性变更。

4 DeepSeek 给出的契约测试相关背景

由于本章对契约测试的介绍还是过于基础,我又结合 DeepSeek 对契约测试的相关背景做了一番了解,一并整理如下:

  1. 微服务架构的普及
  • 背景:随着微服务架构的广泛应用,系统被拆分为多个独立服务,服务间的通信变得复杂。
  • 挑战:服务接口的频繁变更容易导致集成问题,传统的集成测试难以应对这种快速变化。
  • 解决方案:契约测试通过定义服务间的接口契约,确保各服务在独立开发和部署时仍能正确交互。
  1. 持续交付与 DevOps 的推广
  • 背景:持续交付和 DevOps 要求快速、频繁地发布软件,同时保持高质量。
  • 挑战:传统测试方法耗时,难以满足快速发布的需求。
  • 解决方案:契约测试作为自动化测试的一部分,能在开发早期发现问题,提升发布效率。
  1. 分布式系统的复杂性增加
  • 背景:现代系统依赖大量第三方服务或云服务,增加了集成的复杂性。
  • 挑战:依赖服务的变更可能导致系统故障,传统测试难以覆盖所有场景。
  • 解决方案:契约测试通过模拟依赖服务的行为,确保系统在依赖变更时仍能正常工作。
  1. 工具和框架的成熟
  • 背景:随着 PactSpring Cloud Contract 等工具的发展,契约测试变得更加易用。
  • 影响:这些工具降低了实施契约测试的门槛,推动了其普及。
  1. 行业最佳实践的推广
  • 背景:越来越多的公司通过博客、会议分享契约测试的成功经验。
  • 影响:这些实践案例为其他团队提供了参考,进一步推动了契约测试的流行。
  1. 测试左移的趋势
  • 背景:测试左移强调在开发早期进行测试,以减少后期修复成本。
  • 挑战:传统测试方法难以在早期阶段有效实施。
  • 解决方案:契约测试在开发初期定义接口契约,帮助团队尽早发现集成问题。

总结

契约测试的流行是微服务架构、持续交付、分布式系统复杂性增加等多重因素共同作用的结果。随着工具和最佳实践的成熟,契约测试逐渐成为现代软件开发中不可或缺的一部分。

5 契约测试在 Postman 中的创建方法

接下来就开始了本章的填坑之旅——看似很丝滑的操作实测后才发现每一步都很艰难,因为作者漏掉了很多关键细节……

作者沿用了第 3 章制定的基于 OpenAPI 规范的预算管理 API 接口文件(即 budgeting.yaml,详见:https://github.com/PacktPublishing/API-Testing-and-Development-with-Postman-Second-Edition/blob/main/Chapter13/budgeting.yaml)。

先通过 Postman 左上角的 Import 按钮导入该文件:

img13.1

接着在弹出的窗口中拖入 budgeting.yaml 文件或点击上传:

img13.2

在弹出的新页面中确认选中 OpenAPI 这项,并且在下方的导入配置中,必须确认参数生成模式是按 Schema 生成的:

img13.3

img13.4

这样就会在 Postman 的 API 侧边栏看到用于演示本章契约测试的 API 实例:

图 13.1 初始导入 budgeting.yaml 文件后看到的契约测试 API 实例

【图 13.1 初始导入 budgeting.yaml 文件后看到的契约测试 API 实例】

6 API 实例的基本用法

导入成功后,按照之前的配置,Postman 会根据 YAML 文件自动生成一个 Definition 定义层(用于存放导入的 YAML 文件),以及一个同名的测试集合层 Budgeting API

图 13.2 基于导入的 OpenAPI 规范文件,由 Postman 自动生成的 API 实例结构

【图 13.2 基于导入的 OpenAPI 规范文件,由 Postman 自动生成的 API 实例结构】

该 API 实例的最大特点在于:定义层的任何内容变更,通过相关的同步设置,都将与下方的集合层保持一致。此外,侧边栏 Collection 标签中也会生成一个同名的测试集合。经实测,该集合的主要作用是创建契约测试所必需的 Mock 服务器,但并非主要关注对象;本章所有的核心操作都在 API 标签中。

开启定义层与集合层的同步方法如下图所示:

图 13.3 定义层与集合层的变更同步配置启用方法

【图 13.3 定义层与集合层的变更同步配置启用方法】

DIY 实测:将定义层中的 /items 路径改为 /changedItems,观察集合层同步后的效果。

img13.8

单击集合层,并在右边详情页单击该同步图标,会看到一个确认变更情况的中间页面:

img13.9

img13.10

同步后的最终结果如下:

图 13.4 通过自动同步新增的两个测试请求

【图 13.4 通过自动同步新增的两个测试请求】

实测发现,同步只是将请求的 URL 更新了,但没有像书中说的那样,将它们移动到 items 文件夹下;即使改回原值,同步后也无法回到 items 文件夹中,并且同步设置无法关联到 Collection 侧边栏中的同名集合。这只能说明 Postman 在同步功能上还有瑕疵,目前仅支持导入时自动创建子文件夹;同步时仅在 URL 实现了与 YAML 定义层的同步,想要达到书中所说的 完美还原,还得手动操作。

7 API 实例的类型实时检查

另一个真正强大的地方在于,定义层与集合层真正实现了类型检查的实时同步:

图 13.5 任意变更示例中的属性值类型,Postman 会自动实时出现告警提示

【图 13.5 任意变更示例中的属性值类型,Postman 会自动实时出现告警提示】

图 13.6 单击请求上方的告警图标,还可以看到具体的报错原因

【图 13.6 单击请求上方的告警图标,还可以看到具体的报错原因】

同理,如果调整定义层中的字段类型,集合层中受影响的所有请都会出现告警图标。例如将 item 中的 amount 属性从 integer 改为 number,集合层中的三个请求都将提示类型问题:

图 13.7 将定义层从的 amount 类型改为 number 并保存

【图 13.7 将定义层从的 amount 类型改为 number 并保存】

图 13.8 amount 改为 number 类型后,受影响的测试请求都将校验失败

【图 13.8 amount 改为 number 类型后,受影响的测试请求都将校验失败】

但是,像这样的类型双向同步检查虽然强大,却并不是本章想要的契约测试。本章后续将通过一个专门的契约测试生成工具,实现目标集合的无侵入测试。但也是因为没有完整介绍新增的这部分内容,导致后期实测时走了很多弯路。

(上篇完)


  1. 详见本书第三章内容(自学笔记正在整理中) ↩︎

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

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

相关文章

proxmox通过更多的方式创建虚拟机

概述 作为一名资深运维工程师,我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机: 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…

【分布式架构理论3】分布式调用(2):API 网关分析

文章目录 一、API 网关的作用1. 业务层面:简化调用复杂性2. 系统层面:屏蔽客户端调用差异3. 其他方面: 二、API 网关的技术原理1. 协议转换2. 链式处理3. 异步请求机制1. Zuul1:同步阻塞处理2. Zuul2:异步非阻塞处理 三…

使用线性回归模型逼近目标模型 | PyTorch 深度学习实战

前一篇文章,计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 使用线性回归模型逼近目标模型 什么是回归什么是线性回归使用 PyTorch 实现线性回归模型代码执行结…

20250205——Windows系统基于ollama的DeepSeek-R1本地安装

1、安装ollama 1.1 Windows系统 打开ollama官网链接Download Ollama on Windows,根据自己的系统下载安装包,如果是Windows系统,下载Windows版本。 1.1 Linux系统 (这个是因为运行遇到报错了,想自己记录一下解决方法&a…

VSCode中使用EmmyLua插件对Unity的tolua断点调试

一.VSCode中搜索安装EmmyLua插件 二.创建和编辑launch.json文件 初始的launch.json是这样的 手动编辑加上一段内容如下图所示: 三.启动调试模式,并选择附加的进程

pytorch基于FastText实现词嵌入

FastText 是 Facebook AI Research 提出的 改进版 Word2Vec,可以: ✅ 利用 n-grams 处理未登录词 比 Word2Vec 更快、更准确 适用于中文等形态丰富的语言 完整的 PyTorch FastText 代码(基于中文语料),包含&#xff1…

JVS低代码逻辑引擎多种业务场景触发案例配置:涵盖列表页按钮、表单数据、流程审批、外部API接口调用等

逻辑引擎作为JVS低代码开发套件的核心组件,专注于业务逻辑的快速构建与实现,它扮演着程序配置与执行的核心角色,适用于多样化的应用场景。该逻辑引擎设计灵活,能够通过多种配置方式被触发,以精准响应各类业务需求并实现…

文字加持:让 OpenCV 轻松在图像中插上文字

前言 在很多图像处理任务中,我们不仅需要提取图像信息,还希望在图像上加上一些文字,或是标注,或是动态展示。正如在一幅画上添加一个标语,或者在一个视频上加上动态字幕,cv2.putText 就是这个“文字魔术师”,它能让我们的图像从“沉默寡言”变得生动有趣。 今天,我们…

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

202412 Scratch 图形化(四级)真题解析 中国电子学会全国青少年软件编程等级考试 一、选择题(共10题,共30分) 第 1 题 列表存放全班同学的身高,小猫运行下列程序,下列选项说法正确的是?( &#…

基于springboot的在线BLOG博客网

作者:学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”,支持远程部署调试、运行安装。 项目包含: 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

Colorful/七彩虹 隐星P15 TA 24 原厂Win11 家庭版系统 带F9 Colorful一键恢复功能

Colorful/七彩虹 隐星P15 TA 24 原厂Win11 家庭中文版系统 带F9 Colorful一键恢复功能 自动重建COLORFUL RECOVERY功能 带所有随机软件和机型专用驱动 支持机型:隐星P15 TA 24 文件下载:asusoem.cn/745.html 文件格式:ISO 系统版本&…

Unity游戏(Assault空对地打击)开发(3) 摄像机的控制

详细步骤 打开My Assets或者Package Manager。 选择Unity Registry。 搜索Cinemachine,找到 Cinemachine包,点击 Install按钮进行安装。 关闭窗口,新建一个FreeLook Camera,如下。 接着新建一个对象Pos,拖到Player下面…

UE Bridge混合材质工具

打开虚幻内置Bridge 随便点个材质点右下角图标 就能打开材质混合工具 可以用来做顶点绘制

【Rust自学】17.3. 实现面向对象的设计模式

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 17.3.1. 状态模式 状态模式(state pattern) 是一种面向对象设计模式,指的是一个值拥有的内部状态由数个状态对象&#xff08…

第十八章 视图

目录 一、概述 二、语法 2.1. 创建视图 2.2. 查询视图 2.3. 修改视图 2.4. 删除视图 2.5. 示例 三、检查选项 3.1. CASCADED(级联) 3.2. LOCAL(本地) 四、视图的更新 五、视图作用 5.1. 简单 5.2. 安全 5.3. 数据独…

[LeetCode]day13 19.删除链表的倒数第n个结点

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2&a…

nodejs:express + js-mdict 网页查询英汉词典,能播放声音

向 DeepSeek R1 提问: 我想写一个Web 前端网页,后台用 nodejs js-mdict, 实现在线查询英语单词 1. 项目结构 首先,创建一个项目目录,结构如下: mydict-app/ ├── public/ │ ├── index.html │ ├── st…

DeepSeek R1 简易指南:架构、本地部署和硬件要求

DeepSeek 团队近期发布的DeepSeek-R1技术论文展示了其在增强大语言模型推理能力方面的创新实践。该研究突破性地采用强化学习(Reinforcement Learning)作为核心训练范式,在不依赖大规模监督微调的前提下显著提升了模型的复杂问题求解能力。 技…

35.Word:公积金管理中心文员小谢【37】

目录 Word1.docx ​ Word2.docx Word2.docx ​ 注意本套题还是与上一套存在不同之处 Word1.docx 布局样式的应用设计页眉页脚位置在水平/垂直方向上均相对于外边距居中排列:格式→大小对话框→位置→水平/垂直 按下表所列要求将原文中的手动纯文本编号分别替换…

html的字符实体和颜色表示

在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…