Testowanie jednostkowe języka C# przy użyciu narzędzi MSTest i .NET

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

Tworzenie projektu źródłowego

Otwórz okno powłoki. Utwórz katalog o nazwie unit-testing-using-mstest do przechowywania rozwiązania. W tym nowym katalogu uruchom polecenie dotnet new sln , aby utworzyć nowy plik rozwiązania dla biblioteki klas i projektu testowego. Utwórz katalog PrimeService. Poniższy konspekt przedstawia strukturę katalogów i plików do tej pory:

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

Utwórz bieżący katalog w usłudze PrimeService i uruchom polecenie dotnet new classlib , aby utworzyć projekt źródłowy. Zmień nazwę Class1.cs na PrimeService.cs. Zastąp kod w pliku następującym kodem, aby utworzyć nieudaną implementację PrimeService klasy:

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-mstest . Uruchom polecenie dotnet sln add , aby dodać projekt biblioteki klas do rozwiązania:

dotnet sln add PrimeService/PrimeService.csproj

Tworzenie projektu testowego

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

/unit-testing-using-mstest
    unit-testing-using-mstest.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 polecenia dotnet new mstest. Polecenie dotnet new tworzy projekt testowy, który używa biblioteki MSTest jako biblioteki testowej. Szablon konfiguruje moduł uruchamiający testy w pliku PrimeServiceTests.csproj :

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
  <PackageReference Include="MSTest.TestAdapter" Version="2.1.1" />
  <PackageReference Include="MSTest.TestFramework" Version="2.1.1" />
  <PackageReference Include="coverlet.collector" Version="1.3.0" />
</ItemGroup>

Projekt testowy wymaga innych pakietów do tworzenia i uruchamiania testów jednostkowych. dotnet new w poprzednim kroku dodano zestaw MSTest SDK, platformę testową MSTest, moduł uruchamiający MSTest i coverlet na potrzeby raportowania pokrycia kodu.

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

Przejdź do katalogu unit-testing-using-mstest i uruchom polecenie dotnet sln add:

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

Tworzenie pierwszego testu

Napisz test zakończony niepowodzeniem, wykonaj go pomyślnie, a następnie powtórz proces. Usuń UnitTest1.cs z katalogu PrimeService.Tests i utwórz nowy plik C# o nazwie PrimeService_IsPrimeShould.cs o następującej zawartości:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;

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

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

        [TestMethod]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            bool result = _primeService.IsPrime(1);

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

Atrybut TestClass określa klasę zawierającą testy jednostkowe. Atrybut TestMethod wskazuje, że metoda jest metodą testową.

Zapisz ten plik i wykonaj polecenie dotnet test , aby skompilować testy i bibliotekę klas, a następnie uruchomić testy. Moduł uruchamiający testy MSTest zawiera punkt wejścia programu w celu uruchomienia 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 ten 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-mstest uruchom dotnet test ponownie polecenie . Polecenie dotnet test uruchamia kompilację dla PrimeService projektu, a następnie dla PrimeService.Tests projektu. Po utworzeniu obu projektów zostanie uruchomiony ten pojedynczy test. Przechodzi.

Dodaj więcej 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 za pomocą atrybutu TestMethod, ale to szybko staje się żmudne. Istnieją inne atrybuty MSTest, które umożliwiają pisanie zestawu podobnych testów. Metoda testowa może wykonać ten sam kod, ale ma różne argumenty wejściowe. Możesz użyć atrybutu DataRow, aby określić wartości dla tych danych wejściowych.

Zamiast tworzyć nowe testy, zastosuj te dwa atrybuty, 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ą. Dodaj nową metodę testową w PrimeService_IsPrimeShould.cs:

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

    Assert.IsFalse(result, $"{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 IsPrime metody w pliku PrimeService.cs :

if (candidate < 2)

Kontynuuj iterowanie, dodając więcej testów, więcej teorii i więcej 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. Rozwiązanie zostało ustrukturyzowane tak, aby dodawanie nowych pakietów i testów było częścią normalnego 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.

Zobacz też