Testowanie jednostkowe języka C# za pomocą narzędzia NUnit i platformy .NET Core

Ten samouczek przeprowadzi Cię przez interaktywne środowisko tworzenia przykładowego rozwiązania krok po kroku, aby poznać pojęcia dotyczące testowania jednostkowego. Jeśli wolisz wykonać czynności opisane w samouczku przy użyciu wstępnie utworzonego rozwiązania, przed rozpoczęciem wyświetl lub pobierz przykładowy kod . Aby uzyskać instrukcje dotyczące pobierania, zobacz Przykłady i samouczki.

Ten artykuł dotyczy testowania projektu platformy .NET Core. Jeśli testujesz projekt ASP.NET Core, zobacz Testy integracji w programie ASP.NET Core.

Wymagania wstępne

  • .NET 8.0 lub nowsze wersje.
  • Wybrany edytor tekstu lub edytor kodu.

Tworzenie projektu źródłowego

Otwórz okno powłoki. Utwórz katalog o nazwie unit-testing-using-nunit do przechowywania rozwiązania. W tym nowym katalogu uruchom następujące polecenie, aby utworzyć nowy plik rozwiązania dla biblioteki klas i projektu testowego:

dotnet new sln

Następnie utwórz katalog PrimeService . Poniższy konspekt przedstawia strukturę katalogów i plików do tej pory:

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService

Utwórz bieżący katalog PrimeService i uruchom następujące polecenie, aby utworzyć projekt źródłowy:

dotnet new classlib

Zmień nazwę Class1.cs na PrimeService.cs. Tworzenie implementacji klasy kończy PrimeService się niepowodzeniem:

using System;

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

Zmień katalog z powrotem na katalog unit-testing-using-nunit . Uruchom następujące polecenie, aby dodać projekt biblioteki klas do rozwiązania:

dotnet sln add PrimeService/PrimeService.csproj

Tworzenie projektu testowego

Następnie utwórz katalog PrimeService.Tests . W poniższym konspekcie przedstawiono strukturę katalogów:

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

Utwórz katalog PrimeService.Tests jako bieżący katalog i utwórz nowy projekt przy użyciu następującego polecenia:

dotnet new nunit

Polecenie dotnet new tworzy projekt testowy, który używa narzędzia NUnit jako biblioteki testowej. Wygenerowany szablon konfiguruje moduł uruchamiający testy w pliku 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>

Uwaga

Przed platformą .NET 9 wygenerowany kod może odwoływać się do starszych wersji platformy testowej NUnit. Do zaktualizowania pakietów można użyć interfejsu wiersza polecenia dotnet. Alternatywnie otwórz plik PrimeService.Tests.csproj i zastąp zawartość grupy elementów odwołania do pakietu kodem powyżej.

Projekt testowy wymaga innych pakietów do tworzenia i uruchamiania testów jednostkowych. Polecenie dotnet new w poprzednim kroku dodało zestaw MICROSOFT TEST SDK, strukturę testową NUnit i kartę testową NUnit. Teraz dodaj bibliotekę PrimeService klas jako inną zależność do projektu. dotnet add reference Użyj polecenia :

dotnet add reference ../PrimeService/PrimeService.csproj

Cały plik można zobaczyć w repozytorium przykładów w witrynie GitHub.

W poniższym konspekcie przedstawiono ostateczny układ rozwiązania:

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

Wykonaj następujące polecenie w katalogu unit-testing-using-nunit :

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

Tworzenie pierwszego testu

Napisz jeden test zakończony niepowodzeniem, przekaż go, a następnie powtórz proces. W katalogu PrimeService.Tests zmień nazwę pliku UnitTest1.cs na PrimeService_IsPrimeShould.cs i zastąp całą jego zawartość następującym kodem:

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

Atrybut [TestFixture] określa klasę zawierającą testy jednostkowe. Atrybut [Test] wskazuje metodę testową.

Zapisz ten plik i wykonaj dotnet test polecenie , aby skompilować testy i bibliotekę klas i uruchomić testy. Moduł uruchamiający testy NUnit zawiera punkt wejścia programu do uruchamiania testów. dotnet test uruchamia moduł uruchamiający testy przy użyciu utworzonego projektu testów jednostkowych.

Test kończy się niepowodzeniem. Implementacja nie została jeszcze utworzona. Wykonaj test, pisząc najprostszy kod w PrimeService klasie, która działa:

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

W katalogu unit-testing-using-nunit ponownie uruchom polecenie dotnet test . Polecenie dotnet test uruchamia kompilację dla PrimeService projektu, a następnie dla PrimeService.Tests projektu. Po skompiluj oba projekty uruchomi ten pojedynczy test. Przechodzi.

Dodawanie większej liczby funkcji

Teraz, gdy wykonano jeden test, nadszedł czas, aby napisać więcej. Istnieje kilka innych prostych przypadków dla liczb pierwszych: 0, -1. Można dodać nowe testy z atrybutem [Test] , ale to szybko staje się żmudne. Istnieją inne atrybuty NUnit, które umożliwiają pisanie zestawu podobnych testów. Atrybut [TestCase] służy do tworzenia zestawu testów, które wykonują ten sam kod, ale mają różne argumenty wejściowe. Możesz użyć atrybutu [TestCase] , aby określić wartości dla tych danych wejściowych.

Zamiast tworzyć nowe testy, zastosuj ten atrybut, aby utworzyć pojedynczy test oparty na danych. Test oparty na danych to metoda, która testuje kilka wartości mniejszych niż dwa, czyli najniższą liczbę pierwszą:

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

Uruchom polecenie dotnet test, a dwa z tych testów kończą się niepowodzeniem. Aby wszystkie testy przeszły, zmień klauzulę if na początku Main metody w pliku PrimeService.cs :

if (candidate < 2)

Kontynuuj iterowanie, dodając więcej testów, teorii i kodu w bibliotece głównej. Masz ukończoną wersję testów i kompletną implementację biblioteki.

Utworzono małą bibliotekę i zestaw testów jednostkowych dla tej biblioteki. Masz również ustrukturyzowane rozwiązanie, aby dodawanie nowych pakietów i testów było częścią standardowego przepływu pracy. Większość czasu i nakładu pracy na rozwiązywaniu celów aplikacji koncentrujesz się przez większość czasu i wysiłku.