Effectuer des tests unitaires sur les bibliothèques .NET Core Visual Basic à l’aide de dotnet test et de xUnit

Ce didacticiel montre comment créer une solution contenant un projet de test unitaire et un projet de bibliothèque. Pour suivre le didacticiel à l’aide d’une solution prédéfinie, affichez ou téléchargez l’exemple de code. Pour obtenir des instructions de téléchargement, consultez Exemples et didacticiels.

Créez la solution

Dans cette section, une solution contenant les projets source et de test est créée. La solution terminée a la structure de répertoire suivante :

/unit-testing-using-dotnet-test
    unit-testing-using-dotnet-test.sln
    /PrimeService
        PrimeService.vb
        PrimeService.vbproj
    /PrimeService.Tests
        PrimeService_IsPrimeShould.vb
        PrimeServiceTests.vbproj

Les instructions suivantes présentent les étapes de création de la solution de test. Consultez Commandes pour créer une solution de test pour obtenir des instructions permettant de créer la solution de test en une seule étape.

  • Ouvrez une fenêtre d’interpréteur de commandes.

  • Exécutez la commande suivante :

    dotnet new sln -o unit-testing-using-dotnet-test
    

    La commande dotnet new sln crée une nouvelle solution dans le répertoire unit-testing-using-dotnet-test.

  • Mettez le répertoire dans le dossier unit-testing-using-dotnet-test.

  • Exécutez la commande suivante :

    dotnet new classlib -o PrimeService --lang VB
    

    La commande dotnet new classlib crée un nouveau projet de bibliothèque de classes dans le dossier PrimeService. La nouvelle bibliothèque de classes contient le code à tester.

  • Renommez Class1.vb en PrimeService.vb.

  • Remplacez le code dans PrimeService.vb par le code suivant :

    Imports System
    
    Namespace Prime.Services
        Public Class PrimeService
            Public Function IsPrime(candidate As Integer) As Boolean
                Throw New NotImplementedException("Not implemented.")
            End Function
        End Class
    End Namespace
    
  • Le code précédent :

    • Lève une NotImplementedException avec un message indiquant qu’il n’est pas implémenté.
    • Est mis à jour plus loin dans le didacticiel.
  • Dans le répertoire unit-testing-using-dotnet-test, exécutez la commande suivante pour ajouter le projet de bibliothèque de classes à la solution :

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • Créez le projet PrimeService.Tests en exécutant la commande suivante :

    dotnet new xunit -o PrimeService.Tests
    
  • La commande précédente :

    • Crée le projet PrimeService.Tests dans le répertoire PrimeService.Tests. Le projet de test utilise xUnit comme bibliothèque de test.
    • Configure l’exécuteur de tests en ajoutant les éléments suivants <PackageReference />au fichier projet :
      • « Microsoft.NET.Test.Sdk »
      • « xunit »
      • « xunit.runner.visualstudio »
  • Ajoutez le projet de test au fichier solution en exécutant la commande suivante :

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • Ajoutez la bibliothèque de classes PrimeService en tant que dépendance au projet PrimeService.Tests :

    dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj  
    

Commandes pour créer la solution

Cette section récapitule toutes les commandes de la section précédente. Ignorez cette section si vous avez effectué les étapes de la section précédente.

Les commandes suivantes créent la solution de test sur un ordinateur Windows. Pour macOS et Unix, mettez à jour la commande ren vers la version du système d’exploitation de ren pour renommer un fichier :

dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.vb PrimeService.vb
dotnet sln add ./PrimeService/PrimeService.vbproj
dotnet new xunit -o PrimeService.Tests
dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj

Suivez les instructions pour « Remplacer le code dans PrimeService.vb par le code suivant » dans la section précédente.

Créer un test

Une approche courante dans le développement piloté par les tests (TDD) consiste à écrire un test avant d’implémenter le code cible. Ce didacticiel utilise l’approche TDD. La méthode IsPrime peut être appelée, mais n’est pas implémentée. Un appel de test vers IsPrime échoue. Avec TDD, un test connu pour échouer est écrit. Le code cible est mis à jour pour que le test réussisse. Vous continuez à répéter cette approche, en écrivant un test défaillant, puis en mettant à jour le code cible afin qu’il réussisse.

Mettez à jour le projet PrimeService.Tests :

  • Supprimez PrimeService.Tests/UnitTest1.vb.
  • Créez un fichier PrimeService.Tests/PrimeService_IsPrimeShould.vb.
  • Remplacez le code dans PrimeService.vb par le code suivant :
Imports Xunit

Namespace PrimeService.Tests
    Public Class PrimeService_IsPrimeShould
        Private ReadOnly _primeService As Prime.Services.PrimeService

        Public Sub New()
            _primeService = New Prime.Services.PrimeService()
        End Sub


        <Fact>
        Sub IsPrime_InputIs1_ReturnFalse()
            Dim result As Boolean = _primeService.IsPrime(1)

            Assert.False(result, "1 should not be prime")
        End Sub

    End Class
End Namespace

L’attribut [Fact] déclare une méthode de test qui est exécutée par l’exécuteur de tests. Dans le dossier PrimeService.Tests, exécutez dotnet test. La commande dotnet test génère les deux projets et exécute les tests. L’exécuteur de tests xUnit contient le point d’entrée de programme qui permet d’exécuter les tests. dotnet test démarre l’exécuteur de tests à l’aide du projet de test unitaire.

Le test échoue, car IsPrime n’a pas été implémenté. À l’aide de l’approche TDD, n’écrivez que suffisamment de code pour que ce test réussisse. Mettez à jour IsPrime à l’aide du code suivant :

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate = 1 Then
        Return False
    End If
    Throw New NotImplementedException("Not implemented.")
End Function

Exécutez dotnet test. Le test réussit.

Ajouter des tests

Ajoutez des tests de nombre premier pour 0 et -1. Vous pouvez copier le test précédent et modifier le code suivant pour utiliser 0 et -1 :

Dim result As Boolean = _primeService.IsPrime(1)

Assert.False(result, "1 should not be prime")

La copie du code de test quand seul un paramètre change entraîne une duplication de code et une surabondance de tests. Les attributs xUnit suivants permettent d’écrire une suite de tests similaires :

  • [Theory] représente une suite de tests qui exécutent le même code, mais qui ont des arguments d’entrée différents.
  • L’attribut [InlineData] spécifie des valeurs pour ces entrées.

Au lieu de créer de nouveaux tests, appliquez les attributs xUnit précédents pour créer une seule théorie. Remplacez le code suivant :

<Fact>
Sub IsPrime_InputIs1_ReturnFalse()
    Dim result As Boolean = _primeService.IsPrime(1)

    Assert.False(result, "1 should not be prime")
End Sub

par le code suivant :

<Theory>
<InlineData(-1)>
<InlineData(0)>
<InlineData(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(ByVal value As Integer)
    Dim result As Boolean = _primeService.IsPrime(value)

    Assert.False(result, $"{value} should not be prime")
End Sub

Dans le code précédent, [Theory] puis [InlineData] activent le test de plusieurs valeurs inférieures à deux. Deux est le plus petit nombre premier.

Exécutez dotnet test, deux des tests échouent. Pour que tous les tests réussissent, mettez à jour la méthode IsPrime avec le code suivant :

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate < 2 Then
        Return False
    End If
    Throw New NotImplementedException("Not fully implemented.")
End Function

En suivant l’approche TDD, ajoutez d’autres tests défaillants, puis mettez à jour le code cible. Vous disposez de la version finale des tests et de l’implémentation complète de la bibliothèque.

La méthode IsPrime terminée n’est pas un algorithme efficace pour tester la primalité.

Ressources supplémentaires