契约测试

用契约测试验证提供方与消费方对接口的约定:消费方定义期望并生成契约,提供方在流水线中执行验证,提前发现不兼容变更。

契约测试是什么

契约测试由消费方定义对接口的期望——什么请求、匹配规则、期望响应——生成契约文件并纳入版本库,提供方在自己的流水线里执行这些契约,验证实现是否满足所有消费方的约定。这样不兼容的改动会在合并前失败,而不是等到联调或上线后才发现。它验证的是接口约定与兼容性,不覆盖业务流程与真实数据链路,因此不能替代端到端测试;单元测试关注内部逻辑,与它同样互补。

基本信息

契约来源消费方编写期望并生成契约文件,进版本库管理
验证位置提供方流水线执行契约验证,失败阻断合并
覆盖范围请求响应结构、状态码、必要字段与兼容性
不覆盖业务流程正确性、真实数据链路与性能表现
维护要求消费方接口调用变化时同步更新契约,避免脱节

典型使用场景

  • 多消费方服务:一支服务被多个调用方依赖,新版本不得破坏任一方的期望
  • 前后端联调:前端定义期望,后端流水线验证,减少联调期间的返工
  • 微服务改造:接口迁移期间同时验证新旧契约,保证灰度切换安全
  • 第三方对接:外部系统接口变更时用契约明确约定边界
  • 发布门禁:把契约验证纳入流水线,破坏性变更在合并前拦截
  • 文档校验:契约文件同时充当接口说明的可执行版本

与其他测试的分工

手段验证内容不覆盖
契约测试请求响应约定与兼容性业务流程与真实数据链路
端到端测试核心链路贯通全部分支与边界条件
单元测试内部逻辑正确性跨系统交互
集成测试与真实依赖的交互消费方的实际使用方式

流程与门禁

流程与门禁
# 1 消费方编写期望:给定请求 → 匹配规则 → 期望响应
# 2 生成契约文件并提交到版本库,与接口代码一起评审
# 3 提供方流水线执行契约验证,作为发布前的必过步骤
# 4 不兼容变更在合并前失败,不允许绕过(例外需书面审批)
# 5 契约版本与该接口版本关联,旧契约在版本下线后一并清理
# 6 消费方接口调用方式变化时同步更新契约,避免长期脱节
契约测试不能替代端到端测试:它验证约定,不验证业务流程与真实数据链路,二者覆盖的失败类型不同,缺一都会留下盲区。
只有提供方文档而没有消费方期望时,兼容性实际上无人覆盖:文档容易过期,而契约是可执行、会被流水线强制核对的那一份。

易错点

  • 只有提供方文档没有消费方期望:兼容性实际无覆盖,破坏性变更到联调才暴露
  • 契约用例长期不更新:与实际调用脱节,验证通过但真实调用仍失败
  • 把契约测试当端到端测试:业务流程与数据链路问题被漏掉
  • 契约验证不进门禁:可以绕过,等于没有约束
  • 接口下线后旧契约未清理:流水线持续验证已废弃约定,掩盖真实变更

数据来源与参考

  • Pact 官方文档(docs.pact.io)
  • 《Building Microservices(第 2 版)》(Newman)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌