【こんしゅーまーくどうけいやくてすと】

コンシューマー駆動契約テスト とは?

💡 「APIの仕様はお客さん側が決める」という逆転の発想で連携バグを防ぐ
📌 このページのポイント
コンシューマ駆動契約テスト(CDC) Consumer A Web フロント Consumer B モバイルApp 契約A: name, email 契約B: name, avatar Provider User API 全契約を満たすか検証 ① Consumer側 必要なフィールドを契約に記述 ② 契約をブローカーに登録 Pact Broker等で共有 ③ Provider側 CIで全契約をテスト実行 Consumer が必要とする最小限のインターフェースを契約として定義 Provider の変更が Consumer を壊さないことを自動保証する
コンシューマ駆動契約テストの流れ
ひよこ ひよこ

普通のAPIテストと何が違うの?

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

普通のAPIテストは提供側(プロバイダー)が「うちのAPIはこう動きます」と定義してテストする。契約テストは逆で、利用側(コンシューマー)が「うちはこういうレスポンスを期待しています」と先に宣言するんだ。お客さん目線でAPIの仕様を決めるイメージだよ。

ひよこ ひよこ

なんで利用者側が先に決めるの?

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

プロバイダーが勝手にAPIを変更して、コンシューマーが壊れるのを防ぐためだよ。マイクロサービスが増えると、あるチームがAPIのフィールド名を変えただけで5つのサービスが壊れる…みたいな事故が起きるんだ。

ひよこ ひよこ

具体的にはどうやるの?

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

まずコンシューマーチームが「このエンドポイントにGETしたら、nameフィールドとageフィールドが返る」という契約ファイルを書く。次にプロバイダーチームがその契約に対してテストを実行する。契約を満たしていればOK、破っていたらCIが失敗するんだ。

ひよこ ひよこ

Pactってどんなツール?

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

契約テストの代表的なフレームワークだよ。コンシューマー側でPactテストを書くと契約ファイル(Pactファイル)が生成される。それをPact Brokerというサーバーにアップロードして、プロバイダー側が検証する。「can-i-deploy」コマンドで本番デプロイ前に互換性を確認できるんだ。

ひよこ ひよこ

E2Eテストでよくない?

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

E2Eテストは全サービスを起動する必要があるから遅いし不安定になりやすい。契約テストはサービスごとに独立して実行できるから速くて安定しているよ。E2Eは最終確認として少数だけ走らせて、連携の検証は契約テストに任せるのが現代的なテスト戦略だね。

ひよこ ひよこ

導入するタイミングはいつがいい?

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

マイクロサービスが3つ以上になったら検討すべきだね。2つのうちはまだ管理できるけど、サービスが増えると「誰がどのAPIのどのフィールドを使っているか」が把握できなくなる。その前に契約テストを入れておくと、安心してAPIを進化させられるよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コンシューマー駆動契約テスト」って出てきたら「API利用者が仕様を決めて互換性を保証するテスト」と思えればだいたいOK!
📖 おまけ:英語の意味
「Consumer-Driven Contract Testing」 = コンシューマー駆動契約テスト
💬 マーティン・ファウラーのブログで広く知られるようになった手法だよ
← 用語集にもどる