【こんとらくとてすと】

コントラクトテスト とは?

最終更新:
💡 サービス間のやり取りの約束を、双方で確かめる

コントラクトテストは、サービスの利用側と提供側がやり取りの約束を満たすか、それぞれを分離して確認するテスト。Pactのモックと提供側の実検証、結合テストとの役割の違いを解説します。

📌 このページのポイント
Pact:サービス間の約束を検証Consumerのコード要求と応答の扱いを確認モック相手期待する応答成功したやり取りを契約ファイルへ版と検証結果を管理・共有実際のProviderを検証契約の要求を送り、返る応答と比較
HTTPの例です。Providerの状態やテストデータを用意して実検証します。全サービスの同時起動は不要でも、契約外の業務フローや本番構成は別に検証します。
ひよこ ひよこ
コントラクトテストって何を確かめるの?
ペンギン先生 ペンギン先生
サービスの利用側Consumerと提供側Providerが、やり取りについて同じ期待を持っているかを確認するよ。HTTPならリクエストやレスポンス、キューならメッセージが対象になる。すべてのサービスを同時に動かす方法と違い、それぞれを分離して検証できるんだ。
ひよこ ひよこ
Pactではどうやって契約を作るの?
ペンギン先生 ペンギン先生
Consumer側で、期待するリクエストと必要なレスポンスを定義し、Pactのモック提供者へ実際のコードからリクエストするよ。その応答を正しく扱えるかも確認する。テストが成功すると、やり取りを記述した契約ファイルを生成するんだ。
ひよこ ひよこ
モックで成功すればProviderも正しい?
ペンギン先生 ペンギン先生
それだけでは分からないよ。Provider側の検証では契約に従ってリクエストを実際のProviderへ送り、返るレスポンスと比べる。必要なテストデータなどの状態も用意する。サービスを一切動かさずファイルだけを見るテスト、という意味ではないんだ。
ひよこ ひよこ
結合テストやE2Eテストは不要になる?
ペンギン先生 ペンギン先生
契約に書いた相互作用の互換性を確認できても、長い業務フロー、ネットワークや本番設定、性能などを全部検証したわけではないよ。結合テストの環境に頼る範囲を減らせる場合はあるけれど、目的の違うテストと組み合わせよう。
ひよこ ひよこ
APIを変える前に使える?
ペンギン先生 ペンギン先生
Consumerの期待を満たせなくなる変更を見つける助けになるよ。Pact Brokerへ契約と検証結果を版ごとに記録すれば、can-i-deployで対象環境の版との互換性を確認できる。ただし結果やデプロイ状況の記録が前提で、未記録の利用者や契約外の機能まで保証するものではないね。
もっと詳しく知りたい人へ

APIの全項目を完全一致させる契約にすればよい?

Pactの契約では利用側が必要とする最小限のレスポンスなどを記述し、条件に合うかを検証します。利用していない項目や変わり得る値を不必要に固定すると、互換性を壊さない変更にもテストが反応します。実際の利用コードを通して必要な期待を記録し、エラー時など重要な相互作用も含めましょう。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コントラクトテスト」って出てきたら「サービス間の約束をそれぞれで検証するテスト」と思えばだいたいOK!
📖 おまけ:英語の意味
「Contract Testing」 = 契約テスト
💬 Contractは取り決め。ここでは法的な契約ではなく、サービス間のメッセージに対する共有した期待を、テスト可能な形で扱う意味だよ。

参考資料

← 用語集にもどる