Effectuer des tests unitaires de C# avec NUnit et .NET CoreUnit testing C# with NUnit and .NET Core

Ce didacticiel vous guide pas à pas dans la création d’un exemple de solution pour apprendre les concepts des tests unitaires.This tutorial takes you through an interactive experience building a sample solution step-by-step to learn unit testing concepts. Si vous préférez suivre le didacticiel à l’aide d’une solution prédéfinie, affichez ou téléchargez l’exemple de code avant de commencer.If you prefer to follow the tutorial using a pre-built solution, view or download the sample code before you begin. Pour obtenir des instructions de téléchargement, consultez Exemples et didacticiels.For download instructions, see Samples and Tutorials.

Cet article concerne le test d’un projet .NET Core.This article is about testing a .NET Core project. Si vous testez un projet de ASP.net Core , consultez tests d’intégration dans ASP.net Core.If you're testing an ASP.NET Core project, see Integration tests in ASP.NET Core.

Configuration requisePrerequisites

Création du projet sourceCreating the source project

Ouvrez une fenêtre d’interpréteur de commandes.Open a shell window. Créez un répertoire appelé unit-testing-using-nunit qui contiendra la solution.Create a directory called unit-testing-using-nunit to hold the solution. Dans ce nouveau répertoire, exécutez la commande suivante afin de créer un fichier solution pour la bibliothèque de classes et le projet de test :Inside this new directory, run the following command to create a new solution file for the class library and the test project:

dotnet new sln

Ensuite, créez un répertoire PrimeService.Next, create a PrimeService directory. La structure de répertoire et de fichiers est la suivante :The following outline shows the directory and file structure so far:

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService

Accédez au répertoire PrimeService et exécutez la commande suivante pour créer le projet source :Make PrimeService the current directory and run the following command to create the source project:

dotnet new classlib

Renommez Class1.cs en PrimeService.cs.Rename Class1.cs to PrimeService.cs. Créez une implémentation défaillante de la classe PrimeService :You create a failing implementation of the PrimeService class:

using System;

namespace Prime.Services
{
    public class PrimeService
    {
        public bool IsPrime(int candidate)
        {
            throw new NotImplementedException("Please create a test first.");
        }
    }
}

Accédez de nouveau au répertoire unit-testing-using-nunit.Change the directory back to the unit-testing-using-nunit directory. Exécutez la commande suivante pour ajouter le projet de la bibliothèque de classes à la solution :Run the following command to add the class library project to the solution:

dotnet sln add PrimeService/PrimeService.csproj

Création du projet de testCreating the test project

Ensuite, créez le répertoire PrimeService.Tests.Next, create the PrimeService.Tests directory. La structure du répertoire est illustrée ci-dessous :The following outline shows the directory structure:

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

Accédez au répertoire PrimeService.Tests et créez un projet à l’aide de la commande suivante :Make the PrimeService.Tests directory the current directory and create a new project using the following command:

dotnet new nunit

La commande dotnet new crée un projet de test qui utilise NUnit comme bibliothèque de test.The dotnet new command creates a test project that uses NUnit as the test library. Le modèle généré configure Test Runner dans le fichier PrimeService.Tests.csproj :The generated template configures the test runner in the PrimeService.Tests.csproj file:

<ItemGroup>
  <PackageReference Include="nunit" Version="3.12.0" />
  <PackageReference Include="NUnit3TestAdapter" Version="3.16.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
</ItemGroup>

Le projet de test a besoin d’autres packages pour créer et exécuter des tests unitaires.The test project requires other packages to create and run unit tests. dotnet new dans l’étape précédente a ajouté le kit SDK de test Microsoft, le framework de test NUnit et l’adaptateur de test NUnit.dotnet new in the previous step added the Microsoft test SDK, the NUnit test framework, and the NUnit test adapter. Maintenant, ajoutez la bibliothèque de classes PrimeService en tant qu’une autre dépendance au projet.Now, add the PrimeService class library as another dependency to the project. Utilisez la commande dotnet add reference :Use the dotnet add reference command:

dotnet add reference ../PrimeService/PrimeService.csproj

Vous pouvez consulter le fichier dans son intégralité dans le dépôt d’exemples sur GitHub.You can see the entire file in the samples repository on GitHub.

La solution finale se présente comme suit :The following outline shows the final solution layout:

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.csproj

Exécutez la commande suivante dans le répertoire unit-testing-using-nunit :Execute the following command in the unit-testing-using-nunit directory:

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

Création du premier testCreating the first test

Vous allez écrire un test défaillant, le corriger pour qu’il réussisse, puis répéter le processus.You write one failing test, make it pass, then repeat the process. Dans le répertoire PrimeService.Tests, renommez le fichier UnitTest1.cs en PrimeService_IsPrimeShould.cs, puis remplacez tout son contenu par le code suivant :In the PrimeService.Tests directory, rename the UnitTest1.cs file to PrimeService_IsPrimeShould.cs and replace its entire contents with the following code:

using NUnit.Framework;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    [TestFixture]
    public class PrimeService_IsPrimeShould
    {
        [Test]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            PrimeService primeService = CreatePrimeService();
            var result = primeService.IsPrime(1);

            Assert.IsFalse(result, "1 should not be prime");
        }
        
        /*
        More tests
        */
        
        private PrimeService CreatePrimeService()
        {
             return new PrimeService();
        }
    }
}

L’attribut [TestFixture] désigne une classe qui contient des tests unitaires.The [TestFixture] attribute denotes a class that contains unit tests. L’attribut [Test] indique une méthode qui est une méthode de test.The [Test] attribute indicates a method is a test method.

Enregistrez ce fichier et exécutez dotnet test pour générer les tests et la bibliothèque de classes, puis exécutez les tests.Save this file and execute dotnet test to build the tests and the class library and then run the tests. Le Test Runner NUnit contient le point d’entrée de programme qui permet d’exécuter vos tests.The NUnit test runner contains the program entry point to run your tests. dotnet test démarre le Test Runner à l’aide du projet de test unitaire que vous avez créé.dotnet test starts the test runner using the unit test project you've created.

Votre test échoue.Your test fails. Vous n’avez pas encore créé l’implémentation.You haven't created the implementation yet. Pour que ce test réussisse, écrivez le code le plus simple dans la classe PrimeService qui fonctionne :Make this test pass by writing the simplest code in the PrimeService class that works:

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Please create a test first.");
}

Dans le répertoire unit-testing-using-nunit, réexécutez dotnet test.In the unit-testing-using-nunit directory, run dotnet test again. La commande dotnet test exécute une build pour le projet PrimeService puis pour le projet PrimeService.Tests.The dotnet test command runs a build for the PrimeService project and then for the PrimeService.Tests project. Après la création des deux projets, il exécute ce test unique.After building both projects, it runs this single test. Le test réussit.It passes.

Ajout de fonctionnalités supplémentairesAdding more features

Maintenant que vous avez fait réussir un test, le moment est venu d’écrire plus de code.Now that you've made one test pass, it's time to write more. Il existe quelques autres cas simples pour des nombres premiers : 0, -1.There are a few other simple cases for prime numbers: 0, -1. Vous pouvez ajouter de nouveaux tests avec l’attribut [Test], mais cela devient vite fastidieux.You could add new tests with the [Test] attribute, but that quickly becomes tedious. D’autres attributs NUnit vous permettent d’écrire une suite de tests similaires.There are other NUnit attributes that enable you to write a suite of similar tests. Un attribut [TestCase] permet de créer une suite de tests qui exécutent le même code, mais qui ont des arguments d’entrée différents.A [TestCase] attribute is used to create a suite of tests that execute the same code but have different input arguments. Vous pouvez utiliser l’attribut [TestCase] pour spécifier des valeurs pour ces entrées.You can use the [TestCase] attribute to specify values for those inputs.

Au lieu de créer des tests, appliquez cet attribut pour créer un test unique piloté par les données.Instead of creating new tests, apply this attribute to create a single data driven test. Le test piloté par les données est une méthode qui teste plusieurs valeurs inférieures à deux, qui est le plus petit nombre premier :The data driven test is a method that tests several values less than two, which is the lowest prime number:

[TestCase(-1)]
[TestCase(0)]
[TestCase(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
    var result = _primeService.IsPrime(value);

    Assert.IsFalse(result, $"{value} should not be prime");
}

Exécutez dotnet test, et deux de ces tests échouent.Run dotnet test, and two of these tests fail. Pour que tous les tests réussissent, changez la clause if au début de la méthode Main dans le fichier PrimeService.cs :To make all of the tests pass, change the if clause at the beginning of the Main method in the PrimeService.cs file:

if (candidate < 2)

Poursuivez l’itération en ajoutant plus de tests, plus de théories et plus de code dans la bibliothèque principale.Continue to iterate by adding more tests, more theories, and more code in the main library. Vous disposez de la version finale des tests et de l’implémentation complète de la bibliothèque.You have the finished version of the tests and the complete implementation of the library.

Vous avez créé une petite bibliothèque et un ensemble de tests unitaires pour cette bibliothèque.You've built a small library and a set of unit tests for that library. Vous avez structuré la solution afin que l’ajout de nouveaux packages et tests fasse partie du flux de travail normal.You've structured the solution so that adding new packages and tests is part of the normal workflow. Vous avez concentré la plupart de votre temps et de vos efforts sur la résolution des objectifs de l’application.You've concentrated most of your time and effort on solving the goals of the application.