testcontainers-go für Go: Vollständige Anleitung mit Beispielen

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

testcontainers-go: Docker in Go-Tests

In der modernen Softwareentwicklung ist das Testen von Integrationen mit externen Diensten (Datenbanken, Message Brokern, Caches) eine der komplexesten Aufgaben. Traditionelle Ansätze wie gemeinsame Testdatenbanken oder Mocks führen oft zu Problemen: Tests werden anfällig, sind von der Umgebung abhängig oder bilden das tatsächliche Systemverhalten nicht ab. Die Bibliothek testcontainers-go bietet eine elegante Lösung: Sie startet isolierte Docker-Container direkt aus dem Go-Testcode und schafft so eine saubere, reproduzierbare und produktionsnahe Umgebung für jeden Testlauf.

Die Grundidee von testcontainers-go ist die programmatische Verwaltung des Lebenszyklus von Docker-Containern. Sie beschreiben den benötigten Dienst (z. B. PostgreSQL, Redis, Kafka) im Testcode, die Bibliothek lädt automatisch das Image (falls nicht vorhanden), startet den Container, wartet auf seine Bereitschaft und stellt Ihnen die Verbindungsparameter (Host, Port, Zugangsdaten) zur Verfügung. Nach dem Test wird der Container automatisch gestoppt und entfernt, ohne Rückstände zu hinterlassen. Das macht Tests unabhängig, schnell und sicher.

testcontainers-go ist die Go-Implementierung des beliebten Testcontainers-Projekts, das ursprünglich in Java entwickelt und dann auf andere Sprachen portiert wurde. Die Bibliothek wird von der Community aktiv gepflegt und bietet vorgefertigte Module für die gängigsten Dienste: PostgreSQL, MySQL, Redis, MongoDB, Kafka, RabbitMQ, Elasticsearch und viele mehr. Sie eignet sich ideal für Integrationstests, End-to-End-Tests und sogar für die lokale Entwicklung, wenn schnell eine Umgebung aufgesetzt werden muss.

Installation

Zur Installation von testcontainers-go verwenden Sie den Standard-Go-Paketmanager. Stellen Sie sicher, dass Docker (oder Podman) und Go in Version 1.19 oder höher installiert sind.

go get github.com/testcontainers/testcontainers-go

Für die Arbeit mit bestimmten Diensten (z. B. PostgreSQL) muss das entsprechende Modul installiert werden:

go get github.com/testcontainers/testcontainers-go/modules/postgres
go get github.com/testcontainers/testcontainers-go/modules/redis
go get github.com/testcontainers/testcontainers-go/modules/mongodb
go get github.com/testcontainers/testcontainers-go/modules/kafka
# usw.

Nach der Installation importieren Sie die Pakete in Ihre Testdatei:

import (
    "context"
    "testing"
    
    "github.com/testcontainers/testcontainers-go"
    "github.com/testcontainers/testcontainers-go/wait"
    "github.com/testcontainers/testcontainers-go/modules/postgres"
)

Schnellstart: Minimales funktionsfähiges Beispiel

Schreiben wir einen einfachen Test, der einen PostgreSQL-Container startet, eine Tabelle erstellt, Daten einfügt und diese überprüft. Dies zeigt Ihnen die grundlegenden Prinzipien der Bibliothek.

package main

import (
    "context"
    "database/sql"
    "testing"
    "time"

    "github.com/testcontainers/testcontainers-go"
    "github.com/testcontainers/testcontainers-go/modules/postgres"
    "github.com/testcontainers/testcontainers-go/wait"
    _ "github.com/lib/pq" // PostgreSQL-Treiber
)

func TestPostgresIntegration(t *testing.T) {
    ctx := context.Background()

    // 1. PostgreSQL-Container starten
    postgresContainer, err := postgres.RunContainer(ctx,
        testcontainers.WithImage("postgres:16-alpine"),
        postgres.WithDatabase("testdb"),
        postgres.WithUsername("testuser"),
        postgres.WithPassword("testpass"),
        testcontainers.WithWaitStrategy(
            wait.ForLog("database system is ready to accept connections").
                WithOccurrence(2).
                WithStartupTimeout(60*time.Second)),
    )
    if err != nil {
        t.Fatal(err)
    }
    defer postgres                    

Empfehlungen