Share via


Visual Basic .NET Core-bibliotheken testen met dotnet-test en MSTest

In deze zelfstudie wordt u stapsgewijs begeleid bij het bouwen van een voorbeeldoplossing voor het leren van concepten voor het testen van eenheden. Als u liever de zelfstudie volgt met behulp van een vooraf gebouwde oplossing, bekijkt of downloadt u de voorbeeldcode voordat u begint. Zie Voorbeelden en zelfstudies voor downloadinstructies.

Dit artikel gaat over het testen van een .NET Core-project. Als u een ASP.NET Core-project test, raadpleegt u Integratietests in ASP.NET Core.

Het bronproject maken

Open een shellvenster. Maak een map met de naam unit-testing-vb-mstest om de oplossing te bewaren. Voer in deze nieuwe map uit dotnet new sln om een nieuwe oplossing te maken. Deze procedure maakt het eenvoudiger om zowel de klassebibliotheek als het eenheidstestproject te beheren. Maak in de oplossingsmap een PrimeService-map . U hebt de volgende map- en bestandsstructuur tot nu toe:

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

Maak PrimeService de huidige map en voer deze uit dotnet new classlib -lang VB om het bronproject te maken. Wijzig de naam van Class1.VB in PrimeService.VB. U maakt een mislukte implementatie van de PrimeService klasse:

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

Wijzig de map weer in de map unit-testing-vb-using-mstest . Voer uit dotnet sln add .\PrimeService\PrimeService.vbproj om het klassebibliotheekproject toe te voegen aan de oplossing.

Het testproject maken

Maak vervolgens de map PrimeService.Tests . In het volgende overzicht ziet u de mapstructuur:

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

Maak de map PrimeService.Tests de huidige map en maak een nieuw project met behulp van dotnet new mstest -lang VB. Met deze opdracht maakt u een testproject dat MSTest als testbibliotheek gebruikt. De gegenereerde sjabloon configureert de testrunner in de 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>

Voor het testproject zijn andere pakketten vereist om eenheidstests te maken en uit te voeren. dotnet new in de vorige stap zijn MSTest en de MSTest runner toegevoegd. Voeg nu de PrimeService klassebibliotheek toe als een andere afhankelijkheid aan het project. Gebruik de dotnet add reference opdracht:

dotnet add reference ../PrimeService/PrimeService.vbproj

U kunt het hele bestand zien in de opslagplaats met voorbeelden op GitHub.

U hebt de volgende indeling voor de uiteindelijke oplossing:

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

Voer dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj uit in de map unit-testing-vb-mstest .

De eerste test maken

U schrijft één mislukte test, laat deze slagen en herhaal het proces. Verwijder UnitTest1.vb uit de map PrimeService.Tests en maak een nieuw Visual Basic-bestand met de naam PrimeService_IsPrimeShould.VB. Voeg de volgende code toe:

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

Het <TestClass> kenmerk geeft een klasse aan die tests bevat. Het <TestMethod> kenmerk geeft een methode aan die wordt uitgevoerd door de testloper. Voer vanuit unit-testing-vb-mstest de dotnet test tests en de klassebibliotheek uit en voer vervolgens de tests uit. De MSTest-testrunner bevat het programmainvoerpunt om uw tests uit te voeren. dotnet test start de testrunner met behulp van het eenheidstestproject dat u hebt gemaakt.

Uw test mislukt. U hebt de implementatie nog niet gemaakt. Zorg ervoor dat deze test wordt doorgegeven door de eenvoudigste code te schrijven in de PrimeService klasse die werkt:

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

Voer dotnet test opnieuw uit in de map unit-testing-vb-mstest. Met de dotnet test opdracht wordt een build voor het PrimeService project uitgevoerd en vervolgens voor het PrimeService.Tests project. Na het bouwen van beide projecten wordt deze enkele test uitgevoerd. Het gaat voorbij.

Meer functies toevoegen

Nu u één testpas hebt gemaakt, is het tijd om meer te schrijven. Er zijn enkele andere eenvoudige gevallen voor priemgetallen: 0, -1. U kunt deze gevallen toevoegen als nieuwe tests met het <TestMethod> kenmerk, maar dat wordt snel tijdrovend. Er zijn andere MSTest-kenmerken waarmee u een suite met vergelijkbare tests kunt schrijven. Een <DataTestMethod> kenmerk vertegenwoordigt een reeks tests die dezelfde code uitvoeren, maar verschillende invoerargumenten hebben. U kunt het <DataRow> kenmerk gebruiken om waarden voor deze invoer op te geven.

In plaats van nieuwe tests te maken, past u deze twee kenmerken toe om één theorie te maken. De theorie is een methode waarmee verschillende waarden worden getest die kleiner zijn dan twee, wat het laagste priemnummer is:

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

    <DataTestMethod>
    <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

    <DataTestMethod>
    <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

    <DataTestMethod>
    <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

Uitvoeren dotnet testen twee van deze tests mislukken. Als u alle tests wilt doorgeven, wijzigt u de if component aan het begin van de methode:

if candidate < 2

Blijf herhalen door meer tests, meer theorieën en meer code toe te voegen in de hoofdbibliotheek. U hebt de voltooide versie van de tests en de volledige implementatie van de bibliotheek.

U hebt een kleine bibliotheek en een set eenheidstests voor die bibliotheek gemaakt. U hebt de oplossing gestructureerd zodat het toevoegen van nieuwe pakketten en tests deel uitmaakt van de normale werkstroom. U hebt zich het grootste deel van uw tijd en moeite geconcentreerd op het oplossen van de doelstellingen van de toepassing.