Les tests unitaires en C#
1) Pourquoi tester ?
Les tests unitaires permettent de :
- sécuriser les évolutions,
- détecter les régressions,
- documenter le comportement attendu.
2) Structure AAA
Chaque test suit la logique :
- Arrange : préparer le contexte.
- Act : exécuter l'action testée.
- Assert : vérifier le résultat.
[Fact]
public void CalculerDevis_5Jours_Retourne200()
{
// Arrange
var service = new VehiculeService(new InMemoryVehiculeRepository());
// Act
decimal total = service.CalculerDevis(40m, 5);
// Assert
Assert.Equal(200m, total);
}
3) Types de tests à couvrir
- Test nominal : cas classique attendu.
- Test limite : valeur frontière (0, vide, null).
- Test d'exception : comportement en erreur.
[Fact]
public void CalculerDevis_DureeZero_LeveArgumentException()
{
var service = new VehiculeService(new InMemoryVehiculeRepository());
Assert.Throws<ArgumentException>(() => service.CalculerDevis(50m, 0));
}
4) Isoler la logique métier
Pour tester vite et bien, éviter CSV/BDD réels :
- utiliser un repository mémoire (
InMemoryRepository), - injecter ce repository dans le service.
5) Organisation d'un projet de tests
- Créer projet test (
xUnitouNUnit). - Ajouter la référence au projet métier.
- Créer des classes de tests par service (
VehiculeServiceTests,StatsServiceTests). - Nommer clairement les méthodes de test.
6) Exercices d'application
Exercice 1
Écrire un test nominal CalculerDevis sur 3 jours.
Exercice 2
Écrire un test limite sur durée invalide (0 ou négatif).
Exercice 3
Écrire un test d'exception métier sur prix journalier invalide.
Exercice 4
Écrire 2 tests pour un service de statistiques (moyenne et top 3).
7) TP guidé (1h)
- Créer le projet de tests.
- Ajouter
InMemoryVehiculeRepository. - Écrire 6 à 10 tests couvrant :
- calcul devis,
- validation,
- exceptions,
- statistiques.
- Exécuter la suite et corriger les échecs.
8) Livrable attendu
- Projet de tests compilable.
- Au moins 6 tests passants.
- Présence des 3 catégories (nominal, limite, exception).