Sdílet prostřednictvím


Testování jednotek V# pomocí 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í, zobrazit nebo stáhnout ukázkový kód, než začnete. Pokyny ke stažení najdete ve vzorech a návodech .

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.

Požadavky

Vytvoření zdrojového projektu

Otevřete okno příkazového řádku. 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 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-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

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

dotnet new nunit

Příkaz dotnet new 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.4.0" />
  <PackageReference Include="NUnit3TestAdapter" Version="5.2.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
  <PackageReference Include="NUnit.Analyzers" Version="4.11.2">
      <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 skupiny položek odkazů na balíček kódem zobrazeným dříve.

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 tříd PrimeService jako jinou závislost. Použijte příkaz dotnet add reference:

dotnet add reference ../PrimeService/PrimeService.csproj

Poznámka:

Pokud používáte sadu .NET 10 SDK nebo novější, můžete použít formulář podstatných jmen: dotnet reference add ../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, uzpůsobíte jej tak, aby prošel, 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 shouldn't be prime");
        }
    }
}

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

Uložte tento soubor a spusťte příkaz dotnet test, 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í testovací nástroj pomocí jednotkového testovacího projektu, 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-nunit 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. Existují další atributy NUnit, které umožňují napsat sadu podobných testů. Atribut [TestCase] slouží k vytvoření sady testů, které provádějí stejný kód, ale mají různé vstupní argumenty. Pomocí atributu [TestCase] můžete zadat hodnoty 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. 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ů, teorie a kódu v hlavní knihovně. Máte dokončenou verzi testů a kompletní implementaci knihovny.

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.