跳到正文

契约测试

Contract Testing

高级通用

契约测试(Contract Testing)检查两个服务约定的交互是否仍然成立,例如订单接口是否继续返回前端依赖的状态字段。它解决的是双方各自测试都通过、接在一起却因接口变化而出错的问题。

你可能会说:「前端和后端各自测试都过了,怎么提前发现接口改动会不会把页面弄坏?」

读之前建议先了解(这是一个高级概念)

动手看看

生成契约订单前端消费者测试通过接口契约status 字符串订单服务校验结果
1

前端用模拟订单响应跑通页面测试,再生成契约:查询订单时,响应必须包含字符串类型的 status 字段。

要点

  1. 1

    先找出调用方依赖的约定

    你做订单页时,页面可能只依赖订单接口返回编号和状态。契约把请求方式、必要字段及其含义等约定写成可检查的例子,而不是把整个响应原样固定下来。

  2. 2

    再让提供方验证这些约定

    前端可以作为调用方,订单服务作为提供方。前端用契约说明自己会怎样调用、期待什么结果;订单服务用自己的实现验证契约。这样后端改接口时,就能较早发现受影响的调用方。

  3. 3

    把发现问题的时间往前移

    假设后端把状态字段改名,前端页面还在读旧字段。双方各自的单元测试可能都通过,但契约验证会指出约定已被破坏。我们通常把它放进持续集成,在合并或发布前看到结果。

容易混淆的地方

契约测试关注服务之间约定的交互,不等于端到端测试:它通常不启动整条真实业务链路,所以不能证明用户一定能完成下单。它也不等于单元测试:单元测试可以检查订单服务内部怎么算金额,却未必发现前端依赖的返回字段被删了。

什么时候用

适合用

  • 你维护一个网站,前端和后端由不同人修改,想在订单接口字段变更时提前发现页面会受影响。
  • 你的后台调用第三方或内部服务,双方独立发布,需要检查调用方依赖的请求和响应约定是否还成立。
  • 多个客户端共用同一个接口,提供方准备改版,想在发布前验证已登记的调用方契约。

不适合用

  • 你只想检查一个折扣函数在不同输入下算得对不对;用单元测试更直接,没有服务间约定要验证。
  • 你想确认用户从登录到支付成功的完整流程能跑通;用端到端测试,因为契约测试不覆盖整条链路。
  • 你正在探索新功能,前后端接口还没有稳定的调用关系;先用原型或集成调试摸清交互,再决定固定哪些约定。

练一练

订单页依赖接口返回的 status 字段。后端准备把它改成 state,两边各自的测试仍然通过。你会怎样提前发现这次改动的影响?

让 AI 帮你做

请为订单页与订单服务之间增加契约测试:先找出页面实际依赖的请求和响应字段,记录调用方契约,再让服务端实现验证它。把验证接入持续集成,并说明它不能替代哪些端到端检查。

接下来学什么