Testcontainers導入ガイド:Javaテストにおける環境依存性の悩みを解消する魔法のライブラリ


Testcontainers導入ガイド:Javaテストにおける環境依存性の悩みを解消する魔法のライブラリ

testcontainers/testcontainers-java

2025-10-17

今回解説するのは、Javaのテストの世界で絶大な人気を誇るライブラリ、Testcontainersです。

Testcontainersは、Javaのユニットテストや統合テストをサポートするためのライブラリです。

「推し」がDockerコンテナで動かせるものなら、どんなものでも、テストのためだけに、手軽に立ち上げ、使い終わったら綺麗に片付けてくれる、まるで敏腕マネージャーのような存在です。

Testcontainersは、従来のテスト手法が抱えていたいくつかの大きな悩みを解消してくれます。これは、推し活の「遠征先での宿泊や移動の手配」を自動でやってくれるようなものです!

従来のテストの悩みTestcontainersによる解決
環境依存性開発者のPC、CI/CD環境など、どこでも同じ本番に近い環境をDockerで再現可能。**「私の環境では動いたのに!」がなくなります。
外部リソースの準備データベースやメッセージキューの準備・起動・データ投入・クリーンアップといった面倒な作業が不要**。テストコードに書くだけで自動実行されます。
テストの隔離テストごとに使い捨てのコンテナ(データベースなど)を立ち上げるため、他のテストの影響を受けず、テストの信頼性が向上します。
本番環境とのギャップ組み込みデータベース(例: H2)ではなく、本番で使うのと同じ PostgreSQLやMySQLをテストで利用できるため、本番環境に近いテストが実現します。

つまり、Testcontainersを使えば、インフラの準備にかかる時間をゼロにして、アプリケーションロジックのテストという推しのパフォーマンス向上に全力を注げるようになるんです!

Testcontainersを使うには、いくつかの前提条件と、依存関係の設定が必要です。

Dockerが動作している環境が必要です。Testcontainersは、すべての裏方作業をDockerに任せているからです。

使用するテストフレームワーク(JUnit 5が一般的)と、テストしたいコンテナ(ここではPostgreSQLを例に)に合わせて、依存関係を追加します。

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>junit-jupiter</artifactId> <version>最新バージョン</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>postgresql</artifactId> <version>最新バージョン</version>
    <scope>test</scope>
</dependency>
dependencies {
    // 他の依存関係...
    testImplementation 'org.testcontainers:junit-jupiter:最新バージョン'
    testImplementation 'org.testcontainers:postgresql:最新バージョン'
}

ここでは、実際のPostgreSQLデータベースを使った統合テストのサンプルコードを紹介します。

このテストでは、@Containerアノテーションを付けるだけで、PostgreSQLのコンテナが自動で起動・停止します。

package com.example.app;

import org.junit.jupiter.api.Test;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import static org.junit.jupiter.api.Assertions.assertTrue;

// このアノテーションを付けると、テストクラス内でTestcontainersが有効になります
@Testcontainers 
class UserRepositoryIntegrationTest {

    // ★ 推しのコンテナを定義!
    // WITH_USERNAME, WITH_PASSWORD, WITH_DATABASEはPostgreSQLの特別な設定メソッド
    @Container 
    private static final PostgreSQLContainer<?> postgresContainer = new PostgreSQLContainer<>("postgres:13-alpine")
            .withDatabaseName("testdb")
            .withUsername("testuser")
            .withPassword("testpass");

    @Test
    void should_insert_and_retrieve_data() throws Exception {
        // Testcontainersが提供する動的なJDBC URL、ユーザー名、パスワードを取得
        String jdbcUrl = postgresContainer.getJdbcUrl();
        String username = postgresContainer.getUsername();
        String password = postgresContainer.getPassword();

        // データベースに接続
        try (Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
             Statement statement = connection.createStatement()) {

            // テーブル作成
            statement.execute("CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR(100))");
            // データ挿入
            statement.executeUpdate("INSERT INTO users (name) VALUES ('推しエンジニア')");
            
            // データ取得
            ResultSet rs = statement.executeQuery("SELECT name FROM users WHERE name = '推しエンジニア'");

            // 検証!
            assertTrue(rs.next(), "データが正しく挿入・取得されること");
        } 
        // finallyブロックでclose処理を書く必要はありません。
        // テスト終了後、Testcontainersが自動でコンテナを破棄してくれます!
    }
}

@Testcontainers
クラスに付けて、Testcontainersを使いますよ、と宣言します。

@Container
フィールドに付けて、このインスタンスがDockerコンテナですよ、と宣言します。

new PostgreSQLContainer<>("postgres:13-alpine")
使用したいDockerイメージを指定します。バージョンも指定できるのが嬉しいですね。

getJdbcUrl() など
接続情報は、コンテナが起動するたびに動的に生成されます。この動的な情報を使うことで、テストコードが環境から完全に分離されます。

このコードを実行すれば、テストのためだけにPostgreSQLが立ち上がり、テストが動いて、テストが終わったら静かに消えていく...という、完璧にクリーンな環境でのテストが実現します。


testcontainers/testcontainers-java




面接官を唸らせる!ローカル完結型PDFツール「Stirling-PDF」徹底解説

面接官本日は当社の面接にお越しいただき、ありがとうございます。面接官の山田と申します。あなた本日は貴重な機会をいただき、誠にありがとうございます!エンジニアの佐藤と申します!面接官佐藤さん、今日は何かユニークな技術について、ご自身の言葉でプレゼンしていただきたいのですが、よろしいでしょうか?


もうリモートを意識しない。XPipeで実現するシームレスなサーバー管理術

お前、散らばったサーバーの鍵(SSHキー)や、どこにあるかもわからねぇDockerコンテナ、それにKubernetesのクラスターの管理で、頭がパンクしそうになってるんだろ?俺たち「裏のエンジニア」にとっちゃ、証拠を残さず、素早く、スマートにターゲット(サーバー)へ潜り込むのが鉄則だ。そこで使えるのが、この 「XPipe」 って代物さ。


「TheAlgorithms/Java」徹底解説:実践的なアルゴリズム活用法

こんにちは!今回はソフトウェアエンジニアの皆さんにとって非常に興味深いプロジェクト、「TheAlgorithms/Java」についてお話しします。このプロジェクトは、Javaで実装された様々なアルゴリズムやデータ構造をまとめた、オープンソースのリポジトリです。まるでアルゴリズムのペットショップのように、いろんな種類のかわいい(?)アルゴリズムたちが揃っています。


「memos」こそがアタシたちの安息の地。オープンソースでプライバシーを守り抜く、セルフホストの嗜み

最近のメモアプリって、サブスクだの広告だの、余計なお世話が多いじゃない? これはそんなのとは無縁。あんたのデータはあんただけのもの。まさに「鉄壁の純愛」みたいなメモツールなのよ。それじゃあ、ママがエンジニア視点でたっぷり可愛がってあげるから、じっくり聞いていってね!


35の雑音をAIが「大吟醸」に精製!ソフトウェア開発者のための情報過多対策ツール最前線

さあ、今宵は情報過多を乗りこなすための特選ツールの飲み比べです!これが今回ご紹介する「TrendRadar」です!口に含むと、情報が雑味なく整理されて、まるでクリアな大吟醸のようにスッと入ってきます。味わい(機能) 35以上のプラットフォーム(ニュース、SNS、専門メディア)から熱点を集約し、AIが「これは重要だ!」という情報だけを厳選してくれます。さらに、AI対話分析でトレンド追跡、感情分析、相似検索など13種のディープな分析が可能。


Uptime Kuma 導入ガイド:Dockerで始めるモダンな自己監視

さあ、心配しなくて大丈夫。この私が、あなたの運命を好転させる秘密のツールを授けましょう。その名も「Uptime Kuma」です!さて、あなたのシステムの未来を映し出す、魔法の鏡があると想像してみてください。それが Uptime Kuma です。これは、あなたのサーバーやWebサイトがちゃんと動いているかどうか、寝ている間もずっと監視してくれる、素晴らしいツールです。


Kestra: ソフトウェア開発を効率化するワークフロー自動化ツール

ソフトウェアエンジニアの皆さん、こんにちは!Kestra について、まるで酒の飲み比べをするように、その特徴と魅力を分かりやすく解説します。今回は、特に Kestra を「仕事の効率を上げる最高の一杯」と見立てて、その味わいを深く探っていきましょう。


Kotlin/Javaで賢いAIエージェント作成!embabel-agent活用でゲームの達人に?コントの帝王に?

まず、embabel-agentを一言で言うと、「JVM上で動く、賢いエージェント(代理人)を作るためのフレームワーク」です。KotlinやJava、Springといった技術を使って、まるでAIが動いているかのようなアプリケーションを作ることができます。


ブラウザを操る自動化ツール入門:エンジニアのためのPuppeteer徹底解説

今回は、そんなエンジニアの皆さんにとって、きっとお役に立つこと間違いなしの強力なツール、「Puppeteer」について、まるで居酒屋で先輩が後輩に語りかけるように、分かりやすく、そしてフレンドリーに解説していきたいと思います!目次Puppeteerって、そもそも何?


Dockerで爆速構築!Androidエミュレータをコンテナ化する「HQarroum/docker-android」解説

「Androidのエミュレータを立てるだけでPCが重くなる…」「CI(継続的インテグレーション)でUIテストを自動化したいけど、設定が地獄だ…」そんな胃もたれしそうな状況を、このツールがサクッと軽くしてくれますよ。どうぞ、じっくり味わってみてください!