Zum Inhalt springen
SDETRole
SDETRole

Glossar · CI/CD und DevOps

Testcontainers

Auch genannt: Testcontainer, Testcontainers Java, Testcontainers for Java, Docker-Integrationstests

Definition

Eine Bibliothek, die echte Abhängigkeiten wie Datenbanken, Broker oder Browser aus dem Testcode heraus in Wegwerf-Docker-Containern startet und danach wieder entfernt.

Testcontainers ist eine Open-Source-Bibliothek für Java, Node.js, .NET, Go, Python und weitere Sprachen, die Docker aus Ihren Tests heraus steuert. Ein Test fordert „eine Postgres-16-Datenbank“ an, die Bibliothek startet einen Container, wartet, bis er bereit ist, liefert Ihnen die Verbindungsdaten und entfernt den Container, wenn der Test beendet ist. Sie testen gegen die echte Datenbank-Engine statt gegen einen In-Memory-Ersatz oder eine gemeinsam genutzte Umgebung.

Beispiel (Testcontainers for Java 1.x, JUnit 5)

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 static org.junit.jupiter.api.Assertions.assertTrue;

@Testcontainers
class DatabaseIT {

    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine");

    @Test
    void canQueryTheDatabase() throws Exception {
        try (Connection conn = DriverManager.getConnection(
                postgres.getJdbcUrl(), postgres.getUsername(), postgres.getPassword());
             ResultSet rs = conn.createStatement().executeQuery("SELECT 1")) {
            assertTrue(rs.next());
        }
    }
}

Ein static-Feld teilt sich einen Container für alle Tests der Klasse; ein Instanzfeld würde für jeden Test einen neuen starten. In einer echten Suite würden Sie Ihr Repository oder Ihren Spring-Kontext auf getJdbcUrl() richten und zuerst die Migrationen ausführen.

Warum es wichtig ist

Integrationstests gegen H2 oder SQLite bestehen oft, während die Produktionsdatenbank dasselbe SQL ablehnt, weil sich Dialekte, Constraints und Transaktionsverhalten unterscheiden. Testcontainers gibt Ihnen die echte Engine mit fast dem Komfort eines Mocks, und jeder Lauf startet in einem sauberen Zustand, was Flakiness durch geteilte Daten beseitigt.

Was Sie wissen sollten

  • Es braucht eine Docker-kompatible Laufzeitumgebung auf dem Rechner und auf den CI-Runnern. Die von GitHub gehosteten Ubuntu-Runner haben Docker verfügbar.
  • Der Containerstart kostet Sekunden. Teilen Sie Container pro Klasse oder pro Suite und setzen Sie die Daten zwischen den Tests zurück, statt den Container neu zu starten.
  • Pinnen Sie Image-Versionen passend zur Produktion.
  • Für gängige Dienste gibt es fertige Module (Postgres, MySQL, Kafka, LocalStack, Selenium und weitere), und GenericContainer deckt jedes andere Image ab.
  • Es ergänzt Test Doubles, statt sie zu ersetzen: Unit-Tests sollten weiterhin im Speicher und schnell bleiben.

Tippen Sie, um SDETRole zu durchsuchen.

Volltextsuche mit Pagefind · läuft in Ihrem Browser Suchseite öffnen →