E2E-Tests mit C#: Ein Leitfaden für alle, die Bugs in der Produktion leid sind

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 Unit-Tests nicht retten und wann E2E-Tests nötig sind

\n\n

Stellen Sie sich vor: Sie haben perfekten C#-Code geschrieben. Unit-Tests sind grün, die Abdeckung beträgt 95 %, das Code-Review wurde bestanden. Sie bringen ein Release heraus, und die Benutzer schreiben: „Der Button 'Bestellung aufgeben' funktioniert nicht, wenn sich mehr als 3 Artikel im Warenkorb befinden.“ Kommt Ihnen das bekannt vor?

\n\n

Unit-Tests prüfen Methoden isoliert. Integrationstests prüfen das Zusammenspiel von Datenbank und API. Aber E2E-Tests für C#-Anwendungen (End-to-End) sind die einzige Möglichkeit, sicherzustellen, dass das gesamte System als Einheit funktioniert: Browser, Server, Datenbank, externe APIs. End-to-End-Tests simulieren die Aktionen eines echten Benutzers: Klicks, Dateneingabe, Warten auf das Laden von Seiten.

\n\n

In diesem Artikel erklären wir nicht nur die Theorie. Wir zeigen, wie man E2E-Tests in C# mit Selenium und Playwright schreibt, wie man den Code mit dem Page Object Model organisiert und wie man automatisierte Tests in CI/CD integriert. Los geht's.

\n\n

Was ist E2E-Testing mit C# in der Praxis?

\n\n

Ein E2E-Test ist ein Szenario, das den gesamten Benutzerweg durchläuft: vom Öffnen der Seite bis zum Abschluss der Zielaktion (Kauf, Registrierung, Formularabsendung). Für einen C#-Entwickler bedeutet das in der Regel:

\n\n
    \n
  • Starten eines Browsers (Chrome, Firefox, Edge) über WebDriver
  • \n
  • Suchen von Elementen auf der Seite (Buttons, Eingabefelder, Links)
  • \n
  • Durchführen von Aktionen (Klicken, Texteingabe, Auswahl aus einer Liste)
  • \n
  • Überprüfen des erwarteten Ergebnisses (Meldung erschienen, URL geändert, Daten aktualisiert)
  • \n
  • Schließen des Browsers und Bereinigen der Testdaten
  • \n
\n\n

Der Hauptunterschied zu Unit-Tests: E2E-Tests arbeiten mit der echten Benutzeroberfläche. Sie sind langsam, anfällig (abhängig von CSS-Selektoren), aber unverzichtbar für die Überprüfung kritischer Geschäftsszenarien.

\n\n

Werkzeuge für E2E-Tests mit C#: Selenium vs. Playwright

\n\n

Die Wahl des Werkzeugs ist die erste Frage, die sich einem Team stellt. Betrachten wir die beiden beliebtesten Optionen.

\n\n

Selenium WebDriver

\n

Der Industriestandard. Funktioniert über WebDriver – einen separaten Prozess, der den Browser steuert. Unterstützt alle Browser, riesige Community, tausende fertige Lösungen. Nachteil: Die Einrichtung erfordert Treiber (ChromeDriver, GeckoDriver), und Tests können aufgrund von Wartezeiten langsam sein.

\n\n

Playwright für .NET

\n

Ein jüngeres, aber bereits sehr beliebtes Tool von Microsoft. Arbeitet direkt über das DevTools-Protokoll, ohne zusätzliche Zwischenschichten. Schneller, stabiler, wartet automatisch auf das Laden von Elementen (kein explizites Thread.Sleep). Unterstützt nicht nur Browser, sondern auch mobile Emulatoren.

\n\n

In diesem Artikel zeigen wir Beispiele mit beiden Frameworks, damit Sie vergleichen können.

\n\n

Den ersten E2E-Test in C# schreiben: Selenium

\n\n

Beginnen wir mit dem Klassiker. Installieren Sie das Paket über NuGet:

\n\n
dotnet add package Selenium.WebDriver\ndotnet add package Selenium.Support\ndotnet add package Selenium.WebDriver.ChromeDriver
\n\n

Jetzt schreiben wir einen Test für eine Beispiel-Website (nehmen wir an, es ist ein Online-Shop). Wir möchten überprüfen, ob nach dem Hinzufügen eines Artikels zum Warenkorb ein Symbol mit der Artikelanzahl auf der Seite erscheint.

\n\n
using OpenQA.Selenium;\nusing OpenQA.Selenium.Chrome;\nusing OpenQA.Selenium.Support.UI;\n\npublic class CartE2ETests\n{\n    [Fact]\n    public void AddItemToCart_ShouldUpdateCartBadge()\n    {\n        using var driver = new ChromeDriver();\n        \n        // Arrange\n        driver.Navigate().GoToUrl("https://demo-store.com");\n        driver.Manage().Window.Maximize();\n        \n        // Act\n        var addToCartButton = driver.FindElement(By.CssSelector(".product-card .add-to-cart"));\n        addToCartButton.Click();\n        \n        // Wait for badge to appear\n        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));\n        var cartBadge = wait.Until(drv => \n            drv.FindElement(By.CssSelector(".cart-badge")));\n        \n        // Assert\n        Assert.Equal("1", cartBadge.Text);\n        \n        driver.Quit();\n    }\n}
\n\n

Blogs

Buchempfehlungen