LASSIC Media らしくメディア

2026.07.02 らしくコラム

Testcontainersで統合テストを外注で進める

LASSIC IT事業部|元請(プライムベンダー)としてシステム保守・運用を受託

統合テストのイメージ

この記事のポイント

  • Testcontainersは実物のDBやメッセージブローカーを使い捨てコンテナで起動し、モックに頼らず統合テストを行う仕組みです。
  • 導入にはCI環境でのDocker実行可否・起動時間・並列化・単体テストやE2Eテストとの役割分担の整理が欠かせません。
  • 外注する場合は対象依存関係の棚卸しとCI環境の制約整理を発注前に済ませておくことが、委託範囲を明確にする鍵になります。

Testcontainersとは何か

コンテナ実行のイメージ

Testcontainersとは、PostgreSQLやKafkaなどの実物のミドルウェアを、テストコードの実行に合わせて使い捨てのDockerコンテナとして起動・破棄し、モックを介さずに統合テストを行うためのオープンソースライブラリである*1。テスト対象のサービス依存関係をコードで定義しておき、テスト実行のたびにコンテナを作成し、テスト終了後に削除する方式を採る*1

公式サイトでは、Java・Go・.NET・Node.js・Python・Rust・Ruby・PHP・Haskell・Clojure・Elixir・Scalaなど12以上の言語向けにライブラリが提供されている*1。特定の言語・フレームワークに閉じた仕組みではなく、複数言語の開発チームが同じ考え方で統合テストを構築できる点が特徴である。

依存関係の 棚卸し DB・ブローカー 等を洗い出す テストコードで コンテナ定義 起動条件を コードに記述 CIパイプライン に組み込み Docker実行環境 を前提に組込 実行・破棄・ 並列化の運用 テスト後に自動破棄 起動時間を継続監視
Testcontainers導入の4ステップ(棚卸し→コード定義→CI組込→運用)

モックとインメモリ代替が抱える限界

単体テストではデータベースやメッセージブローカーをモックやインメモリ代替(H2など)に置き換える方法が広く使われてきた。しかし、Docker公式のガイドでは、インメモリサービスが本番環境の全機能をサポートしていない点が課題として挙げられている*1。具体例として、H2は高度なPostgreSQLやOracleの機能をサポートしないため、開発者がそれらの機能の採用をためらう可能性があると説明されている*1

さらに見過ごせないのが、フィードバックの遅延である。H2で動作するSQLクエリが本番のPostgreSQLでは失敗するケースがあり、問題が本番環境で初めて顕在化するリスクが生じる*1。テストが通っていても、実際のミドルウェアの挙動差によって不具合を見逃す構図である。

共有のテスト用データベースを複数の開発者・パイプラインで使い回す運用も、別の問題を招く。Testcontainers公式ガイドは、共有リソースを使うとテスト結果が非決定的になり得ると指摘している*2。あるテストの実行が別のテストのデータを汚染し、失敗の原因究明に時間を要する状況は、モック中心の統合テストでは避けにくい。

Testcontainersの仕組み

Testcontainersが解決を目指すのは、モックや組み込みサービスの限界を回避し、本番相当のサービスに対して信頼性の高いテストを実現することである*2。テストコード側でコンテナのライフサイクルを直接制御する点が、従来の「事前に環境を構築しておく」方式との違いである。

処理の流れは大きく3段階に分かれる。テスト実行前に必要なサービスをDockerコンテナとして起動し、アプリケーションの接続設定を更新する。続いてコンテナ化されたサービスに対してテストを実行する。最後にテストの成否にかかわらずコンテナを自動的に破棄する*1

各テストは新しいクリーンなコンテナインスタンス上で実行されるため、常に既知の状態からテストを開始できる*1。CI環境での並列実行時には、パイプラインごとに隔離されたサービスセットが用意され、テスト間のデータ競合やテスト汚染を避けられるとされている*1。コンテナの後片付けには「Ryuk」と呼ばれるサイドカーコンテナが使われ、テスト終了後のリソース削除を自動化する仕組みが用意されている*1

導入前に整理すべき論点

Testcontainers導入を検討する際は、良い面だけでなく運用上の制約も事前に把握しておく必要がある。特に次の3点は、導入前に社内で合意しておくべき論点である。

第一に、CI環境でDockerが実行できるかどうかの確認である。Testcontainers公式ガイドは、実行にDocker Desktop・Linux上のDocker Engine・Testcontainers Cloudのいずれかが必要だとしている*2。自社のCI基盤がDocker実行に対応していない、あるいはDocker-in-Dockerの構成が制限されている場合は、事前の環境整備が前提条件になる。

第二に、コンテナの起動時間と並列化の設計である。実物のミドルウェアをコンテナとして都度起動するため、モックのみのテストと比べて実行時間が長くなりやすい。CIパイプラインごとに隔離されたサービスセットで並列実行できる設計になっている一方*1、対象コンテナの数や種類が増えるほど、パイプライン全体の実行時間設計を見直す必要がある。

第三に、既存の単体テスト・E2Eテストとの役割分担である。Testcontainersを使えばIDEから直接テストを実行でき、CIの実行結果を待たずに開発者がローカルで検証できる利点がある*2。ただし、これは単体テストやE2Eテストを置き換えるものではなく、テストピラミッドの中でどの層に位置づけるかを事前に整理しておくことが欠かせない。

E2E・単体テストとの役割分担

CIでのテスト自動化のイメージ

統合テストの位置づけを誤ると、テスト全体の投資対効果が下がる。単体テストはモックで依存関係を切り離し、ロジック単体の正しさを高速に検証する領域である。これに対しTestcontainersが担う統合テストは、実物のDBやメッセージブローカーとアプリケーションの接続部分・クエリの互換性・データの永続化挙動を、本番相当の環境で検証する領域に位置づけられる。

E2Eテストとの違いも明確にしておく必要がある。E2Eテストはユーザー操作の起点からシステム全体の振る舞いを通しで検証する領域であり、画面操作やAPI呼び出しの連鎖を扱うことが多い。Testcontainersによる統合テストは、その手前でアプリケーションと個々のミドルウェアとの接続部分に検証範囲を絞る点で役割が異なる。

この役割分担が曖昧なまま導入すると、同じ観点のテストが複数の層で重複し、CI全体の実行時間だけが伸びる結果になりやすい。どの層で何を検証するのかをテスト戦略として文書化し、チーム内で共有しておくことが、Testcontainers導入の効果を左右する。

外注時の委託範囲と発注準備

Testcontainersを使った統合テスト基盤の構築を外部パートナーに委託する場合、委託範囲を発注前に明確にしておくことが望ましい。委託範囲は大きく、テスト対象の依存関係の棚卸し、テストコードでのコンテナ定義の実装、CIパイプラインへの組み込み、運用開始後の保守という4つの工程に分けられる。

依存関係の棚卸しには、対象システムが利用するDB・メッセージブローカー・キャッシュストアなどの種類とバージョンを整理する作業が必要になる。この棚卸しが不十分なまま発注すると、着手後に対象範囲が広がり、想定外の追加工数が発生しやすい。発注側であらかじめ対象コンポーネントの一覧を用意しておくことが、見積もりの精度を高める。

CI環境の制約整理も発注準備の重要な要素である。自社のCI基盤がDocker実行に対応しているか、社内ネットワークやセキュリティポリシー上の制約があるかを事前に洗い出しておく必要がある。この情報が発注時点で共有されていないと、委託先が着手後に環境調査からやり直すことになり、スケジュールに影響する。

内製で対応する場合、テストコードへのコンテナ定義の実装だけでなく、CI基盤側のDocker実行環境の整備・起動時間の監視・チーム内でのテスト戦略の合意形成まで、複数領域の知見が必要になる。これらを兼務できる人員を確保できない場合は、範囲を区切って外部パートナーに委託し、CI組み込みや運用設計の部分から段階的に内製化する進め方も選択肢になる。

まとめ:Testcontainers導入前に握る3つの論点

本稿ではTestcontainersの考え方と導入時の論点を整理した。要点を3つに集約すると次の通りである。第一に、Testcontainersはモックやインメモリ代替の限界を補い、実物のミドルウェアを使い捨てコンテナで起動して本番相当の統合テストを行う仕組みである。第二に、導入にはCI環境でのDocker実行可否・起動時間と並列化・既存テストとの役割分担という3つの論点を事前に整理する必要がある。第三に、外注する場合は依存関係の棚卸しとCI環境の制約整理を発注前に済ませておくことが、委託範囲を明確にし見積もり精度を高める。

よくある質問

Testcontainersの導入にはどの程度の準備期間が必要ですか。

必要な準備期間は対象システムの依存関係の数やCI環境の状況によって異なります。まずは対象となるDB・メッセージブローカーなどの棚卸しと、CI基盤がDocker実行に対応しているかの確認から着手することが基本の進め方です。

既存のE2EテストがあってもTestcontainersは必要ですか。

E2Eテストはシステム全体の振る舞いを通しで検証する領域で、Testcontainersはアプリケーションと個々のミドルウェアの接続部分に検証範囲を絞る点で役割が異なります*3。両者は代替関係ではなく、テストピラミッドの中で異なる層を担う関係として整理することが大切です。

CI環境でDockerが使えない場合はどうすればよいですか。

Testcontainersの実行にはDocker Desktop・Linux上のDocker Engine・Testcontainers Cloudのいずれかが必要とされています*2。自社のCI基盤が対応していない場合は、対応環境への切り替えやTestcontainers Cloudの利用など、事前の環境整備を検討することになります。

外注する場合、どこまでを委託範囲にするのが現実的ですか。

依存関係の棚卸し、テストコードでのコンテナ定義、CIパイプラインへの組み込み、運用開始後の保守という4つの工程に分けて委託範囲を検討することが現実的です。発注前に対象コンポーネントの一覧とCI環境の制約を整理しておくと、見積もりの精度が高まります。

コンテナの起動時間が長くなる場合、どのような対策がありますか。

対象コンテナの数や種類が増えるほど実行時間は伸びやすいため、CIパイプラインごとに隔離されたサービスセットで並列実行する設計を検討することになります*1。どの依存関係を統合テストの対象にするかを絞り込むことも、実行時間を抑える観点で有効です。

著者:テレリモ総研編集部 鈴木 亮佑

LASSICに相談するメリット

LASSICはIT事業部の元請(プライムベンダー)として、システム開発における設計・テスト環境の構築支援に対応しています。CI基盤の整備からテストコードの実装まで、既存の開発体制の状況に合わせた委託範囲の切り分けについてご相談いただけます。


ITアウトソーシング・システム開発のご相談はLASSICへ

元請(プライムベンダー)として、貴社の課題に合わせた体制構築・開発支援をご提案します。まずはお気軽にご相談ください。

無料相談はこちら

ご不明な点はお問い合わせフォームからもご連絡いただけます。

  1. *1 出典:Testcontainers「Testcontainers」公式サイト(https://testcontainers.com/
  2. *2 出典:Testcontainers「Getting Started」公式ガイド(https://testcontainers.com/getting-started/
  3. *3 出典:Testcontainers「Introducing Testcontainers」導入ガイド(https://testcontainers.com/guides/introducing-testcontainers/


View