Testování jednotek C# s TUnit a .NET

Tento kurz vás provede interaktivním prostředím a podrobným sestavením ukázkového řešení, kde se seznámíte s koncepty testování jednotek.

Tento článek se týká testování projektu .NET Core. Pokud testujete projekt ASP.NET Core, přečtěte si téma Integrační testy v ASP.NET Core.

Prerequisites

  • .NET 10 SDK nebo novější verze.
  • Textový editor nebo editor kódu podle vašeho výběru.

TUnit je postaven zcela na Microsoft.Testing.Platform (MTP) a nepodporuje VSTest. Tento kurz používá režim dotnet testMTP , který vyžaduje .NET 10 SDK.

Vytvoření zdrojového projektu

Otevřete okno příkazového řádku. Vytvořte adresář s názvem unit-testing-using-tunit pro uložení řešení. V tomto novém adresáři spusťte následující příkaz, který vytvoří nový soubor řešení pro knihovnu tříd a testovací projekt:

dotnet new sln

Dále vytvořte adresář PrimeService. Následující osnova ukazuje zatím strukturu adresářů a souborů:

/unit-testing-using-tunit
    unit-testing-using-tunit.slnx
    /PrimeService

Nastavte PrimeService jako aktuální adresář a poté spusťte následující příkaz pro vytvoření zdrojového projektu:

dotnet new classlib

Přejmenujte Class1.cs na PrimeService.cs. Vytvoříte neúspěšnou implementaci třídy PrimeService:

using System;

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

Změňte adresář zpět na adresář unit-testing-using-tunit . Spuštěním následujícího příkazu přidejte do řešení projekt knihovny tříd:

dotnet sln add PrimeService/PrimeService.csproj

Vytvoření testovacího projektu

Dále vytvořte adresář PrimeService.Tests. Následující osnova ukazuje adresářovou strukturu:

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

Šablony projektů TUnit nejsou součástí sady .NET SDK. Nainstalujte je pomocí následujícího příkazu:

dotnet new install TUnit.Templates

Pomocí následujícího příkazu změňte adresář na adresář PrimeService.Tests a vytvořte nový projekt:

dotnet new TUnit

Note

Krátké názvy šablon rozlišují malá a velká písmena. Použít TUnit, ne tunit.

Příkaz dotnet new vytvoří testovací projekt, který jako testovací knihovnu používá TUnit. Vygenerovaný soubor PrimeService.Tests.csproj je spustitelný projekt, který odkazuje na balíček TUnit (číslo verze se může lišit):

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

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

Balíček TUnit obsahuje testovací framework, knihovnu asercí a spouštěč testů MTP, takže projekt nepotřebuje žádné další testovací balíčky. Šablona také přidá ukázkové testy. Odstraňte všechny soubory .cs a adresář Data z adresáře PrimeService.Tests , protože tento kurz je nahradí vlastními testy.

Teď do projektu přidejte knihovnu tříd PrimeService jako jinou závislost. Použijte příkaz dotnet reference add:

dotnet reference add ../PrimeService/PrimeService.csproj

Následující osnova ukazuje konečné rozložení řešení:

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

V adresáři unit-testing-using-tunit spusťte následující příkaz:

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

Konfigurace režimu MTP testu dotnet

Vzhledem k tomu, že TUnit nepodporuje VSTest, dotnet test musí běžet v režimu MTP. V adresáři unit-testing-using-tunit vytvořte soubor global.json s následujícím obsahem:

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

Další informace naleznete v tématu MTP režim dotnet test.

Vytvoření prvního testu

Napíšete jeden neúspěšný test, uzpůsobíte jej tak, aby prošel, a pak tento proces zopakujete. V adresáři PrimeService.Tests vytvořte soubor PrimeService_IsPrimeShould.cs s následujícím kódem:

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();
        }
    }
}

Atribut [Test] označuje metodu jako testovací metodu. TUnit nepotřebuje atribut na třídě. Aserce TUnit jsou asynchronní, takže testovací metoda vrátí Task a čeká na Assert.That. Balíček TUnit přidává globální direktivy using pro své obory názvů, takže je soubor nepotřebuje.

Note

Direktiva using Prime.Services; je uvnitř oboru názvů záměrně. MTP vygeneruje vstupní bod testovací aplikace v kořenovém oboru názvů projektu . PrimeService.Tests Tento jmenný prostor skryje třídu PrimeService před direktivou using v horní části souboru, ale ne před direktivou uvnitř jmenného prostoru.

Uložte tento soubor a spusťte příkaz dotnet test, který sestaví testy a knihovnu tříd a spustí testy. Projekt testu TUnit obsahuje vstupní bod programu pro spuštění testů. dotnet test spustí testovací aplikaci pomocí projektu jednotkových testů, který jste vytvořili.

Váš test neuspěl. Zatím jste implementaci nevytvořili. Proveďte test tak, že napíšete nejjednodušší kód ve třídě PrimeService, který funguje.

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

V adresáři unit-testing-using-tunit spusťte dotnet test znovu. Příkaz dotnet test spustí sestavení projektu PrimeService a poté projektu PrimeService.Tests. Po sestavení obou projektů se spustí tento jediný test. Projde.

Přidání dalších funkcí

Teď, když jste udělali jeden test, je čas napsat více. Existuje několik dalších jednoduchých případů pro prime čísla: 0, -1. Můžete přidat nové testy s atributem [Test], ale to se rychle stane zdlouhavým. TUnit poskytuje [Arguments] atribut pro vytvoření sady testů, které provádějí stejný kód, ale mají různé vstupní argumenty.

Místo vytváření nových testů použijte tento atribut k vytvoření jednoho testu řízeného daty. Nahraďte metodu IsPrime_InputIs1_ReturnFalse následujícím kódem. Test řízený daty je metoda, která testuje několik hodnot menší než dvě, což je nejnižší základní číslo:

[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();
}

Spusťte dotnet testa dva z těchto testů selžou. Aby všechny testy prošly, změňte podmínku if na začátku metody IsPrime v souboru PrimeService.cs.

if (candidate < 2)

Pokračujte iterováním přidáním dalších testů a kódu v hlavní knihovně.

Vytvořili jste malou knihovnu a sadu jednotkových testů pro tuto knihovnu. Také jste řešení strukturovali tak, aby přidání nových balíčků a testů bylo součástí standardního pracovního postupu. Většinu času a úsilí jste se zaměřili na řešení cílů aplikace.

Viz také