E2E-Testing von Go-Anwendungen: Von der Idee zum Deployment ohne Fehler

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

Warum E2E-Testing Ihre Versicherungspolice ist

\n\n

Stellen Sie sich vor: Sie haben einen großartigen Microservice in Go geschrieben. Unit-Tests sind grün, Integrationstests auch. Sie deployen in die Produktion, und... die Benutzer beschweren sich, dass der Warenkorb nach der Bezahlung nicht geleert wird. Kommt Ihnen bekannt vor? Das Problem ist, dass E2E-Testing von Go-Anwendungen oft auf die lange Bank geschoben wird. Zu Unrecht.

\n\n

End-to-End-Tests sind die einzige Möglichkeit zu überprüfen, ob Ihr System als Ganzes funktioniert: von der HTTP-Anfrage bis zum Datenbankeintrag und zurück. In diesem Artikel sprechen wir nicht nur über die Theorie – ich zeige Ihnen echte Codebeispiele in Go, die Sie kopieren und noch heute ausführen können.

\n\n

Was ist E2E-Testing im Kontext von Golang?

\n\n

E2E-Testing von Go ist die Überprüfung eines vollständigen Benutzerszenarios: Start der Anwendung, Ausführung der Geschäftslogik, Interaktion mit externen Diensten (DB, Cache, Warteschlangen) und Überprüfung des Ergebnisses. Im Gegensatz zu Unit-Tests mocken wir die Datenbank nicht – wir starten eine echte PostgreSQL in einem Container.

\n\n

Wie unterscheidet sich E2E von Integrationstests?

\n\n

Oft werden diese Begriffe verwechselt. Lassen Sie uns Klarheit schaffen:

\n\n
    \n
  • Unit-Tests – testen eine einzelne Funktion. Schnell, isoliert.
  • \n
  • Integrationstests – testen die Verbindung von Modulen (z. B. Repository + DB).
  • \n
  • E2E-Tests – starten die gesamte Anwendung und imitieren die Aktionen eines echten Benutzers.
  • \n
\n\n

Für End-to-End-Testing in Golang verwenden wir das Standardpaket testing sowie leistungsstarke Hilfsprogramme: testcontainers-go und dockertest.

\n\n

Einrichtung der Umgebung: Docker Compose und Testcontainers

\n\n

Der einfachste Weg, E2E-Testing in Go zu organisieren, ist die Verwendung von Docker. Sie haben zwei Möglichkeiten:

\n\n

Variante 1: Docker Compose (für CI/CD)

\n\n

Erstellen Sie eine Datei docker-compose.test.yml:

\n\n
version: '3.8'\nservices:\n  db:\n    image: postgres:15-alpine\n    environment:\n      POSTGRES_DB: testdb\n      POSTGRES_USER: test\n      POSTGRES_PASSWORD: test\n    ports:\n      - "5432:5432"\n  \n  app:\n    build: .\n    depends_on:\n      - db\n    environment:\n      DATABASE_URL: "postgres://test:test@db:5432/testdb?sslmode=disable"\n    ports:\n      - "8080:8080"\n
\n\n

Variante 2: Testcontainers (für die lokale Entwicklung)

\n\n

Die Bibliothek testcontainers-go ermöglicht es, Container direkt aus den Tests heraus zu starten. Das ist mein Favorit – die Tests verwalten die Infrastruktur selbst.

\n\n
// setup_test.go\npackage e2e_test\n\nimport (\n    "context"\n    "testing"\n    "time"\n\n    "github.com/testcontainers/testcontainers-go"\n    "github.com/testcontainers/testcontainers-go/wait"\n)\n\nfunc setupPostgres(t *testing.T) string {\n    t.Helper()\n    \n    ctx := context.Background()\n    \n    req := testcontainers.ContainerRequest{\n        Image:        "postgres:15-alpine",\n        ExposedPorts: []string{"5432/tcp"},\n        Env: map[string]string{\n            "POSTGRES_DB":       "testdb",\n            "POSTGRES_USER":     "test",\n            "POSTGRES_PASSWORD": "test",\n        },\n        WaitingFor: wait.ForLog("database system is ready to accept connections").\n            WithStartupTimeout(30 * time.Second),\n    }\n    \n    container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{\n        ContainerRequest: req,\n        Started:          true,\n    })\n    if err != nil {\n        t.Fatalf("failed to start container: %v", err)\n    }\n    \n    t.Cleanup(func() {\n        container.Terminate(ctx)\n    })\n    \n    host, _ := container.Host(ctx)\n    port, _ := container.MappedPort(ctx, "5432")\n    \n    return "postgres://test:test@" + host + ":" + port.Port() + "/testdb?sslmode=disable"\n}\n
\n\n

Den ersten E2E-Test für einen HTTP-Server schreiben

Blogs

Buchempfehlungen