Dela via


Enhetstestning av Visual Basic .NET Core-bibliotek med dotnet-test och xUnit

Den här självstudien visar hur du skapar en lösning som innehåller ett enhetstestprojekt och biblioteksprojekt. Om du vill följa självstudien med hjälp av en fördefinierad lösning kan du visa eller ladda ned exempelkoden. Instruktioner för nedladdning finns i Exempel och självstudier.

Skapa lösningen

I det här avsnittet skapas en lösning som innehåller käll- och testprojekten. Den färdiga lösningen har följande katalogstruktur:

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

Följande instruktioner innehåller stegen för att skapa testlösningen. Mer information om hur du skapar testlösningen finns i Kommandon för att skapa testlösningen i ett steg.

  • Öppna ett gränssnittsfönster.

  • Kör följande kommando:

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

    Kommandot dotnet new sln skapar en ny lösning i katalogen unit-testing-using-dotnet-test .

  • Ändra katalogen till mappen unit-testing-using-dotnet-test .

  • Kör följande kommando:

    dotnet new classlib -o PrimeService --lang VB
    

    Kommandot dotnet new classlib skapar ett nytt klassbiblioteksprojekt i mappen PrimeService . Det nya klassbiblioteket innehåller den kod som ska testas.

  • Byt namn på Class1.vb till PrimeService.vb.

  • Ersätt koden i PrimeService.vb med följande kod:

    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
    
  • Koden ovan:

    • Genererar ett NotImplementedException med ett meddelande som anger att det inte har implementerats.
    • Uppdateras senare i självstudien.
  • I katalogen unit-testing-using-dotnet-test kör du följande kommando för att lägga till klassbiblioteksprojektet i lösningen:

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • Skapa projektet PrimeService.Tests genom att köra följande kommando:

    dotnet new xunit -o PrimeService.Tests
    
  • Kommandot ovan:

    • Skapar projektet PrimeService.Tests i katalogen PrimeService.Tests. Testprojektet använder xUnit som testbibliotek.
    • Konfigurerar testlöparen genom att lägga till följande <PackageReference />element i projektfilen:
      • "Microsoft.NET.Test.Sdk"
      • "xunit"
      • "xunit.runner.visualstudio"
  • Lägg till testprojektet i lösningsfilen genom att köra följande kommando:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • PrimeService Lägg till klassbiblioteket som ett beroende till projektet PrimeService.Tests:

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

Kommandon för att skapa lösningen

Det här avsnittet sammanfattar alla kommandon i föregående avsnitt. Hoppa över det här avsnittet om du har slutfört stegen i föregående avsnitt.

Följande kommandon skapar testlösningen på en Windows-dator. För macOS och Unix uppdaterar ren du kommandot till os-versionen av ren för att byta namn på en fil:

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

Följ anvisningarna för "Ersätt koden i PrimeService.vb med följande kod" i föregående avsnitt.

Skapa test

En populär metod i testdriven utveckling (TDD) är att skriva ett test innan du implementerar målkoden. I den här självstudien används TDD-metoden. Metoden IsPrime är anropsbar men inte implementerad. Ett testanrop till IsPrime misslyckas. Med TDD skrivs ett test som är känt för att misslyckas. Målkoden uppdateras för att göra testet godkänt. Du upprepar den här metoden hela tiden, skriver ett misslyckat test och uppdaterar sedan målkoden som ska godkännas.

Uppdatera projektet PrimeService.Tests:

  • Ta bort PrimeService.Tests/UnitTest1.vb.
  • Skapa en PrimeService.Tests/PrimeService_IsPrimeShould.vb-fil .
  • Ersätt koden i PrimeService_IsPrimeShould.vb med följande kod:
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

Attributet [Fact] deklarerar en testmetod som körs av testlöparen. Från mappen PrimeService.Tests kör du dotnet test. Dotnet-testkommandot skapar båda projekten och kör testerna. xUnit-testlöparen innehåller programmets startpunkt för att köra testerna. dotnet test startar testlöparen med hjälp av enhetstestprojektet.

Testet misslyckas eftersom IsPrime det inte har implementerats. Med hjälp av TDD-metoden skriver du bara tillräckligt med kod så att det här testet godkänns. Uppdatera IsPrime med följande kod:

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

Kör dotnet test. Testet godkänns.

Lägga till fler tester

Lägg till primtalstester för 0 och -1. Du kan kopiera föregående test och ändra följande kod så att 0 och -1 används:

Dim result As Boolean = _primeService.IsPrime(1)

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

Kopiering av testkod när endast en parameter ändras resulterar i kodduplicering och uppsvälldhet. Följande xUnit-attribut gör det möjligt att skriva en uppsättning liknande tester:

  • [Theory] representerar en uppsättning tester som kör samma kod men som har olika indataargument.
  • [InlineData] attributet anger värden för dessa indata.

I stället för att skapa nya tester använder du de föregående xUnit-attributen för att skapa en enda teori. Ersätt följande kod:

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

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

med följande kod:

<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

I föregående kod [Theory] och [InlineData] aktivera testning av flera värden som är mindre än två. Två är det minsta primtal.

Kör dotnet test, två av testerna misslyckas. Uppdatera metoden med följande kod för att göra så att alla tester godkänns IsPrime :

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

Efter TDD-metoden lägger du till fler misslyckade tester och uppdaterar sedan målkoden. Se den färdiga versionen av testerna och den fullständiga implementeringen av biblioteket.

Den slutförda IsPrime metoden är inte en effektiv algoritm för att testa primality.

Ytterligare resurser