コントラクトテスト こんとらくとてすと
コントラクトテストPactAPI互換性マイクロサービスコンシューマー駆動APIテスト
コントラクトテストって何?E2Eテストと何が違うの?
簡単に言うとこんな感じ!
コントラクトテストは「APIの呼び出し側と提供側が、お互いの約束(コントラクト)を守っているか確認する」テストだよ!E2EテストはシステムをまとめてBlackboxでテストするけど、コントラクトテストは「このAPIのレスポンスは必ずこのフィールドを含む」という契約を各サービスが独立して検証できるんだ。
コントラクトテストとは
コントラクトテスト(Contract Testing) とは、APIを呼び出す側(コンシューマー)と提供する側(プロバイダー)の間の「契約(コントラクト)」を自動検証するテスト手法です。
マイクロサービスアーキテクチャでは、サービス間のAPIが変わると連鎖的に障害が起きます。コントラクトテストにより、変更時に「コンシューマーが期待するレスポンス形式」が守られているかを素早く確認できます。
コンシューマー駆動コントラクトテスト
最も普及しているのはCDC(Consumer-Driven Contract)テストです。コンシューマー側が「こういうレスポンスが欲しい」という期待をコントラクトとして定義し、プロバイダーがその契約を満たすかテストします。
[コンシューマー] [プロバイダー]
↓ コントラクトを定義 ↓
↓ (期待するAPI仕様を記述) ↓
↓ → コントラクトを共有 → ↓
↓ コントラクトを検証
↓ (本物のAPIが仕様通りか確認)
Pactによるコントラクトテストの例
// コンシューマー側(期待を定義)
const interaction = {
state: 'ユーザーID:123が存在する',
uponReceiving: 'ユーザー情報の取得リクエスト',
withRequest: {
method: 'GET',
path: '/users/123'
},
willRespondWith: {
status: 200,
body: {
id: 123,
name: like('田中太郎'),
email: like('taro@example.com')
}
}
}
E2EテストとIntegration Testとの違い
| テスト種別 | 実行環境 | 検証対象 | 速度 |
|---|---|---|---|
| コントラクトテスト | 各サービス単独 | API仕様の互換性 | 速い |
| Integration Test | 複数サービス連携 | サービス間の動作 | 中程度 |
| E2Eテスト | 本番相当の全環境 | ユーザー視点の動作 | 遅い |
歴史と背景
- 2013年頃:ThoughtWorksがCDCテストの概念を体系化
- 2014年:Pact(コントラクトテストツール)がリリース
- 現在:Pact Brokerによるコントラクト管理がCI/CDに統合されるケースが増加
関連用語
- マイクロサービス — コントラクトテストが最も有効なアーキテクチャ
- E2Eテスト — コントラクトテストで代替できるE2Eテストの一部
- API設計 — コントラクトの基になるAPI仕様
- CI/CDパイプライン — コントラクトテストを自動実行する仕組み
- 結合テスト — コントラクトテストと組み合わせるテスト戦略