Effectuer des tests unitaires de C# avec MSTest et .NET CoreUnit testing C# with MSTest 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.

Créer le projet sourceCreate 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 pour contenir la solution.Create a directory called unit-testing-using-mstest to hold the solution. Dans ce nouveau répertoire, exécutez dotnet new sln pour créer un fichier de solution pour la bibliothèque de classes et le projet de test.Inside this new directory, run dotnet new sln to create a new solution file for the class library and the test project. Ensuite, créez un répertoire PrimeService.Next, create a PrimeService directory. Vous disposez de la structure de répertoire et de fichiers suivante :The following outline shows the directory and file structure thus far:

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

Accédez au répertoire PrimeService et exécutez dotnet new classlib pour créer le projet source.Make PrimeService the current directory and run dotnet new classlib to create the source project. 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-mstest.Change the directory back to the unit-testing-using-mstest directory. Exécutez dotnet sln add PrimeService/PrimeService.csproj pour ajouter le projet de la bibliothèque de classes à la solution.Run dotnet sln add PrimeService/PrimeService.csproj to add the class library project to the solution.

Créer le projet de testCreate 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-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

Accédez au répertoire PrimeService.Tests et créez un projet à l’aide de dotnet new mstest.Make the PrimeService.Tests directory the current directory and create a new project using dotnet new mstest. La commande dotnet new crée un projet de test qui utilise MSTest comme bibliothèque de test.The dotnet new command creates a test project that uses MSTest as the test library. Le modèle généré configure Test Runner dans le fichier PrimeServiceTests.csproj :The generated template configures the test runner in the PrimeServiceTests.csproj file:

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
  <PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
  <PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</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. À l’étape précédente, dotnet new a ajouté le SDK MSTest, le framework de test MSTest et le Test Runner MSTest.dotnet new in the previous step added the MSTest SDK, the MSTest test framework, and the MSTest runner. 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-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeServiceTests.csproj

Exécutez dotnet sln add .\PrimeService.Tests\PrimeService.Tests.csproj dans le répertoire unit-testing-using-mstest.Execute dotnet sln add .\PrimeService.Tests\PrimeService.Tests.csproj in the unit-testing-using-mstest directory.

Créer le premier testCreate 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. Supprimez UnitTest1.cs du répertoire PrimeService.Tests et créez un fichier C# nommé PrimeService_IsPrimeShould.cs avec le contenu suivant :Remove UnitTest1.cs from the PrimeService.Tests directory and create a new C# file named PrimeService_IsPrimeShould.cs with the following content:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    [TestClass]
    public class PrimeService_IsPrimeShould
    {
        private readonly PrimeService _primeService;

        public PrimeService_IsPrimeShould()
        {
            _primeService = new PrimeService();
        }

        [TestMethod]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            var result = _primeService.IsPrime(1);

            Assert.IsFalse(result, "1 should not be prime");
        }
    }
}

L’attribut TestClass désigne une classe qui contient des tests unitaires.The TestClass attribute denotes a class that contains unit tests. L’attribut TestMethod indique une méthode qui est une méthode de test.The TestMethod 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 MSTest contient le point d’entrée de programme qui permet d’exécuter vos tests.The MSTest 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-mstest, réexécutez dotnet test.In the unit-testing-using-mstest 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.

Ajouter des fonctionnalitésAdd 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 TestMethod, mais cela devient vite fastidieux.You could add new tests with the TestMethod attribute, but that quickly becomes tedious. D’autres attributs MSTest vous permettent d’écrire une suite de tests similaires.There are other MSTest attributes that enable you to write a suite of similar tests. L’attribut DataTestMethod représente une suite de tests qui exécutent le même code, mais qui ont des arguments d’entrée différents.A DataTestMethod attribute represents a suite of tests that execute the same code but have different input arguments. Vous pouvez utiliser l’attribut DataRow pour spécifier des valeurs pour ces entrées.You can use the DataRow attribute to specify values for those inputs.

Au lieu de créer de nouveaux tests, appliquez ces deux attributs pour créer un test unique piloté par les données.Instead of creating new tests, apply these two attributes 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:

[DataTestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(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, modifiez la clause if au début de la méthode :To make all of the tests pass, change the if clause at the beginning of the method:

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.

Voir aussiSee also