Partager via


Effectuer des tests unitaires C# avec MSTest et .NET

Ce didacticiel vous guide pas à pas dans la création d’un exemple de solution pour apprendre les concepts des tests unitaires. 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. Pour obtenir des instructions de téléchargement, consultez Exemples et didacticiels.

Cet article concerne le test d’un projet .NET Core. Si vous testez un projet ASP.NET Core, consultez Tests d’intégration dans ASP.NET Core.

Prérequis

Créer le projet source

Ouvrez une fenêtre d’interpréteur de commandes. Créez un répertoire appelé unit-testing-using-nunit pour contenir la 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. Créez un répertoire PrimeService. Vous disposez de la structure de répertoire et de fichiers suivante :

/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. Renommez Class1.cs en PrimeService.cs. Remplacez le code dans le fichier par le code suivant pour créer une implémentation défaillante de la classe PrimeService :

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. Exécutez dotnet sln add pour ajouter le projet de la bibliothèque de classes à la solution :

dotnet sln add PrimeService/PrimeService.csproj

Créer le projet de test

Créez le répertoire PrimeService.Tests. La structure du répertoire est illustrée ci-dessous :

/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. La commande dotnet new crée un projet de test qui utilise MSTest comme bibliothèque de test. Le modèle configure Test Runner dans le fichier PrimeServiceTests.csproj :

<ItemGroup>
  <PackageReference Include="MSTest" Version="3.2.0" />
  <PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.1" />
</ItemGroup>

Le projet de test a besoin d’autres packages pour créer et exécuter des tests unitaires. dotnet new à l’étape précédente a ajouté les packages et outils MSTest nécessaires pour la création de rapports de couverture du code.

Ajoutez la bibliothèque de classes PrimeService en tant qu’une autre dépendance au projet. Utiliser la commande dotnet add reference :

dotnet add reference ../PrimeService/PrimeService.csproj

Vous pouvez consulter le fichier dans son intégralité dans le dépôt d’exemples sur GitHub.

La solution finale se présente comme suit :

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

Passez au répertoire unit-testing-using-mstest et exécutez dotnet sln add :

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

Créer le premier test

Écrivez un test défaillant, corrigez-le pour qu’il réussisse, puis répétez le processus. Supprimez UnitTest1.cs du répertoire PrimeService.Tests et créez un fichier C# nommé PrimeService_IsPrimeShould.cs avec le contenu suivant :

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()
        {
            bool result = _primeService.IsPrime(1);

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

L’attribut TestClass désigne une classe qui contient des tests unitaires. L’attribut TestMethod indique une méthode qui est une méthode de test.

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. Le Test Runner MSTest contient le point d’entrée de programme qui permet d’exécuter vos tests. dotnet test démarre le Test Runner à l’aide du projet de test unitaire que vous avez créé.

Votre test échoue. Vous n’avez pas encore créé l’implémentation. Pour que ce test réussisse, écrivez le code le plus simple dans la classe PrimeService qui fonctionne :

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. La commande dotnet test exécute une build pour le projet PrimeService puis pour le projet PrimeService.Tests. Après la création des deux projets, il exécute ce test unique. Le test réussit.

Ajouter des fonctionnalités

Maintenant que vous avez fait réussir un test, le moment est venu d’écrire plus de code. Il existe quelques autres cas simples pour des nombres premiers : 0, -1. Vous pouvez ajouter de nouveaux tests avec l’attribut TestMethod, mais cela devient vite fastidieux. D’autres attributs MSTest vous permettent d’écrire une suite de tests similaires. Une méthode de test peut exécuter le même code, mais avoir des arguments d’entrée différents. Vous pouvez utiliser l’attribut DataRow pour spécifier des valeurs pour ces entrées.

Au lieu de créer de nouveaux tests, appliquez ces deux attributs pour créer un test unique piloté par les données. 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. Ajoutez une nouvelle méthode de test dans PrimeService_IsPrimeShould.cs :

[TestMethod]
[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. Pour que tous les tests réussissent, changez la clause if au début de la méthode IsPrime dans le fichier PrimeService.cs :

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. Vous disposez de la version finale des tests et de l’implémentation complète de la bibliothèque.

Vous avez créé une petite bibliothèque et un ensemble de tests unitaires pour cette bibliothèque. Vous avez structuré la solution afin que l’ajout de nouveaux packages et tests fasse partie du flux de travail normal. Vous avez concentré la plupart de votre temps et de vos efforts sur la résolution des objectifs de l’application.

Voir aussi