Enhetstestning av C# med TUnit och .NET

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 för dotnet test, som kräver .NET 10 SDK.

Skapa källprojektet

Öppna ett gränssnittsfönster. Skapa en katalog med namnet unit-testing-using-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 katalogen och filstrukturen hittills:

/unit-testing-using-tunit
    unit-testing-using-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

Byt namn på Class1.cs till PrimeService.cs. Du skapar en misslyckad implementering av klassen PrimeService:

using System;

namespace Prime.Services
{
    public class PrimeService
    {
        public bool IsPrime(int candidate)
        {
            throw new NotImplementedException("Please create a test first.");
        }
    }
}

Byt tillbaka till katalogen unit-testing-using-tunit. Kör följande kommando för att lägga till klassbiblioteksprojektet i lösningen:

dotnet sln add PrimeService/PrimeService.csproj

Skapa testprojektet

Skapa sedan katalogen PrimeService.Tests. Följande disposition visar katalogstrukturen:

/unit-testing-using-tunit
    unit-testing-using-tunit.slnx
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

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

dotnet new install TUnit.Templates

Ändra katalogen till katalogen PrimeService.Tests och skapa ett nytt projekt med följande kommando:

dotnet new TUnit

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.csproj är ett körbart projekt som refererar till TUnit paketet (versionsnumret kan skilja sig åt):

<PropertyGroup>
  <ImplicitUsings>enable</ImplicitUsings>
  <Nullable>enable</Nullable>
  <OutputType>Exe</OutputType>
  <TargetFramework>net10.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="TUnit" Version="1.*" />
</ItemGroup>

Paketet TUnit innehåller testramverket, kontrollbiblioteket och MTP-testlöparen, så projektet behöver inga andra testpaket. Mallen lägger också till exempeltester. Ta bort alla .cs 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.csproj

Följande disposition visar den slutliga lösningslayouten:

/unit-testing-using-tunit
    unit-testing-using-tunit.slnx
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.csproj

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

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

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-using-tunit skapar du en global.json fil med följande innehåll:

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

Mer information finns i MTP-läget 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.cs fil med följande kod:

namespace Prime.UnitTests.Services
{
    using Prime.Services;

    public class PrimeService_IsPrimeShould
    {
        private readonly PrimeService _primeService = new();

        [Test]
        public async Task IsPrime_InputIs1_ReturnFalse()
        {
            var result = _primeService.IsPrime(1);

            await Assert.That(result).IsFalse();
        }
    }
}

Attributet [Test] anger att en metod är en testmetod. TUnit behöver inget attribut på klassen. TUnit-assertsatser är asynkrona, så testmetoden returnerar en Task och väntar på Assert.That. Paketet TUnit lägger till globala using direktiv för sina namnområden, så filen behöver dem inte.

Note

Direktivet using Prime.Services; finns i namnområdet med flit. MTP genererar testprogrammets startpunkt i projektets rotnamnområde, PrimeService.Tests. Det namnområdet döljer PrimeService klassen från ett using direktiv överst i filen, men inte från ett i namnområdet.

Spara den här filen och kör dotnet test kommandot för att skapa testerna och klassbiblioteket och köra testerna. TUnit-testprojektet innehåller programmets startpunkt för att köra dina tester. dotnet test startar testprogrammet med det enhetstestprojekt som du skapade.

Testet misslyckas. Du har inte skapat implementeringen än. Gör testet genom att skriva den enklaste koden i klassen PrimeService som fungerar:

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Please create a test first.");
}

Kör igen i katalogen dotnet test. 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. 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 nya tester med [Test] attributet, 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. IsPrime_InputIs1_ReturnFalse Ersätt metoden med följande kod. Det datadrivna testet är en metod som testar flera värden som är mindre än två, vilket är det lägsta primtal:

[Test]
[Arguments(-1)]
[Arguments(0)]
[Arguments(1)]
public async Task IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
    var result = _primeService.IsPrime(value);

    await Assert.That(result).IsFalse();
}

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

if (candidate < 2)

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

Du har skapat ett litet bibliotek och en uppsättning enhetstester för biblioteket. Du har också strukturerat lösningen så att tillägg av nya paket och tester är en del av standardarbetsflödet. Du har koncentrerat dig mest på att lösa programmets mål.

Se även