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
- Zestaw .NET 6.0 SDK lub nowszy
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="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 poprzednim kroku dodano niezbędne pakiety MSTest i narzędzia do 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.