Warum Unit-Tests nicht retten und wann E2E-Tests nötig sind
\n\nStellen 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\nUnit-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\nIn 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\nWas ist E2E-Testing mit C# in der Praxis?
\n\nEin 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
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\nWerkzeuge für E2E-Tests mit C#: Selenium vs. Playwright
\n\nDie Wahl des Werkzeugs ist die erste Frage, die sich einem Team stellt. Betrachten wir die beiden beliebtesten Optionen.
\n\nSelenium WebDriver
\nDer 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\nPlaywright für .NET
\nEin 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\nIn diesem Artikel zeigen wir Beispiele mit beiden Frameworks, damit Sie vergleichen können.
\n\nDen ersten E2E-Test in C# schreiben: Selenium
\n\nBeginnen wir mit dem Klassiker. Installieren Sie das Paket über NuGet:
\n\ndotnet add package Selenium.WebDriver\ndotnet add package Selenium.Support\ndotnet add package Selenium.WebDriver.ChromeDriver\n\nJetzt 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\nusing 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
Lesen Sie auch
Optimierung der Leistung von TypeScript-Anwendungen: Best Practices
Warum ein sortiertes Array schneller verarbeitet wird: Erklärung mit Java
Refactoring von Legacy-Code in JavaScript: Schritt-für-Schritt-Anleitung
Warum Java immer noch dominiert: Erfolgsgeschichte und Geheimnisse der Beliebtheit
Gehälter von JavaScript-Entwicklern in Russland: Marktüberblick 2025