Testování jednotek u kódu v jazyce C# s použitím NUnit a .NET Core

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. Pokud chcete postupovat podle kurzu pomocí předem připraveného řešení, před zahájením si prohlédněte nebo stáhněte ukázkový kód . Pokyny ke stažení najdete v tématu Ukázky a kurzy.

Tento článek se týká testování projektu .NET Core. Pokud testujete projekt ASP.NET Core, podívejte se na testy integrace v ASP.NET Core.

Požadavky

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

Vytvoření zdrojového projektu

Otevřete okno prostředí. Vytvořte adresář s názvem unit-testing-using-nunit 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-nunit
    unit-testing-using-nunit.sln
    /PrimeService

Nastavte PrimeService jako aktuální adresář a spuštěním následujícího příkazu vytvořte zdrojový projekt:

dotnet new classlib

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

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-nunit . 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-nunit
    unit-testing-using-nunit.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

Vytvořte adresář PrimeService.Tests jako aktuální adresář a vytvořte nový projekt pomocí následujícího příkazu:

dotnet new nunit

Nový příkaz dotnet vytvoří testovací projekt, který jako testovací knihovnu používá NUnit. Vygenerovaná šablona nakonfiguruje spouštěč testů v souboru PrimeService.Tests.csproj :

<ItemGroup>
  <PackageReference Include="nunit" Version="4.1.0" />
  <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
  <PackageReference Include="NUnit.Analyzers" Version="4.2.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
  </PackageReference>
</ItemGroup>

Poznámka:

Před .NET 9 může vygenerovaný kód odkazovat na starší verze testovací architektury NUnit. K aktualizaci balíčků můžete použít rozhraní příkazového řádku dotnet. Případně otevřete soubor PrimeService.Tests.csproj a nahraďte obsah balíčku odkazem na skupinu položek kódem výše.

Testovací projekt vyžaduje k vytvoření a spuštění testů jednotek další balíčky. Příkaz dotnet new v předchozím kroku přidal testovací sadu SDK Microsoftu, testovací architekturu NUnit a adaptér testu NUnit. Teď do projektu přidejte knihovnu PrimeService tříd jako další závislost. dotnet add reference Použijte příkaz:

dotnet add reference ../PrimeService/PrimeService.csproj

Celý soubor můžete zobrazit v úložišti ukázek na GitHubu.

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

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.csproj

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

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

Vytvoření prvního testu

Napíšete jeden neúspěšný test, zopakujete ho a pak tento proces zopakujete. V adresáři PrimeService.Tests přejmenujte soubor UnitTest1.cs na PrimeService_IsPrimeShould.cs a nahraďte celý jeho obsah následujícím kódem:

using NUnit.Framework;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    [TestFixture]
    public class PrimeService_IsPrimeShould
    {
        private PrimeService _primeService;

        [SetUp]
        public void SetUp()
        {
            _primeService = new PrimeService();
        }

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

            Assert.That(result, Is.False, "1 should not be prime");
        }
    }
}

Atribut [TestFixture] označuje třídu, která obsahuje testy jednotek. Atribut [Test] označuje metodu jako testovací metodu.

Uložte tento soubor a spusťte dotnet test příkaz, který sestaví testy a knihovnu tříd a spustí testy. Spouštěč testů NUnit obsahuje vstupní bod programu pro spuštění testů. dotnet test spustí spouštěč testů pomocí projektu testování jednotek, který jste vytvořili.

Váš test selže. Ještě jste nevytvořili implementaci. Proveďte test tak, že napíšete nejjednodušší kód ve PrimeService třídě, 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-nunit spusťte dotnet test znovu. Příkaz dotnet test spustí sestavení projektu PrimeService a pak projekt 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 změní na zdlouhavé. Existují další atributy NUnit, které umožňují napsat sadu podobných testů. Atribut [TestCase] se používá k vytvoření sady testů, které provádějí stejný kód, ale mají různé vstupní argumenty. Atribut můžete použít [TestCase] k určení hodnot pro tyto vstupy.

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

[TestCase(-1)]
[TestCase(0)]
[TestCase(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
    var result = _primeService?.IsPrime(value);

    Assert.That(result, Is.False, $"{value} should not be prime");
}

Spusťte dotnet testa dva z těchto testů selžou. Chcete-li provést všechny testy úspěšné, změňte if klauzuli na začátku Main metody v souboru PrimeService.cs :

if (candidate < 2)

Pokračujte iterováním přidáním dalších testů, teorie a kódu v hlavní knihovně. Máte dokončenou verzi testů a úplnou implementaci knihovny.

Vytvořili jste malou knihovnu a sadu testů jednotek 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.