Enhetstestning av Visual Basic .NET Core-bibliotek med dotnet-test och NUnit
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 självstudien med hjälp av en färdig lösning kan du visa 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 Integreringstester i ASP.NET Core.
Förutsättningar
- .NET 8 SDK eller senare versioner.
- Valfri textredigerare eller kodredigerare.
Skapa källprojektet
Öppna ett gränssnittsfönster. Skapa en katalog med namnet unit-testing-vb-nunit för att lagra lösningen. I den här nya katalogen kör du följande kommando för att skapa en ny lösningsfil för klassbiblioteket och testprojektet:
dotnet new sln
Skapa sedan en PrimeService-katalog . Följande disposition visar filstrukturen hittills:
/unit-testing-vb-nunit
unit-testing-vb-nunit.sln
/PrimeService
Gör PrimeService till den aktuella katalogen och kör följande kommando för att skapa källprojektet:
dotnet new classlib -lang VB
Byt namn på Class1.VB till PrimeService.VB. Du skapar en misslyckad implementering av PrimeService
klassen:
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 följande kommando för att lägga till klassbiblioteksprojektet i lösningen:
dotnet sln add .\PrimeService\PrimeService.vbproj
Skapa testprojektet
Skapa sedan katalogen PrimeService.Tests . Följande disposition visar katalogstrukturen:
/unit-testing-vb-nunit
unit-testing-vb-nunit.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Gör katalogen PrimeService.Tests till den aktuella katalogen och skapa ett nytt projekt med följande kommando:
dotnet new nunit -lang VB
Det nya dotnet-kommandot skapar ett testprojekt som använder NUnit som testbibliotek. Den genererade mallen konfigurerar testlöparen i filen PrimeServiceTests.vbproj :
<ItemGroup>
<PackageReference Include="nunit" Version="4.3.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
</ItemGroup>
Kommentar
Före .NET 9 kan den genererade koden referera till äldre versioner av NUnit-testramverket. Du kan använda dotnet CLI för att uppdatera paketen. Du kan också öppna filen PrimeService.Tests.vbproj och ersätta innehållet i paketreferensobjektgruppen med koden ovan.
Testprojektet kräver andra paket för att skapa och köra enhetstester. dotnet new
I föregående steg lades NUnit och NUnit-testkortet till. Lägg nu till PrimeService
klassbiblioteket som ett annat beroende till projektet. dotnet add reference
Använd kommandot:
dotnet add reference ../PrimeService/PrimeService.vbproj
Du kan se hela filen i exempellagringsplatsen på GitHub.
Du har följande slutgiltiga lösningslayout:
/unit-testing-vb-nunit
unit-testing-vb-nunit.sln
/PrimeService
Source Files
PrimeService.vbproj
/PrimeService.Tests
Test Source Files
PrimeService.Tests.vbproj
Kör följande kommando i katalogen unit-testing-vb-nunit :
dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj
Skapa det första testet
Du skriver ett misslyckat test, gör det godkänt och upprepar sedan processen. I katalogen PrimeService.Tests byter du namn på filen UnitTest1.vb till PrimeService_IsPrimeShould.VB och ersätter hela innehållet med följande kod:
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
Attributet <TestFixture>
anger en klass som innehåller tester. Attributet <Test>
anger en metod som körs av testlöparen. Från unit-testing-vb-nunit kör dotnet test
du för att skapa testerna och klassbiblioteket och kör sedan testerna. NUnit-testlöparen innehåller programmets startpunkt för att köra dina tester. dotnet test
startar testkören med det enhetstestprojekt som 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
unit-testing-vb-nunit. Kommandot dotnet test
kör en version för PrimeService
projektet och sedan för PrimeService.Tests
projektet. När du har skapat båda projekten körs det här enskilda testet. Den passerar.
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 <Test>
attributet, men det blir snabbt omständligt. Det finns andra xUnit-attribut som gör att du kan skriva en uppsättning liknande tester. Ett <TestCase>
attribut representerar en uppsättning tester som kör samma kod men som har olika indataargument. Du kan använda attributet <TestCase>
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 serie tester som testar flera värden som är mindre än två, vilket är det lägsta primtal:
<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
Kör dotnet test
och två av dessa tester misslyckas. Om du vill att alla tester ska godkännas ändrar du if
-satsen i början av Main
metoden i filen PrimeServices.cs :
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.