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ängigkeitenFluentAssertions– verbesserte Assertion-AusdrückeAutoFixture– 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 WebserverTestContainers– Containerisierung von Datenbanken (PostgreSQL, SQL Server, Redis)Respawn– Bereinigung der Datenbank zwischen TestsWebApplicationFactory<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
```