Eenheid testen van Visual Basic .NET Core-bibliotheken met behulp van dotnet-test en NUnit
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.
Vereisten
- .NET 8 SDK of latere versies.
- Een teksteditor of code-editor naar keuze.
Het bronproject maken
Open een shellvenster. Maak een map met de naam unit-testing-vb-nunit om de oplossing te bewaren. Voer in deze nieuwe map de volgende opdracht uit om een nieuw oplossingsbestand voor de klassebibliotheek en het testproject te maken:
dotnet new sln
Maak vervolgens een PrimeService-map . In het volgende overzicht ziet u de bestandsstructuur tot nu toe:
/unit-testing-vb-nunit
unit-testing-vb-nunit.sln
/PrimeService
Maak PrimeService de huidige map en voer de volgende opdracht uit om het bronproject te maken:
dotnet new classlib -lang VB
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 de volgende opdracht uit om het klassebibliotheekproject toe te voegen aan de oplossing:
dotnet sln add .\PrimeService\PrimeService.vbproj
Het testproject maken
Maak vervolgens de map PrimeService.Tests . In het volgende overzicht ziet u de mapstructuur:
/unit-testing-vb-nunit
unit-testing-vb-nunit.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Maak de map PrimeService.Tests de huidige map en maak een nieuw project met behulp van de volgende opdracht:
dotnet new nunit -lang VB
Met de nieuwe dotnet-opdracht maakt u een testproject dat NUnit als testbibliotheek gebruikt. De gegenereerde sjabloon configureert de testrunner in het bestand PrimeServiceTests.vbproj :
<ItemGroup>
<PackageReference Include="nunit" Version="4.2.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
</ItemGroup>
Notitie
Vóór .NET 9 kan de gegenereerde code verwijzen naar oudere versies van het NUnit-testframework. U kunt dotnet CLI gebruiken om de pakketten bij te werken. U kunt ook het bestand PrimeService.Tests.vbproj openen en de inhoud van de pakketverwijzingen itemgroep vervangen door de bovenstaande code.
Voor het testproject zijn andere pakketten vereist om eenheidstests te maken en uit te voeren. dotnet new
in de vorige stap zijn NUnit en de NUnit-testadapter 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-nunit
unit-testing-vb-nunit.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Test Source Files
PrimeService.Tests.vbproj
Voer de volgende opdracht uit in de map unit-testing-vb-nunit :
dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj
De eerste test maken
U schrijft één mislukte test, laat deze slagen en herhaal het proces. Wijzig in de map PrimeService.Tests de naam van het bestand UnitTest1.vb in PrimeService_IsPrimeShould.VB en vervang de volledige inhoud door de volgende code:
Imports NUnit.Framework
Namespace PrimeService.Tests
<TestFixture>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<Test>
Sub IsPrime_InputIs1_ReturnFalse()
Dim result As Boolean = _primeService.IsPrime(1)
Assert.That(result, [Is].False, $"1 should not be prime")
End Sub
End Class
End Namespace
Het <TestFixture>
kenmerk geeft een klasse aan die tests bevat. Het <Test>
kenmerk geeft een methode aan die wordt uitgevoerd door de testloper. Voer vanuit unit-testing-vb-nunit dotnet test
uit om de tests en de klassebibliotheek te bouwen en voer vervolgens de tests uit. De NUnit-testloper bevat het ingangspunt van het programma 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-nunit. 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 <Test>
kenmerk, maar dat wordt snel tijdrovend. Er zijn andere xUnit-kenmerken waarmee u een suite met vergelijkbare tests kunt schrijven. Een <TestCase>
kenmerk vertegenwoordigt een reeks tests die dezelfde code uitvoeren, maar verschillende invoerargumenten hebben. U kunt het <TestCase>
kenmerk gebruiken om waarden voor deze invoer op te geven.
In plaats van nieuwe tests te maken, past u deze twee kenmerken toe om een reeks tests te maken die verschillende waarden minder dan twee testen, wat het laagste priemnummer is:
<TestFixture>
Public Class PrimeService_IsPrimeShould
Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()
<TestCase(-1)>
<TestCase(0)>
<TestCase(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.That(result, [Is].False, $"{value} should not be prime")
End Sub
<TestCase(2)>
<TestCase(3)>
<TestCase(5)>
<TestCase(7)>
Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.That(result, [Is].True, $"{value} should be prime")
End Sub
<TestCase(4)>
<TestCase(6)>
<TestCase(8)>
<TestCase(9)>
Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.That(result, [Is].False, $"{value} should not be prime")
End Sub
End Class
Uitvoeren dotnet test
en twee van deze tests mislukken. Als u alle tests wilt laten slagen, wijzigt u de if
component aan het begin van de Main
methode in het bestand PrimeServices.cs :
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.