Tests en C# : Unit, Integration et E2E — guide complet pour le développeur .NET
La qualité du logiciel commence par les tests. Dans l'écosystème C# (.NET), il existe une culture de test bien établie qui comprend trois niveaux clés : les tests unitaires (unit), d'intégration (integration) et de bout en bout (E2E). Dans cet article, nous analyserons chaque niveau avec des exemples pratiques, présenterons les meilleures bibliothèques et expliquerons comment construire une stratégie de test efficace pour votre projet .NET.
1. Tests unitaires en C# : le fondement de la qualité du code
Les tests unitaires (unit tests) vérifient le fonctionnement de composants individuels du programme — méthodes, classes, fonctions — en isolation des dépendances externes. Dans .NET, les frameworks principaux sont xUnit, NUnit et MSTest. Le plus populaire est xUnit grâce à sa flexibilité et son intégration avec .NET Core.
Bibliothèques pour les tests unitaires :
xUnit— framework principal (recommandé par Microsoft)Moq— création d'objets mock pour l'isolation des dépendancesFluentAssertions— expressions d'assertion amélioréesAutoFixture— génération automatique de données de test
Exemple de test unitaire avec xUnit et 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); }}Conseils pour les tests unitaires :
- Suivez le modèle AAA (Arrange, Act, Assert)
- Un test — une vérification (un seul assert)
- Utilisez
[Theory]avec[InlineData]pour la paramétrisation - Ne testez pas les services externes — utilisez des mocks
2. Tests d'intégration : vérification de l'interaction des composants
Les tests d'intégration vérifient comment différents modules du système fonctionnent ensemble : base de données, système de fichiers, API externes. Contrairement aux tests unitaires, nous utilisons ici des dépendances réelles ou proches de la réalité.
Outils pour les tests d'intégration dans .NET :
Microsoft.AspNetCore.TestHost— serveur web embarquéTestContainers— conteneurisation de bases de données (PostgreSQL, SQL Server, Redis)Respawn— nettoyage de la base de données entre les testsWebApplicationFactory<T>— création d'un hôte de test
Exemple de test d'intégration avec TestContainers et 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