Meilleures pratiques NUnit
Votre objectif est de vous aider à écrire des tests unitaires efficaces avec NUnit, couvrant à la fois les approches de test standard et par données.
Configuration du projet
- Utilisez un projet de test séparé avec la convention de nommage
[ProjectName].Tests - Référencez les packages Microsoft.NET.Test.Sdk, NUnit et NUnit3TestAdapter
- Créez des classes de test correspondant aux classes testées (par exemple,
CalculatorTestspourCalculator) - Utilisez les commandes de test .NET SDK :
dotnet testpour exécuter les tests
Structure des tests
- Appliquez l'attribut
[TestFixture]aux classes de test - Utilisez l'attribut
[Test]pour les méthodes de test - Suivez le modèle Arrange-Act-Assert (AAA)
- Nommez les tests selon le motif
NomMethode_Scenario_ComportementAttendu - Utilisez
[SetUp]et[TearDown]pour la configuration et le nettoyage par test - Utilisez
[OneTimeSetUp]et[OneTimeTearDown]pour la configuration et le nettoyage par classe - Utilisez
[SetUpFixture]pour la configuration et le nettoyage au niveau de l'assembly
Tests standards
- Gardez les tests concentrés sur un seul comportement
- Évitez de tester plusieurs comportements dans une seule méthode de test
- Utilisez des assertions claires qui expriment l'intention
- Incluez uniquement les assertions nécessaires pour vérifier le cas de test
- Rendez les tests indépendants et idempotents (peuvent s'exécuter dans n'importe quel ordre)
- Évitez les interdépendances entre tests
Tests par données
- Utilisez
[TestCase]pour les données de test en ligne - Utilisez
[TestCaseSource]pour les données de test générées par programme - Utilisez
[Values]pour les combinaisons de paramètres simples - Utilisez
[ValueSource]pour les sources de données basées sur des propriétés ou des méthodes - Utilisez
[Random]pour les valeurs de test numériques aléatoires - Utilisez
[Range]pour les valeurs de test numériques séquentielles - Utilisez
[Combinatorial]ou[Pairwise]pour combiner plusieurs paramètres
Assertions
- Utilisez
Assert.Thatavec le modèle de contrainte (style NUnit préféré) - Utilisez des contraintes comme
Is.EqualTo,Is.SameAs,Contains.Item - Utilisez
Assert.AreEqualpour l'égalité de valeur simple (style classique) - Utilisez
CollectionAssertpour les comparaisons de collections - Utilisez
StringAssertpour les assertions spécifiques aux chaînes - Utilisez
Assert.Throws<T>ouAssert.ThrowsAsync<T>pour tester les exceptions - Utilisez des messages descriptifs dans les assertions pour clarifier les échecs
Mocking et isolation
- Envisagez d'utiliser Moq ou NSubstitute aux côtés de NUnit
- Simulez les dépendances pour isoler les unités testées
- Utilisez des interfaces pour faciliter la simulation
- Envisagez d'utiliser un conteneur DI pour les configurations de test complexes
Organisation des tests
- Groupez les tests par fonctionnalité ou composant
- Utilisez les catégories avec
[Category("CategoryName")] - Utilisez
[Order]pour contrôler l'ordre d'exécution des tests si nécessaire - Utilisez
[Author("DeveloperName")]pour indiquer la propriété - Utilisez
[Description]pour fournir des informations supplémentaires sur le test - Envisagez
[Explicit]pour les tests qui ne doivent pas s'exécuter automatiquement - Utilisez
[Ignore("Reason")]pour ignorer temporairement les tests