consumer-driven contract test 取代 E2E 驗串接
不寫 E2E 但仍要驗「串起來對不對」時的做法:用契約的靜態相依,取代「跑起來才知道」。
長相
一份契約定義(OpenAPI / JSON schema / 共享 interface),雙向各一組測試:
- 上游 provider:verification test——用契約裡的 request/response 範例打自己的真實 handler
- 下游 consumer:拿同一份契約起 mock server 跑自己的 integration test,不再手刻假資料
三個關鍵決定
- 誰寫期望:下游先寫,上游負責滿足。 下游最知道自己要什麼,上游最容易偷改。
- 契約放哪:獨立 repo 或 monorepo 的
contracts/套件,版本化;兩側測試各留在自己 repo。 - CI 怎麼擋:上游改契約 → 跑所有已註冊 consumer 的期望,任一不滿足就擋 merge;契約發版後下游 CI 自動拉新版,不相容立刻紅。
它同時是規格的證偽機制
契約只能規範結構(欄位叫 status、enum 有 PENDING/DONE);它說不出語意(什麼條件才變 DONE、DONE 後能不能變回去)。consumer 把自己理解的語意寫成測試,上游語意一改就紅——這是唯一能證偽規格的機制,見 語意變更不能 additive-first,一律當 breaking。