目标
提供方的 API 测试只证明提供方与自身一致,而那不是真正重要的契约。消费者驱动契约反转权威:每个消费者发布自己实际需要的字段,提供方必须满足所有已发布期望。那个能通过提供方测试的重命名,会在 CI 里对着消费者 pact 验证失败,失败信息里还写着受影响的团队名。
步骤要点
- 消费者测试声明依赖的字段(id/totalCents/status),多一个不要、少一个不行。
- 消费者 CI 把 pact 发布到 broker 并打上 GIT_SHA 标签。
- 提供方 CI 用 Verifier 对 broker 里所有 pact 回放真实 API,结果回写 broker。
- 验证失败即构建失败:重命名在落地瞬间被点名会破坏哪个消费者。
- 两侧发布前都跑 can-i-deploy,由 broker 判定该版本对生产中的每个消费者是否已验证通过。
排错提示
提供方验证败在测试数据不符,就按 pact 声明的 provider state 对齐状态准备并精简 fixture;pact 太多拖慢 CI 就用 broker webhook 只验有变更的消费者,全量验证放夜间与发布前;消费者不愿写 pact 就从最近一次事故的那条集成开始,契约测试靠阻止过一次事故来传播而不是靠行政命令。
适用边界
Pact 校验请求响应形状与状态语义,不覆盖性能与业务规则;broker 是共享基础设施,必须有人为它的可用性与留存策略负责。
代码示例
new Verifier({
providerBaseUrl: "http://localhost:3000",
pactBrokerUrl: process.env.PACT_BROKER_URL,
publishVerificationResult: true,
providerVersion: process.env.GIT_SHA,
}).verifyProvider();