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

相關:平行展開前要過 Definition of Ready