Notatka
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ń 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
Zmień nazwę Class1.cs w katalogu PrimeService 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.");
}
}
}
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="4.1.0" />
</ItemGroup>
Note
Wyświetlane wersje pakietów to przykłady. Wersje generowane przez dotnet new mstest zależą od zestawu SDK .NET. Szablony i pobrane przykłady mogą nie używać najnowszych wersji pakietu NuGet.
Aby sprawdzić dostępność aktualizacji po utworzeniu i uruchomieniu testów, uruchom polecenie dotnet package list --outdated z katalogu projektu testowego. Użyj dotnet package add <PACKAGE_NAME> polecenia , aby zaktualizować odwołanie do pakietu do najnowszej zgodnej stabilnej wersji. Przejrzyj informacje o wersji pod kątem zmian powodujących niezgodność przed aktualizacją i uruchom ponownie dotnet test następnie.
Jeśli używasz zestawu SDK .NET 9 lub starszego, użyj dotnet list package --outdated i dotnet add package <PACKAGE_NAME> zamiast tego.
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 shouldn't be prime");
}
}
}
Atrybut TestClass oznacza klasę zawierającą testy jednostkowe. Atrybut TestMethod wskazuje, że metoda jest metodą testową.
Narzędzie MSTest tworzy nowe wystąpienie klasy testowej dla każdego testu, więc konstruktor tworzy oddzielne wystąpienie PrimeService dla każdego testu. Konstruktor zawiera tylko konfigurację, która jest potrzebna każdemu testowi w tej klasie. Jeśli testy wymagają innej konfiguracji, utwórz obiekty w metodach testowych lub wywołaj metody pomocnicze z tych metod. Aby uzyskać wskazówki, zobacz Używanie metod pomocniczych zamiast konfiguracji i czyszczenia.
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 program uruchamiający testy przy użyciu utworzonego projektu testów jednostkowych.
Test kończy się niepowodzeniem, ponieważ jeszcze nie utworzono 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 przeszedłeś jeden test, nadszedł czas, aby napisać kolejne testy. 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)
{
bool 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.
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. Skupiłeś większość swojego czasu i energii na realizacji celów aplikacji.
Uruchamianie testów w Azure Pipelines
Aby automatycznie uruchamiać testy podczas wypychania zmian, dodaj konfigurację Azure Pipelines do repozytorium zawierającego ukończone rozwiązanie. Potrzebujesz projektu Azure DevOps i dostępu do agenta hostowanego Microsoft. Aby uzyskać informacje o wymaganiach wstępnych, zobacz Utwórz swój pierwszy potok.
W katalogu głównym repozytorium utwórz
azure-pipelines.ymlplik z następującą zawartością. W przykładzie przyjęto założenie, że katalogiPrimeServiceiPrimeService.Testsznajdują się w katalogu głównym repozytorium, a oba projekty są przeznaczone dla platformy .NET 10.trigger: - main pool: vmImage: ubuntu-latest steps: - task: UseDotNet@2 displayName: Install .NET SDK inputs: packageType: sdk version: 10.0.x - task: DotNetCoreCLI@2 displayName: Run MSTest tests inputs: command: test projects: PrimeService.Tests/PrimeService.Tests.csproj arguments: --configuration Release publishTestResults: trueDostosuj konfigurację tak, aby odpowiadała repozytorium:
- Jeśli gałąź ma inną nazwę, zastąp
mainwtriggernazwą tej gałęzi. - Jeśli twoje rozwiązanie znajduje się w podkatalogu, zaktualizuj
projectsdo ścieżki projektu testowego względem katalogu głównego repozytorium. - Jeśli projekty są przeznaczone dla innej wersji .NET, zmień
versionw zadaniuUseDotNet@2, aby było zgodne. Na przykład użyj polecenia8.0.xdla projektów ukierunkowanych nanet8.0. Jeśli repozytorium zawiera plikglobal.json, upewnij się, że zainstalowany zestaw SDK spełnia wymagania dotyczące jego wersji.
- Jeśli gałąź ma inną nazwę, zastąp
Zatwierdź i wypchnij rozwiązanie oraz plik
azure-pipelines.ymldo repozytorium Git.W projekcie Azure DevOps wybierz pozycję Potoki>Nowy potok lub Utwórz potok, jeśli jest to pierwszy potok. Wybierz dostawcę usługi repozytorium i repozytorium.
Na stronie Konfigurowanie potoku wybierz pozycję Istniejący plik Azure Pipelines YAML, wybierz gałąź i
/azure-pipelines.yml, a następnie wybierz pozycję Kontynuuj. Przejrzyj konfigurację i wybierz pozycję Uruchom.
UseDotNet@2Zadanie instaluje zestaw SDK .NET. Zadanie DotNetCoreCLI@2 task uruchamia polecenie dotnet test, które przywraca zależności, kompiluje projekt testowy i bibliotekę, do której się odwołuje, a następnie uruchamia testy w konfiguracji wydania.
Dzięki publishTestResults: true zadanie generuje plik wyników TRX i publikuje wyniki, nawet jeśli test zakończy się niepowodzeniem. Po zakończeniu przebiegu otwórz kartę Testy przebiegu potoku, aby przejrzeć testy zaliczone i niezaliczone. Test, który zakończył się niepowodzeniem, powoduje również niepowodzenie zadania testowego i potoku.
Note
W tym przykładzie użyto domyślnej konfiguracji VSTest z dotnet new mstest zestawu SDK .NET 10. Jeśli włączysz Microsoft.Testing.Platform (MTP), zobacz Uruchamianie testów MTP w ciągłej integracji, aby uzyskać informacje o wymaganej konfiguracji modułu uruchamiającego.