Dela via


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

I den här självstudien får du en interaktiv upplevelse när du skapar en exempellösning steg för steg för att lära dig enhetstestningskoncept. Om du föredrar att följa handledningen genom att använda en färdig lösning se eller ladda ned exempelkoden innan du börjar. Instruktioner för nedladdning finns i Exempel och Självstudier.

Den här artikeln handlar om att testa ett .NET Core-projekt. Om du testar ett ASP.NET Core-projekt kan du läsa Integrationstester i ASP.NET Core.

Skapa källprojektet

Öppna ett gränssnittsfönster. Skapa en katalog med namnet unit-testing-vb-mstest för att lagra lösningen. I den här nya katalogen kör du dotnet new sln för att skapa en ny lösning. Den här metoden gör det enklare att hantera både klassbiblioteket och enhetstestprojektet. Skapa en PrimeService-katalog i lösningskatalogen. Du har följande katalog- och filstruktur hittills:

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

Gör PrimeService den aktuella katalogen och kör dotnet new classlib -lang VB för att skapa källprojektet. Byt namn på Class1.VB till PrimeService.VB. Du skapar en misslyckad implementering av klassen PrimeService:

Namespace Prime.Services
    Public Class PrimeService
        Public Function IsPrime(candidate As Integer) As Boolean
            Throw New NotImplementedException("Please create a test first")
        End Function
    End Class
End Namespace

Ändra tillbaka katalogen till katalogen unit-testing-vb-using-mstest. Kör dotnet sln add .\PrimeService\PrimeService.vbproj för att lägga till klassbiblioteksprojektet i lösningen.

Skapa testprojektet

Skapa sedan katalogen PrimeService.Tests. Följande disposition visar katalogstrukturen:

/unit-testing-vb-mstest
    unit-testing-vb-mstest.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests

Gör PrimeService.Tests katalogen till den aktuella katalogen och skapa ett nytt projekt med hjälp av dotnet new mstest -lang VB. Det här kommandot skapar ett testprojekt som använder MSTest som testbibliotek. Den genererade mallen konfigurerar testlöparen i PrimeServiceTests.vbproj:

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
  <PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
  <PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>

Testprojektet kräver andra paket för att skapa och köra enhetstester. dotnet new i föregående steg lade till MSTest. Lägg nu till PrimeService-klassbiblioteket som ett annat beroende till projektet. Använd kommandot dotnet reference add:

dotnet reference add ../PrimeService/PrimeService.vbproj

Du kan se hela filen i arkivet på GitHub.

Du har följande slutgiltiga lösningslayout:

/unit-testing-vb-mstest
    unit-testing-vb-mstest.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests
        Test Source Files
        PrimeServiceTests.vbproj

Kör dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj i katalogen unit-testing-vb-mstest.

Skapa det första testet

Du skriver ett misslyckat test, gör det godkänt och upprepar sedan processen. Ta bort UnitTest1.vb från katalogen PrimeService.Tests och skapa en ny Visual Basic-fil med namnet PrimeService_IsPrimeShould.VB. Lägg till följande kod:

Imports Microsoft.VisualStudio.TestTools.UnitTesting

Namespace PrimeService.Tests
    <TestClass>
    Public Class PrimeService_IsPrimeShould
        Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

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

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

    End Class
End Namespace

Attributet <TestClass> anger en klass som innehåller tester. Attributet <TestMethod> anger en metod som körs av testlöparen. Från unit-testing-vb-mstestkör du dotnet test för att skapa testerna och klassbiblioteket och sedan köra testerna. MSTest-testlöparen innehåller programmets startpunkt för att köra dina tester. dotnet test startar testrunnern med det enhetstestprojekt du har skapat.

Testet misslyckas. Du har inte skapat implementeringen än. Gör det här testet genom att skriva den enklaste koden i klassen PrimeService som fungerar:

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate = 1 Then
        Return False
    End If
    Throw New NotImplementedException("Please create a test first.")
End Function

Kör igen i katalogen dotnet test. Kommandot dotnet test kör en version för PrimeService-projektet och sedan för PrimeService.Tests-projektet. Efter att ha byggt båda projekten körs det här enskilda testet. Det går över.

Lägga till fler funktioner

Nu när du har gjort ett testpass är det dags att skriva mer. Det finns några andra enkla fall för primtal: 0, -1. Du kan lägga till dessa fall som nya tester med attributet <TestMethod>, men det blir snabbt omständligt. Det finns andra MSTest-attribut som gör att du kan skriva en uppsättning liknande tester. Du kan använda attributet <DataRow> tillsammans med attributet <TestMethod> för att ange värden för dessa indata.

I stället för att skapa nya tester använder du dessa två attribut för att skapa en enda teori. Teorin är en metod som testar flera värden som är mindre än två, vilket är det lägsta primtal:

<TestClass>
Public Class PrimeService_IsPrimeShould
    Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

    <TestMethod>
    <DataRow(-1)>
    <DataRow(0)>
    <DataRow(1)>
    Sub IsPrime_ValuesLessThan2_ReturnFalse(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

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

    <TestMethod>
    <DataRow(2)>
    <DataRow(3)>
    <DataRow(5)>
    <DataRow(7)>
    Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

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

    <TestMethod>
    <DataRow(4)>
    <DataRow(6)>
    <DataRow(8)>
    <DataRow(9)>
    Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

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

Kör dotnet testoch två av dessa tester misslyckas. Om du vill att alla tester ska godkännas ändrar du if-satsen i början av metoden:

if candidate < 2

Fortsätt att iterera genom att lägga till fler tester, fler teorier och mer kod i huvudbiblioteket. Du har den färdiga versionen av testerna och den fullständiga implementeringen av biblioteket .

Du har skapat ett litet bibliotek och en uppsättning enhetstester för biblioteket. Du har strukturerat lösningen så att tillägg av nya paket och tester är en del av det normala arbetsflödet. Du har koncentrerat dig mest på att lösa programmets mål.