Enhetstestning Visual Basic .NET bibliotek med dotnet-test och TUnit

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.

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

Prerequisites

  • .NET 10 SDK eller senare versioner.
  • Valfri textredigerare eller kodredigerare.

TUnit bygger helt på Microsoft. Testing.Platform (MTP) och stöder inte VSTest. I den här självstudien används MTP-läget i dotnet test, som kräver .NET 10 SDK.

Skapa källprojektet

Öppna ett gränssnittsfönster. Skapa en katalog med namnet unit-testing-vb-tunit 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-tunit
    unit-testing-vb-tunit.slnx
    /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 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

Byt tillbaka till katalogen unit-testing-vb-tunit. 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-tunit
    unit-testing-vb-tunit.slnx
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests

TUnit-projektmallarna ingår inte i .NET SDK. Installera dem med följande kommando:

dotnet new install TUnit.Templates

Gör katalogen PrimeService.Tests till den aktuella katalogen och skapa ett nytt projekt med följande kommando:

dotnet new TUnit -lang VB

Note

Korta mallnamn är skiftlägeskänsliga. Använd TUnit, inte tunit.

Kommandot dotnet new skapar ett testprojekt som använder TUnit som testbibliotek. Den genererade filen PrimeService.Tests.vbproj är ett körbart projekt som refererar till TUnit paketet, som innehåller testramverket, kontrollbiblioteket och MTP-testlöparen, så att projektet inte behöver några andra testpaket.

Mallen lägger också till exempeltester. Ta bort alla .vb filer och datakatalogen från katalogen PrimeService.Tests , eftersom den här självstudien ersätter dem med egna tester.

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 har följande slutgiltiga lösningslayout:

/unit-testing-vb-tunit
    unit-testing-vb-tunit.slnx
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.vbproj

Kör följande kommando i katalogen unit-testing-vb-tunit :

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj

Konfigurera MTP-läget för dotnet-test

Eftersom TUnit inte stöder VSTest dotnet test måste det köras i dess MTP-läge. I katalogen unit-testing-vb-tunit skapar du en global.json fil med följande innehåll:

{
    "test": {
        "runner": "Microsoft.Testing.Platform"
    }
}

Mer information finns i MTP-läge för dotnet-test.

Skapa det första testet

Du skriver ett misslyckat test, gör det godkänt och upprepar sedan processen. I katalogen PrimeService.Tests skapar du en PrimeService_IsPrimeShould.vb fil med följande kod:

Imports TUnit.Assertions
Imports TUnit.Assertions.Extensions
Imports TUnit.Core

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

        <Test>
        Public Async Function IsPrime_InputIs1_ReturnFalse() As Task
            Dim result As Boolean = _primeService.IsPrime(1)

            Await Assert.That(result).IsFalse()
        End Function

    End Class
End Namespace

Attributet <Test> anger en metod som körs av testlöparen. TUnit behöver inget attribut på klassen. TUnit-asserteringar är asynkrona, så testet är ett Async Function som returnerar en Task och inväntar Assert.That.

Visual Basic placerar koden i varje projekt under projektets rotnamnrymd, så PrimeService-klassen finns i PrimeService.Prime.Services-namnrymden. Testet refererar till det som Prime.Services.PrimeService eftersom namnet PrimeService i testprojektets namnområden refererar till ett namnområde i stället för till klassen.

Från katalogen unit-testing-vb-tunit kör dotnet test för att skapa testerna och klassbiblioteket och kör sedan testerna. TUnit-testprojektet innehåller programmets startpunkt för att köra dina tester. dotnet test startar testprogrammet 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

I katalogen dotnet test, kör igen. Kommandot dotnet test kör en version för PrimeService-projektet och sedan för PrimeService.Tests-projektet. Efter att båda projekten har byggts körs det 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 <Test>, men det blir snabbt omständligt. TUnit tillhandahåller <Arguments> attributet för att skapa en uppsättning tester som kör samma kod men som har olika indataargument.

I stället för att skapa nya tester använder du det här attributet för att skapa ett enda datadrivet test. Ersätt funktionen IsPrime_InputIs1_ReturnFalse med följande kod, som testar flera värden mindre än två, det lägsta primtalet:

<Test>
<Arguments(-1)>
<Arguments(0)>
<Arguments(1)>
Public Async Function IsPrime_ValuesLessThan2_ReturnFalse(value As Integer) As Task
    Dim result As Boolean = _primeService.IsPrime(value)

    Await Assert.That(result).IsFalse()
End Function

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 IsPrime metoden i PrimeService.vb-filen :

If candidate < 2 Then

Fortsätt att iterera genom att lägga till fler tester och mer kod i huvudbiblioteket.

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.

Se även