Testcontainers .NET für C# (.NET): Komplettguide mit Praxisbeispielen

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 .NET für C# (.NET): Komplettguide mit Praxisbeispielen

In der modernen Softwareentwicklung sind Integrationstests ein entscheidender Schritt, um die Interaktion Ihrer Anwendung mit externen Abhängigkeiten wie Datenbanken, Message-Brokern, Caches und anderen Diensten zu prüfen. Traditionell griffen Entwickler entweder auf Mocks/Stubs zurück, die keine vollständige Korrektheit garantieren, oder sie starteten Testinstanzen manuell – was aufwendig, langsam und nicht reproduzierbar ist. Die Bibliothek Testcontainers .NET löst dieses Problem grundlegend: Sie ermöglicht es, Docker-Container direkt aus Ihren Tests heraus programmatisch zu verwalten und bietet so leichte, einmalige und isolierte Umgebungen für jedes Testszenario.

Die Kernidee von Testcontainers ist es, Integrationstests genauso einfach und schnell zu machen wie Unit-Tests. Sie schreiben einfach einen Test, in dem Sie deklarieren, dass Sie z. B. PostgreSQL oder Redis benötigen. Die Bibliothek lädt automatisch das passende Docker-Image herunter (falls noch nicht vorhanden), startet den Container, wartet auf seine Bereitschaft und stellt Ihnen die Verbindungszeichenfolge zur Verfügung. Nach Abschluss des Tests wird der Container automatisch gestoppt und gelöscht. Dies gewährleistet eine saubere Testumgebung, keine „Rückstände“ und vollständige Reproduzierbarkeit auf jedem Entwicklerrechner oder CI-Server.

Testcontainers .NET ist der offizielle Port der beliebten Java-Bibliothek Testcontainers. Es unterstützt das gesamte .NET-Ökosystem, einschließlich xUnit, NUnit und MSTest. Die Bibliothek bietet vorgefertigte Module für die gängigsten Dienste (Datenbanken, NoSQL, Warteschlangen, Webserver) und ermöglicht es, benutzerdefinierte Container für beliebige Docker-Images zu erstellen. Die Verwendung von Testcontainers .NET ist der moderne Standard für zuverlässige und qualitativ hochwertige Integrationstests in der .NET-Community.

Installation

Zur Installation der Bibliothek Testcontainers .NET wird der NuGet-Paketmanager verwendet. Führen Sie den folgenden Befehl im Terminal im Stammverzeichnis Ihres Projekts oder über die Paket-Manager-Konsole in Visual Studio aus:

dotnet add package Testcontainers

Dieser Befehl installiert das Hauptpaket Testcontainers, das die Basisklassen und die Unterstützung für benutzerdefinierte Container enthält. Für die Arbeit mit bestimmten Diensten (z. B. PostgreSQL, MSSQL, Redis) benötigen Sie möglicherweise zusätzliche Pakete. Diese werden analog installiert:

dotnet add package Testcontainers.PostgreSql
dotnet add package Testcontainers.Redis
dotnet add package Testcontainers.MsSql
dotnet add package Testcontainers.MongoDb
dotnet add package Testcontainers.RabbitMq

Stellen Sie nach der Installation der Pakete sicher, dass der Docker-Daemon auf Ihrem Rechner läuft (Docker Desktop für Windows/Mac oder Docker Engine für Linux). Testcontainers kommuniziert über die Docker-API mit Docker.

Schnellstart: Minimales funktionierendes Beispiel

Schreiben wir einen einfachen Test mit xUnit, der einen PostgreSQL-Container startet, eine Tabelle erstellt, Daten einfügt und deren Auslesen überprüft. Dieses Beispiel zeigt das grundlegende Funktionsprinzip der Bibliothek.

using Testcontainers.PostgreSql;
using Xunit;
using Npgsql;

namespace MyIntegrationTests;

public class PostgresQuickStartTest : IAsyncLifetime
{
    private PostgreSqlContainer _postgresContainer;

    // IAsyncLifetime ermöglicht die Verwaltung des Container-Lebenszyklus
    public async Task InitializeAsync()
    {
        // 1. Container mit Standardeinstellungen definieren
        _postgresContainer = new PostgreSqlBuilder()
            .WithImage("postgres:15-alpine") // Image angeben
            .WithDatabase("testdb")          // Datenbankname
            .WithUsername("testuser")        // Benutzer
            .WithPassword("testpassword")    // Passwort
            .Build();                    

Empfehlungen