Visual Basic .NET Core-bibliotheken testen met dotnet-test en MSTest
In deze zelfstudie wordt u door een interactieve ervaring stapsgewijs begeleid bij het bouwen van een voorbeeldoplossing om de concepten van unittesting te leren. Als u de zelfstudie liever volgt met behulp van een vooraf gebouwde oplossing, de voorbeeldcode bekijken of downloaden voordat u begint. Zie voorbeelden en zelfstudiesvoor downloadinstructies.
Dit artikel gaat over het testen van een .NET Core-project. Als u een ASP.NET Core-project aan het testen bent, 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 dotnet new sln
uit 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 directory. 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 dotnet new classlib -lang VB
uit 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 terug naar de map unit-testing-vb-using-mstest. Voer dotnet sln add .\PrimeService\PrimeService.vbproj
uit om het klassebibliotheekproject toe te voegen aan de oplossing.
Het testproject maken
Maak vervolgens de map PrimeService.Tests. Het volgende schema toont de directorystructuur:
/unit-testing-vb-mstest
unit-testing-vb-mstest.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Maak de PrimeService.Tests map 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 heeft MSTest toegevoegd. Voeg nu de PrimeService
klassebibliotheek toe als een andere afhankelijkheid van het project. Gebruik de opdracht dotnet add reference
:
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 unit-testing-vb-mstest directory.
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 kenmerk <TestClass>
geeft een klasse aan die tests bevat. Het kenmerk <TestMethod>
geeft een methode aan die wordt uitgevoerd door de testloper. Voer vanuit de eenheidstest-vb-mstestdotnet test
uit om de tests en de klassebibliotheek te bouwen en vervolgens de tests uit te voeren. De MSTest-testrunner bevat het programmainvoerpunt om uw tests uit te voeren.
dotnet test
start de test runner met het unittestproject dat u hebt gemaakt.
Uw test mislukt. U hebt de implementatie nog niet gemaakt. Zorg ervoor dat deze test slaagt door de simpelste code in de PrimeService
-klasse te schrijven 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 opdracht dotnet test
wordt een build uitgevoerd voor het PrimeService
project en vervolgens voor het PrimeService.Tests
project. Nadat beide projecten zijn gebouwd, wordt deze enkele test uitgevoerd. Het gaat voorbij.
Meer functies toevoegen
Nu u één testcyclus hebt voltooid, is het tijd om meer tests te schrijven. Er zijn enkele andere eenvoudige gevallen voor priemgetallen: 0, -1. U kunt deze gevallen toevoegen als nieuwe tests met het kenmerk <TestMethod>
, maar dat wordt snel tijdrovend. Er zijn andere MSTest-kenmerken waarmee u een suite met vergelijkbare tests kunt schrijven. U kunt het kenmerk <DataRow>
samen met <TestMethod>
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()
<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
Voer dotnet test
uit en twee van deze tests mislukken. Om alle tests te laten slagen, wijzigt u de if
-clausule 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.