【テストコンテナーズ】

Testcontainers とは?

最終更新:
💡 テスト用の本物環境をコードで『ポン』と用意

テストコードの中からDockerなどのコンテナを起動して、データベースやメッセージブローカーなどの実物を使ったテストを実行できるオープンソースのライブラリ。

📌 このページのポイント
Testcontainers ― テストからコンテナを自動起動 テストコード @Testcontainers PostgreSQL... container.start() 起動 Docker コンテナ(自動起動・停止) PostgreSQL :5432 本物のDB Redis :6379 本物のKVS Kafka :9092 本物のMQ テスト実行 本物で検証 自動停止 モック: 動作が本番と異なるリスク Testcontainers: 本物のサービスで検証
Testcontainersによるテスト用コンテナの自動管理
ひよこ ひよこ
テストでデータベースを使いたいけど、モックだと本番と動きが違って不安なんだよね…
ペンギン先生 ペンギン先生
そこでTestcontainersだよ。テストコードの中からDockerで本物のMySQLやPostgreSQLを起動して、使い終わったコンテナは片付けてくれるんだ。テストが途中で異常終了しても、Ryukという見張り役のコンテナが後始末をする仕組みもあるよ
ひよこ ひよこ
毎回コンテナを起動するの?遅くならない?
ペンギン先生 ペンギン先生
モックよりは時間がかかるよ。初回はイメージのダウンロードも必要だし、起動時間はイメージやマシン次第なんだ。だから、コンテナをテストクラスごとにまとめて1回だけ起動するといった工夫もできるよ。そのぶん『本物のデータベースで動く』という安心感は大きいよ
ひよこ ひよこ
データベース以外にも使えるの?
ペンギン先生 ペンギン先生
Redis、Kafka、Elasticsearch、LocalStack(AWS互換)など対応モジュールがたくさんあるよ。GenericContainerを使えば任意のDockerイメージもテストで使えるんだ
ひよこ ひよこ
チームのCIでも動くの?
ペンギン先生 ペンギン先生
CIの中でDocker API互換の環境が使えれば動くよ。公式ドキュメントにはGitLab CIやCircleCIなどCIごとの設定ガイドがあって、テスト自体をコンテナ内で動かすときはDocker-in-DockerやDockerソケットの共有といったパターンが紹介されているんだ
ひよこ ひよこ
テストデータの初期化とかはどうするの?
ペンギン先生 ペンギン先生
データベースのモジュールには起動時に初期化SQLを流す機能があるよ。テストごとにコンテナを作り直せば必ずまっさらな状態から始められるけど、そのぶん遅くなる。コンテナは共有して、テストごとにデータを消したりトランザクションを巻き戻したりする方法と使い分けるといいね
もっと詳しく知りたい人へ

Docker Desktopがない環境(PodmanやColimaなど)でも使える?

Testcontainers for Javaのドキュメントでは、Docker API互換のコンテナ実行環境が必要とされ、よくテストされているのはLinux上のDockerとMac・WindowsのDocker Desktopだよ。Colima、Podman、Rancher Desktopも設定次第で使えると書かれているけど、これらは日常の開発で継続的にテストされていないため、一部の機能が使えない場合があるとも注意されているんだ。手元で動かないときは、まず接続先のDockerソケットの設定を確認しよう。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Testcontainers」って出てきたら「テストの時だけDockerで本物の環境を立ち上げるツール」と思えればだいたいOK!
📖 おまけ:英語の意味
「Test Containers」 = テスト用コンテナ
💬 テスト用のコンテナをプログラムから操作するライブラリだから、そのままTest + Containersだよ

参考資料

← 用語集にもどる