Testen in C#: Unit-, Integrations- und E2E-Tests für .NET-Projekte

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
```html

Testen in C#: Unit-, Integrations- und E2E-Tests – ein vollständiger Leitfaden für .NET-Entwickler



Die Qualität von Software beginnt mit Tests. Im C# (.NET)-Ökosystem gibt es eine etablierte Testkultur, die drei Schlüsselebenen umfasst: Unit-Tests (Modultests), Integrationstests und E2E-Tests (End-to-End). In diesem Artikel analysieren wir jede Ebene anhand praktischer Beispiele, zeigen die besten Bibliotheken und erklären, wie Sie eine effektive Teststrategie für Ihr .NET-Projekt aufbauen.



1. Unit-Testing in C#: Grundlage der Codequalität



Unit-Tests (Modultests) überprüfen die Arbeit einzelner Programmkomponenten – Methoden, Klassen, Funktionen – isoliert von externen Abhängigkeiten. In .NET sind die wichtigsten Frameworks xUnit, NUnit und MSTest. Das beliebteste ist xUnit aufgrund seiner Flexibilität und Integration mit .NET Core.



Bibliotheken für Unit-Tests:

  • xUnit – Hauptframework (von Microsoft empfohlen)
  • Moq – Erstellung von Mock-Objekten zur Isolation von Abhängigkeiten
  • FluentAssertions – verbesserte Assertion-Ausdrücke
  • AutoFixture – automatische Generierung von Testdaten


Beispiel eines Unit-Tests mit xUnit und Moq:



using Xunit;using Moq;using FluentAssertions;

public class OrderServiceTests{ [Fact] public void CalculateTotal_WithValidItems_ReturnsCorrectSum() { // Arrange var mockRepo = new Mock<IProductRepository>(); mockRepo.Setup(r => r.GetPrice(1)).Returns(100m); mockRepo.Setup(r => r.GetPrice(2)).Returns(50m);

var service = new OrderService(mockRepo.Object); var items = new List<OrderItem> { new OrderItem { ProductId = 1, Quantity = 2 }, new OrderItem { ProductId = 2, Quantity = 1 } };

// Act var total = service.CalculateTotal(items);

// Assert total.Should().Be(250m); mockRepo.Verify(r => r.GetPrice(1), Times.Once); mockRepo.Verify(r => r.GetPrice(2), Times.Once); }}


Tipps für Unit-Tests:

  • Befolgen Sie das AAA-Muster (Arrange, Act, Assert)
  • Ein Test – eine Überprüfung (ein Assert)
  • Verwenden Sie [Theory] mit [InlineData] zur Parametrisierung
  • Testen Sie keine externen Dienste – verwenden Sie Mocks


2. Integrationstests: Überprüfung der Komponenteninteraktion



Integrationstests überprüfen, wie verschiedene Module des Systems zusammenarbeiten: Datenbank, Dateisystem, externe APIs. Im Gegensatz zu Unit-Tests verwenden wir hier reale oder realitätsnahe Abhängigkeiten.



Werkzeuge für Integrationstests in .NET:

  • Microsoft.AspNetCore.TestHost – eingebetteter Webserver
  • TestContainers – Containerisierung von Datenbanken (PostgreSQL, SQL Server, Redis)
  • Respawn – Bereinigung der Datenbank zwischen Tests
  • WebApplicationFactory<T> – Erstellung eines Testhosts


Beispiel eines Integrationstests mit TestContainers und WebApplicationFactory:



using Microsoft.AspNetCore.Mvc.Testing;using Testcontainers.PostgreSql;using Xunit;

public class UserApiIntegrationTests : IAsyncLifetime{ private readonly PostgreSqlContainer _dbContainer; private WebApplicationFactory<Program> _factory;

public UserApiIntegrationTests() { _dbContainer = new PostgreSqlBuilder() .WithImage("postgres:15") .WithDatabase("testdb") .WithUsername("tes ```

Blogs

Buchempfehlungen