Delen via


Eenheid testen van Visual Basic .NET Core-bibliotheken met behulp van dotnet-test en xUnit

Deze zelfstudie laat zien hoe u een oplossing bouwt die een eenheidstestproject en bibliotheekproject bevat. Als u de zelfstudie wilt volgen met behulp van een vooraf gebouwde oplossing, bekijkt of downloadt u de voorbeeldcode. Zie Voorbeelden en zelfstudies voor downloadinstructies.

De oplossing maken

In deze sectie wordt een oplossing gemaakt die de bron- en testprojecten bevat. De voltooide oplossing heeft de volgende mapstructuur:

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

De volgende instructies bevatten de stappen voor het maken van de testoplossing. Zie Opdrachten voor het maken van een testoplossing voor instructies voor het maken van de testoplossing in één stap.

  • Open een shellvenster.

  • Voer de volgende opdracht uit:

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

    Met de dotnet new sln opdracht maakt u een nieuwe oplossing in de map unit-testing-using-dotnet-test .

  • Wijzig de map in de map unit-testing-using-dotnet-test .

  • Voer de volgende opdracht uit:

    dotnet new classlib -o PrimeService --lang VB
    

    Met de dotnet new classlib opdracht maakt u een nieuw klassebibliotheekproject in de map PrimeService . De nieuwe klassebibliotheek bevat de code die moet worden getest.

  • Wijzig de naam van Class1.vb in PrimeService.vb.

  • Vervang de code in PrimeService.vb door de volgende code:

    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
    
  • Met de voorgaande code wordt:

    • Hiermee wordt een NotImplementedException bericht met een bericht weergegeven dat het niet is geïmplementeerd.
    • Wordt verderop in de zelfstudie bijgewerkt.
  • Voer in de map unit-testing-using-dotnet-test de volgende opdracht uit om het klassebibliotheekproject toe te voegen aan de oplossing:

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • Maak het project PrimeService.Tests door de volgende opdracht uit te voeren:

    dotnet new xunit -o PrimeService.Tests
    
  • De bovenstaande opdracht:

    • Hiermee maakt u het project PrimeService.Tests in de map PrimeService.Tests . Het testproject gebruikt xUnit als testbibliotheek.
    • Hiermee configureert u de testrunner door de volgende <PackageReference />elementen toe te voegen aan het projectbestand:
      • "Microsoft.NET.Test.Sdk"
      • "eenheid"
      • "xunit.runner.visualstudio"
  • Voeg het testproject toe aan het oplossingsbestand door de volgende opdracht uit te voeren:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • Voeg de PrimeService klassebibliotheek toe als een afhankelijkheid aan het project PrimeService.Tests :

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

Opdrachten voor het maken van de oplossing

In deze sectie vindt u een overzicht van alle opdrachten in de vorige sectie. Sla deze sectie over als u de stappen in de vorige sectie hebt voltooid.

Met de volgende opdrachten maakt u de testoplossing op een Windows-computer. Werk voor macOS en Unix de ren opdracht bij naar de versie van het besturingssysteem om de naam van ren een bestand te wijzigen:

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

Volg de instructies voor 'Vervang de code in PrimeService.vb door de volgende code' in de vorige sectie.

Een test maken

Een populaire benadering in testgestuurde ontwikkeling (TDD) is het schrijven van een test voordat de doelcode wordt geïmplementeerd. In deze zelfstudie wordt gebruikgemaakt van de TDD-benadering. De IsPrime methode kan worden aangeroepen, maar is niet geïmplementeerd. Een testoproep mislukt IsPrime . Met TDD wordt een test geschreven die bekend is dat het mislukt. De doelcode wordt bijgewerkt om de testpas te maken. U blijft deze aanpak herhalen, een mislukte test schrijven en vervolgens de doelcode bijwerken om door te geven.

Werk het project PrimeService.Tests bij:

  • Verwijder PrimeService.Tests/UnitTest1.vb.
  • Maak een PrimeService.Tests/PrimeService_IsPrimeShould.vb-bestand .
  • Vervang de code in PrimeService_IsPrimeShould.vb door de volgende code:
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

Het [Fact] kenmerk declareert een testmethode die wordt uitgevoerd door de testloper. Voer in de map PrimeService.Tests de opdracht uit dotnet test. De dotnet-testopdracht bouwt beide projecten en voert de tests uit. De xUnit-testloper bevat het programmainvoerpunt om de tests uit te voeren. dotnet test start de testloper met behulp van het eenheidstestproject.

De test mislukt omdat IsPrime deze niet is geïmplementeerd. Schrijf met behulp van de TDD-benadering alleen voldoende code, zodat deze test is geslaagd. Werk IsPrime bij met de volgende code:

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

Voer dotnet test uit. De test is geslaagd.

Meer tests toevoegen

Voeg priemnummertests toe voor 0 en -1. U kunt de voorgaande test kopiëren en de volgende code wijzigen om 0 en -1 te gebruiken:

Dim result As Boolean = _primeService.IsPrime(1)

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

Het kopiëren van testcode wanneer alleen een parameter verandert, resulteert in codeduplicatie en test-bloat. Met de volgende xUnit-kenmerken kunt u een suite met vergelijkbare tests schrijven:

  • [Theory] vertegenwoordigt een reeks tests die dezelfde code uitvoeren, maar verschillende invoerargumenten hebben.
  • [InlineData] kenmerk geeft waarden op voor deze invoer.

In plaats van nieuwe tests te maken, past u de voorgaande xUnit-kenmerken toe om één theorie te maken. Vervang de volgende code:

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

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

met de volgende code:

<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

In de voorgaande code [Theory] kunt [InlineData] u verschillende waarden testen die kleiner zijn dan twee. Twee is het kleinste priemnummer.

Uitvoeren dotnet test, twee van de tests mislukken. Als u alle tests wilt laten slagen, werkt u de IsPrime methode bij met de volgende code:

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

Voeg na de TDD-benadering meer mislukte tests toe en werk vervolgens de doelcode bij. Bekijk de voltooide versie van de tests en de volledige implementatie van de bibliotheek.

De voltooide IsPrime methode is geen efficiënt algoritme voor het testen van de primaliteit.

Aanvullende bronnen