テスト手法

コントラクトテスト こんとらくとてすと

コントラクトテスト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に統合されるケースが増加

関連用語