Testování částí V jazyce C# v .NET pomocí testu dotnet a xUnit

V tomto kurzu se dozvíte, jak sestavit řešení obsahující projekt testování jednotek a projekt zdrojového kódu. Pokud chcete postupovat podle kurzu pomocí předem připraveného řešení, zobrazte nebo stáhněte ukázkový kód. Pokyny ke stažení najdete v tématu Ukázky a kurzy.

Vytvoření řešení

V této části se vytvoří řešení, které obsahuje zdrojové a testovací projekty. Dokončené řešení má následující adresářovou strukturu:

/unit-testing-using-dotnet-test
    unit-testing-using-dotnet-test.sln
    /PrimeService
        PrimeService.cs
        PrimeService.csproj
    /PrimeService.Tests
        PrimeService_IsPrimeShould.cs
        PrimeServiceTests.csproj

Následující pokyny obsahují postup vytvoření testovacího řešení. Pokyny k vytvoření testovacího řešení najdete v tématu Příkazy pro vytvoření testovacího řešení v jednom kroku.

  • Otevřete okno prostředí.

  • Spusťte následující příkaz:

    dotnet new sln -o unit-testing-using-dotnet-test
    

    Příkaz dotnet new sln vytvoří nové řešení v adresáři unit-testing-using-dotnet-test .

  • Změňte adresář na složku unit-testing-using-dotnet-test .

  • Spusťte následující příkaz:

    dotnet new classlib -o PrimeService
    

    Příkaz dotnet new classlib vytvoří nový projekt knihovny tříd ve složce PrimeService . Nová knihovna tříd bude obsahovat kód, který se má testovat.

  • Přejmenujte Class1.cs na PrimeService.cs.

  • Nahraďte kód v PrimeService.cs následujícím kódem:

    using System;
    
    namespace Prime.Services
    {
        public class PrimeService
        {
            public bool IsPrime(int candidate)
            {
                throw new NotImplementedException("Not implemented.");
            }
        }
    }
    
  • Předchozí kód:

    • NotImplementedException Vyvolá zprávu s oznámením, že není implementována.
    • Aktualizuje se později v tomto kurzu.
  • V adresáři unit-testing-using-dotnet-test spusťte následující příkaz, který do řešení přidá projekt knihovny tříd:

    dotnet sln add ./PrimeService/PrimeService.csproj
    
  • Spuštěním následujícího příkazu vytvořte projekt PrimeService.Tests :

    dotnet new xunit -o PrimeService.Tests
    
  • Předchozí příkaz:

    • Vytvoří projekt PrimeService.Tests v adresáři PrimeService.Tests. Testovací projekt používá jako testovací knihovnu xUnit .
    • Nakonfiguruje spouštěč testů přidáním následujících <PackageReference />prvků do souboru projektu:
      • Microsoft.NET.Test.Sdk
      • xunit
      • xunit.runner.visualstudio
      • coverlet.collector
  • Spuštěním následujícího příkazu přidejte testovací projekt do souboru řešení:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
    
  • Přidejte knihovnu PrimeService tříd jako závislost do projektu PrimeService.Tests :

    dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj  
    

Příkazy pro vytvoření řešení

Tato část shrnuje všechny příkazy v předchozí části. Pokud jste dokončili kroky v předchozí části, přeskočte tuto část.

Následující příkazy vytvoří testovací řešení na počítači s Windows. Pro macOS a Unix aktualizujte ren příkaz na verzi operačního ren systému, aby se soubor přejmenoval:

dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.cs PrimeService.cs
dotnet sln add ./PrimeService/PrimeService.csproj
dotnet new xunit -o PrimeService.Tests
dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

Postupujte podle pokynů k nahrazení kódu v PrimeService.cs následujícím kódem v předchozí části.

Vytvoření testu

Oblíbeným přístupem při vývoji řízeném testy (TDD) je napsat (neúspěšný) test před implementací cílového kódu. V tomto kurzu se používá přístup TDD. Metoda IsPrime je volán, ale není implementována. Testovací volání selže IsPrime . S TDD je napsán test, který je známý jako selhání. Cílový kód se aktualizuje, aby byl test úspěšný. Tento přístup opakujete, napíšete neúspěšný test a pak aktualizujete cílový kód tak, aby prošel.

Aktualizujte projekt PrimeService.Tests:

  • Odstraňte PrimeService.Tests/UnitTest1.cs.
  • Vytvořte soubor PrimeService.Tests/PrimeService_IsPrimeShould.cs .
  • Nahraďte kód v PrimeService_IsPrimeShould.cs následujícím kódem:
using Xunit;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    public class PrimeService_IsPrimeShould
    {
        [Fact]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            var primeService = new PrimeService();
            bool result = primeService.IsPrime(1);

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

Atribut [Fact] deklaruje testovací metodu, kterou spouští spouštěč testů. Ve složce PrimeService.Tests spusťte dotnet testpříkaz . Příkaz dotnet test sestaví projekty i spustí testy. Spouštěč testů xUnit obsahuje vstupní bod programu pro spuštění testů. dotnet test spustí spouštěč testů pomocí projektu testu jednotek.

Test selže, protože IsPrime nebyl implementován. Pomocí přístupu TDD napište pouze dostatečný kód, aby tento test projde. Aktualizujte IsPrime následujícím kódem:

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Not fully implemented.");
}

Spusťte dotnet test. Test projde.

Přidání dalších testů

Přidejte první číselné testy pro 0 a -1. Můžete zkopírovat test vytvořený v předchozím kroku a vytvořit kopie následujícího kódu pro testování 0 a -1. Ale nedělejte to, protože existuje lepší způsob.

var primeService = new PrimeService();
bool result = primeService.IsPrime(1);

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

Kopírování testovacího kódu, když se změní jenom parametr, způsobí duplikaci kódu a testovací bloudí. Následující atributy xUnit umožňují psát sadu podobných testů:

  • [Theory] představuje sadu testů, které provádějí stejný kód, ale mají různé vstupní argumenty.
  • [InlineData] atribut určuje hodnoty pro tyto vstupy.

Místo vytváření nových testů použijte předchozí atributy xUnit k vytvoření jediné teorie. Nahraďte následující kód:

[Fact]
public void IsPrime_InputIs1_ReturnFalse()
{
    var primeService = new PrimeService();
    bool result = primeService.IsPrime(1);

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

s následujícím kódem:

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

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

V předchozím kódu [Theory] a [InlineData] povolte testování několika hodnot menší než dvě. Dvě jsou nejmenším primárním číslem.

Za deklaraci třídy a před [Theory] atribut přidejte následující kód:

private readonly PrimeService _primeService;

public PrimeService_IsPrimeShould()
{
    _primeService = new PrimeService();
}

Spusťte dotnet testa dva testy selžou. Pokud chcete, aby všechny testy prošly, aktualizujte metodu IsPrime následujícím kódem:

public bool IsPrime(int candidate)
{
    if (candidate < 2)
    {
        return false;
    }
    throw new NotImplementedException("Not fully implemented.");
}

Podle přístupu TDD přidejte další neúspěšné testy a pak aktualizujte cílový kód. Podívejte se na dokončenou verzi testů a kompletní implementaci knihovny.

Dokončená IsPrime metoda není efektivní algoritmus pro testování primality.

Další materiály