CDCテストとは
CDC(Consumer Driven Contract) テスト、消費者駆動契約テスト。Pact はCDCテストのフレームワークです。Pactは協定という意味。
高価で脆いE2Eテストを、高速で信頼性が高く、デバッグが容易なユニットテストに置き換えます。
以下、Consumer を FE(FrontEnd)、Provider を BE(BackEnd)とします。
何の問題を解決する手法か(なんの効果があるのか)
CDCは大規模なマイクロサービスになって、チーム数やサービス数が増えたときにテストのコストが増大する問題を解決します。テストのコストを低減する効果があります。
E2Eテストを減らし、結合テストをリバランスし、テストピラミッドを縮小することができます。
大規模なマイクロサービスのときに真価を発揮します。
Pact CIを導入する理由
チーム数やサービス数が少ない場合CDCテストの導入によるテストのコストを低減する効果はあまりないという意見もあります。大規模なマイクロサービスでなくてもPactのCIを導入したほうがよいと考える理由は、BEの結合テストでは検証できない、FEとBEのI/Fの整合性を効率よく検証できるから です。PactをCIに導入することで、テストが自動化され、開発効率が向上します。短期的には、大規模なマイクロサービスのときよりもコストを低減する効果は期待できないかもしれません。しかし、長期的には、テスト削減効果を期待できます。また、早期に導入することで、マイクロサービスの開発への対応がスムーズになります。ただし、導入コストはかかります。
FEとBEのAPI I/F の不整合が起きる場合は2つあります。
BEを変更した場合 と FEを変更した場合 です。
- BEを変更した場合
- 例えば、GET /users/123 の項目の削除したとき、FEは 項目が利用できません。FEの対応が必要です。
- FEを変更した場合
- 例えば、GET /users/123 の項目の追加したとき、BEは 項目を提供できません。BEの対応が必要になります。
→ このFEとBEのAPI I/Fの不整合をCI実行時に検出できます。
Pactの基本
How Pact works が参考になります。
Pactの基本は、3つのステップです。
- 契約ファイルの作成
- FEでモックAPIに対して、リクエストとレスポンスをキャプチャします。
- 契約ファイルの共有
- 契約ファイルには、期待するリクエストとレスポンスのインタラクションが記載されます。
- 契約ファイルで検証
- BEでリアルAPIに対して、リクエストとレスポンスを検証します。
Pactのポイント
- FEのニーズをBEが満たしているかを検証します。消費者駆動テストです。契約ファイルが仕様と一致していることが前提です。FEのPactテストは必ず正しく書かなければなりません。これは、不整合の未検出を減らします。
- 契約ファイルを介して、FEとBEを分離してテストします。契約テストです。FEとBEのテストデータを一致させる必要があります。壊れないようにするためです。これは、不整合の誤検出を減らします。
ツールの紹介
MSWとPactの統合ツールがあります。MSWで、FEチームがBEチームの開発作業と並行して、あるいは先行して作業できるようにすることができます。MSWをPactのモックAPIにすることで、CDCを導入できます。
pact-msw-adapter