Skip to content
Latchkey

integration testing とは何か?

integration testing は、各部品を分離してテストするのではなく、別々のコンポーネントが連携して正しく動作することを検証します。

コードはすべての unit test に合格しても、部品が接続されると失敗することがあります。バグはそれらの継ぎ目に潜んでいるからです。integration testing はまさにそれらの継ぎ目、つまりモジュール、サービス、外部システム間の相互作用を対象とします。

何であるか

integration test は、連携して動作する 2 つ以上のコンポーネントを実行します。データベースと通信するコード、メッセージを交換する 2 つのサービス、サードパーティシステムを呼び出す API などです。目的は、コンポーネント間の契約と前提が、実際に接続されたときに本当に成り立つことを確認することです。

unit test との違い

unit test は 1 つの関数を分離し、その協調相手を fake に置き換えることがよくあります。integration test は意図的に実際の協調相手を接続したままにするため、より現実的ですが、遅く、セットアップに手間がかかります。unit test はロジックのバグを見つけ、integration test はインターフェースと接続のバグを見つけます。

あるサービスが注文をデータベースに保存します。unit test は fake のデータベースで注文構築ロジックをチェックするかもしれません。integration test は実際の(テスト用)データベースに対して実行し、SQL が有効であること、schema が一致すること、保存されたレコードが正しく読み戻されることを確認します。fake では決して明らかにできないことです。

CI への組み込み方

integration test は通常、実際の依存関係を必要とするため、CI はテスト実行のためにデータベースやサービスを container として立ち上げることがよくあります。unit test より遅いため、通常は unit test が合格した後に実行され、最も高コストなものは変更のサブセットや schedule で実行されることがあります。

なぜ実際のバグを捉えるか

多くの production インシデントは、コンポーネント間の前提の不一致から生じます。名前が変わったフィールド、予期しない null、変更された API などです。integration test はモックのスタンドインではなく実際の相互作用をテストするため、まさにこれらをリリース前に捉えます。

重要なポイント

  • integration testing はコンポーネントが連携して動作することを検証する。
  • unit test とは異なり、実際の協調相手を接続したままにする。
  • unit test が見逃すインターフェースや接続のバグを捉える。

関連ガイド