Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 korzystać z samouczka z gotowym rozwiązaniem, wyświetl lub pobierz przykładowy kod przed rozpoczęciem. 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 integracyjne w 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, aby przechować rozwiązanie. W tym nowym katalogu uruchom 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
Ustaw PrimeService jako bieżący katalog i uruchom 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ę klasy PrimeService
:
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 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 zarysie przedstawiono strukturę katalogu:
/unit-testing-using-mstest
unit-testing-using-mstest.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Ustaw katalog PrimeService.Tests jako bieżący katalog i utwórz nowy projekt przy użyciu dotnet new mstest
. Polecenie dotnet new tworzy projekt testowy, który używa biblioteki MSTest jako biblioteki testowej. Szablon konfiguruje uruchamiacz testów w pliku PrimeServiceTests.csproj j:
<ItemGroup>
<PackageReference Include="MSTest" Version="3.2.0" />
<PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.1" />
</ItemGroup>
Projekt testowy wymaga innych pakietów do tworzenia i uruchamiania testów jednostkowych.
dotnet new
w kroku poprzednim dodano niezbędne pakiety MSTest i narzędzia do raportowania pokrycia kodu.
Dodaj bibliotekę klas PrimeService
jako inną zależność do projektu. Użyj polecenia dotnet reference add
:
dotnet reference add ../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 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 języka 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 oznacza klasę zawierającą testy jednostkowe. Atrybut TestMethod wskazuje, że metoda jest metodą testową.
Zapisz ten plik i wykonaj 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 uruchamiacz testów przy użyciu utworzonego przez Ciebie projektu testów jednostkowych.
Test kończy się niepowodzeniem. Nie utworzyłeś jeszcze implementacji. Wykonaj ten test, pisząc najprostszy kod w klasie PrimeService
, 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 ponownie dotnet test
. Polecenie dotnet test
uruchamia kompilację dla projektu PrimeService
, a następnie dla projektu PrimeService.Tests
. Po utworzeniu obu projektów, wykonuje się ten pojedynczy test. Przechodzi.
Dodawanie kolejnych funkcji
Teraz, gdy zrealizowałeś 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 dotnet test
, a dwa z tych testów kończą się niepowodzeniem. Aby wszystkie testy przeszły pomyślnie, zmień klauzulę if
na początku metody IsPrime
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ą wersję implementacji biblioteki.
Ty zbudowałeś 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. Skoncentrowałeś większość swojego czasu i wysiłku na osiągnięciu celów aplikacji.