【こんとらくとてすと】

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

💡 サービス間の「約束事」をテストで自動チェックする信頼の契約書
📌 このページのポイント
コントラクトテスト(Consumer駆動型) Consumer (API利用側) 契約(Contract) GET /users/1 → { name: string } Provider (API提供側) 定義 検証 ① 期待を契約に記述 Consumer側テスト実行 ② 契約ファイル共有 Pact Broker等で管理 ③ 契約を満たすか検証 Provider側テスト実行 各サービスを単独でテストでき、結合テスト環境が不要 破壊的変更を事前にキャッチ → デプロイ前に互換性を確認
コントラクトテストのイメージ
ひよこ ひよこ

コントラクトテストって普通のテストと何が違うの?

ペンギン先生 ペンギン先生

普通の結合テストは実際にサービス同士を繋いで動かすけど、コントラクトテストは「API仕様の約束」だけを検証するんだ。サービスを起動しなくてもテストできるのが特徴だよ

ひよこ ひよこ

約束って具体的にどういうものなの?

ペンギン先生 ペンギン先生

たとえば「/users/1にGETリクエストを送ったら、nameフィールドが文字列で返ってくる」みたいな取り決めだね。Consumer側がこの期待を契約ファイルに書いて、Provider側がそれを満たすかチェックするんだ

ひよこ ひよこ

全部のサービスを結合テストすればいいんじゃないの?

ペンギン先生 ペンギン先生

マイクロサービスが10個あったら組み合わせが爆発するし、テスト環境の構築も大変なんだ。コントラクトテストなら各サービスを単独でテストできるから、高速で安定しているよ

ひよこ ひよこ

どんなツールを使うの?

ペンギン先生 ペンギン先生

一番有名なのはPactだね。Consumer側でテストを実行すると契約ファイル(Pact file)が生成されて、それをProvider側で再生して検証する。Pact Brokerで契約を一元管理することもできるよ

ひよこ ひよこ

Provider側がAPIを変更したらどうなるの?

ペンギン先生 ペンギン先生

契約を満たせなくなるとProvider側のテストが失敗するから、消費者に影響する破壊的変更を事前にキャッチできるんだ。「can-i-deploy」コマンドでデプロイ前に互換性を確認する運用が定番だよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コントラクトテスト」って出てきたら「API同士の約束どおりにデータをやり取りしているかを自動検証する仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Contract Testing」 = 契約テスト
💬 法律の「契約(contract)」から来ているよ。サービス同士が結ぶ取り決めをテストコードで表現するんだ
← 用語集にもどる