Integrationstests von Java mit Docker: Fortgeschrittene Techniken

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Integrationstests von Java mit Docker: Fortgeschrittenes Niveau

\n

Integrationstests sind ein entscheidender Schritt in der Entwicklung moderner Java-Anwendungen, insbesondere in einer Microservice-Architektur. Die Verwendung von Docker ermöglicht die Isolierung von Testumgebungen und gewährleistet Reproduzierbarkeit sowie Unabhängigkeit von externen Diensten. In diesem Artikel betrachten wir fortgeschrittene Techniken für Integrationstests von Java-Anwendungen mit Docker, einschließlich der Arbeit mit der Bibliothek Testcontainers, der Konfiguration benutzerdefinierter Container, dem Testen asynchroner Szenarien und der Integration in CI/CD-Pipelines. Das Material richtet sich an Entwickler, die bereits mit den Grundlagen von JUnit und Docker vertraut sind.

\n\n

Warum Docker für Integrationstests von Java entscheidend ist?

\n

Traditionelle Integrationstests stehen oft vor Problemen: instabile Testdatenbanken, Portkonflikte, manuelle Umgebungskonfiguration. Docker löst diese Probleme, indem es leichtgewichtige, flüchtige Container bereitstellt. Jeder Test kann seine eigene Datenbank, seinen eigenen Message Broker oder Cache starten und diese nach Abschluss automatisch zerstören. Das macht die Tests:

\n
    \n
  • Isoliert: Jedes Testszenario läuft in einer sauberen Umgebung.
  • \n
  • Reproduzierbar: Gleiches Verhalten auf dem lokalen Rechner und im CI.
  • \n
  • Parallelisierbar: Container geraten dank dynamischem Port-Mapping nicht in Konflikt.
  • \n
\n

Für Java ist die beliebteste Bibliothek Testcontainers, die eine einfache API zur Verwaltung von Containern aus Tests bereitstellt.

\n\n

Konfiguration von Testcontainers: Vom Einfachen zum Komplexen

\n

Beginnen wir mit einem grundlegenden Beispiel – dem Testen der DAO-Schicht mit PostgreSQL. Fügen Sie die Abhängigkeit in pom.xml hinzu:

\n
<dependency>\n    <groupId>org.testcontainers</groupId>\n    <artifactId>testcontainers</artifactId>\n    <version>1.19.3</version>\n    <scope>test</scope>\n</dependency>\n<dependency>\n    <groupId>org.testcontainers</groupId>\n    <artifactId>postgresql</artifactId>\n    <version>1.19.3</version>\n    <scope>test</scope>\n</dependency>
\n

Jetzt erstellen wir einen Test, der einen PostgreSQL-Container verwendet:

\n
import org.junit.jupiter.api.Test;\nimport org.testcontainers.containers.PostgreSQLContainer;\nimport org.testcontainers.junit.jupiter.Container;\nimport org.testcontainers.junit.jupiter.Testcontainers;\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.ResultSet;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\n@Testcontainers\npublic class UserRepositoryIntegrationTest {\n\n    @Container\n    private PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15")\n            .withDatabaseName("testdb")\n            .withUsername("test")\n            .withPassword("test");\n\n    @Test\n    void shouldSaveAndFindUser() throws Exception {\n        // Dynamische URL vom Container abrufen\n        String jdbcUrl = postgres.getJdbcUrl();\n        String username = postgres.getUsername();\n        String password = postgres.getPassword();\n\n        try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {\n            conn.createStatement().execute("CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name VARCHAR(255))");\n            conn.createStatement().execute("INSERT INTO users (name) VALUES ('Alice')");\n            ResultSet rs = conn.createStatement().executeQuery("SELECT name FROM users WHERE id = 1");\n            rs.next();\n            assertEquals("Alice", rs.getString("name"));\n        }\n    }\n}
\n

Testcontainers startet den Container automatisch vor den Tests und stoppt ihn danach. Für fortgeschrittene Zwecke verwenden Sie benutzerdefinierte Container (z. B. mit vorab geladenen

Blogs

Buchempfehlungen