工程效率与质量 / 进阶

微服务契约测试:在部署前发现接口不兼容

由消费者描述真实依赖,再由提供者验证契约,减少联调环境中的意外破坏。

契约描述消费者真正使用的部分

OpenAPI 能描述完整接口,但无法自动证明某个消费者依赖哪些字段和状态码。消费者驱动契约把实际交互记录成可验证样本,让提供者在合并代码前知道变更是否破坏下游。

EXAMPLE / 01契约测试
provider
  .given('订单 42 已存在')
  .uponReceiving('查询订单摘要')
  .withRequest({ method: 'GET', path: '/orders/42' })
  .willRespondWith({
    status: 200,
    body: like({ id: '42', status: 'PAID' })
  });

提供者验证必须可重复

每个 given 状态都要通过代码准备确定数据,不能依赖共享测试环境里碰巧存在的记录。验证任务应在提供者 CI 中运行,并把版本、分支和部署环境发布到契约中心。

消费者测试生成并发布契约;提供者拉取相关契约并验证;验证结果回写到契约中心;部署门禁检查目标版本是否可以安全发布。

契约测试不能替代所有集成测试

契约测试擅长检查请求与响应兼容性,却不会发现网络策略、证书、网关路由和真实身份系统配置错误。保留少量跨服务冒烟测试,验证部署环境的连接完整性。

如果消费者只需要字符串,就使用类型匹配器,不要锁死某个无关的示例值。过紧的契约会阻碍安全变更。