📄
概念 📚 software-design-concepts

テスト種別(契約・境界)

コンシューマー駆動契約テスト(Pact)とAPIスキーマ検証によるサービス間インターフェースの安全な変更

マイクロサービスやフロントエンド/バックエンド分離アーキテクチャでは、サービス間のインターフェース(API)が暗黙の契約として機能する。この契約が壊れたとき、E2Eテストが失敗するまで問題が表面化しないことが多い。契約テストはサービス境界に着目し、コンシューマーとプロバイダーの期待値を明示的に記述することで、破壊的変更をより早い段階で検出するアプローチだ。

コンシューマー駆動契約テスト(CDCT)はコンシューマー(呼び出す側)がプロバイダーへの期待(契約)を定義し、それをプロバイダーが検証するモデルだ。PactはCDCTの代表的な実装で、コンシューマー側でモックサーバーを使ってインタラクションを記録したPactファイルを生成し、プロバイダー側でそのPactファイルを使って実際のAPIが期待を満たすかを検証する。PactBrokerはPactファイルを集中管理するサーバーであり、コンシューマーとプロバイダーの依存関係も可視化できる。

OpenAPIスキーマを使ったバリデーションはコントラクトテストの軽量な代替だ。Prismはスキーマに基づいてモックサーバーを起動したりリクエスト/レスポンスを検証したりできる。GraphQLでは@deprecatedディレクティブやgraphql-inspectorによるスキーマ変更の検知が有効だ。どのアプローチでも「破壊的変更を本番反映前に検出する」という目的は共通している。

コードレビューで着目するポイント

  • APIのレスポンス構造が変更された際にコンシューマー側のPactが更新されているか
  • Pactの契約がコンシューマーの実際の使用パターンを反映しているか(使われないフィールドが多くないか)
  • OpenAPIスキーマの変更がバージョニングポリシーに従っているか(Semver)
  • GraphQLスキーマに@deprecatedが付けられた後の削除タイムラインが明確か
  • 破壊的変更の検出をCIパイプラインに組み込んでいるか
  • コンシューマーとプロバイダーの変更が同期してデプロイされるような調整がなされているか

典型的なアンチパターン

プロバイダー主導の契約: プロバイダーが「このAPIを提供する」と一方的に定義し、コンシューマーへの影響を確認しない。コンシューマーの期待がドキュメントに反映されていない部分で破壊的変更が発生する。

契約テストのないマイクロサービス連携: サービス間の統合をE2Eテストのみで担保する。デプロイのたびに全サービスを起動してE2Eを実行するコストがかかり、フィードバックが遅い。

スキーマの形骸化: OpenAPIドキュメントが実装と乖離し、更新されないまま残る。スキーマが信頼できる情報源でなくなり、コンシューマーが手動でAPIを試して仕様を調べる状況になる。

参考リソース

  1. 1. 📄アーキテクチャスタイル
  2. 2. 📄ドメインモデリング
  3. 3. 📄モジュール分割と依存管理
  4. 4. 📄データモデリング
  5. 5. 📄API設計
  6. 6. 📄整合性とトランザクション
  7. 7. 📄非同期処理(Queue/Event)
  8. 8. 📄キャッシング
  9. 9. 📄ユーザーリサーチ
  10. 10. 📄情報アーキテクチャ
  11. 11. 📄インタラクションデザイン
  12. 12. 📄UX原則とヒューリスティクス
  13. 13. 📄アクセシビリティ(UX観点)
  14. 14. 📄UXメトリクス
  15. 15. 📄スケーラビリティ
  16. 16. 📄可用性とレジリエンス
  17. 17. 📄オブザーバビリティ
  18. 18. 📄環境・インフラ設計
  19. 19. 📄データマイグレーション
  20. 20. 📄セキュリティ設計原則
  21. 21. 📄データ保護とマルチテナント
  22. 22. 📄LLMセキュリティ
  23. 23. 📄ビジュアルデザイン原則
  24. 24. 📄デザインシステム
  25. 25. 📄コンポーネント設計
  26. 26. 📄スタイリング
  27. 27. 📄設計原則
  28. 28. 📄デザインパターン(GoF)
  29. 29. 📄エンタープライズパターン
  30. 30. 📄クリーンコード
  31. 31. 📄リファクタリング
  32. 32. 📄型設計とコントラクト
  33. 33. 📄関数型プログラミング概念
  34. 34. 📄エラーハンドリング
  35. 35. 📄テスト戦略と哲学
  36. 36. 📄テスト種別(機能テスト)
  37. 37. 📄テスト種別(UI・ビジュアル)
  38. 38. 📄テスト種別(契約・境界)
  39. 39. 📄並行処理・マルチスレッド
  40. 40. 📄パフォーマンス最適化
  41. 41. 📄ドキュメント管理
  42. 42. 📄バージョン管理と開発プロセス
  43. 43. 📄脅威モデリング
  44. 44. 📄通信保護(TLS)
  45. 45. 📄暗号化・機密情報管理
  46. 46. 📄認証・セッション管理
  47. 47. 📄認可・アクセス制御
  48. 48. 📄入力バリデーション
  49. 49. 📄インジェクション攻撃
  50. 50. 📄正規化(データベース正規化)