Podstawowe informacje o teście jednostkowym
Sprawdź, czy kod działa zgodnie z oczekiwaniami, tworząc i uruchamiając testy jednostkowe. Jest to nazywane testowaniem jednostkowym, ponieważ dzielisz funkcjonalność programu na dyskretne zachowania z możliwością testowania, które można przetestować jako poszczególne jednostki. Eksplorator testów programu Visual Studio zapewnia elastyczny i wydajny sposób uruchamiania testów jednostkowych i wyświetlania ich wyników w programie Visual Studio. Program Visual Studio instaluje struktury testów jednostkowych firmy Microsoft dla kodu zarządzanego i natywnego. Użyj struktury testów jednostkowych, aby utworzyć testy jednostkowe, uruchomić je i zgłosić wyniki tych testów. Uruchom ponownie testy jednostkowe po wprowadzeniu zmian w celu przetestowania, że kod nadal działa prawidłowo. Program Visual Studio Enterprise może to zrobić automatycznie za pomocą funkcji Live Unit Testing, która wykrywa testy, których dotyczy zmiana kodu, i uruchamia je w tle podczas wpisywania.
Testowanie jednostkowe ma największy wpływ na jakość kodu, gdy jest to integralna część przepływu pracy tworzenia oprogramowania. Gdy tylko napiszesz funkcję lub inny blok kodu aplikacji, utwórz testy jednostkowe, które weryfikują zachowanie kodu w odpowiedzi na standardowe, granice i nieprawidłowe przypadki danych wejściowych oraz sprawdzają wszelkie jawne lub niejawne założenia dokonane przez kod. W przypadku programowania opartego na testach należy utworzyć testy jednostkowe przed napisaniem kodu, aby używać testów jednostkowych zarówno jako dokumentacji projektowej, jak i specyfikacji funkcjonalnych.
Eksplorator testów może również uruchamiać struktury testów jednostkowych innych firm i open source, które zaimplementowały interfejsy dodatku Eksploratora testów. Wiele z tych platform można dodać za pomocą Menedżera rozszerzeń programu Visual Studio i galerii programu Visual Studio. Aby uzyskać więcej informacji, zobacz Instalowanie platform testów jednostkowych innych firm.
Możesz szybko wygenerować projekty testowe i metody testowe na podstawie kodu lub ręcznie utworzyć testy zgodnie z potrzebami. Korzystając z narzędzia IntelliTest do eksplorowania kodu platformy .NET, możesz wygenerować dane testowe i zestaw testów jednostkowych. Dla każdej instrukcji w kodzie generowane są dane wejściowe testowe, które będą wykonywać instrukcję . Dowiedz się, jak generować testy jednostkowe dla kodu platformy .NET.
Rozpocznij
Aby zapoznać się z wprowadzeniem do testowania jednostkowego, które umożliwia bezpośrednie kodowanie, zobacz jeden z następujących artykułów:
Przewodnik: tworzenie i uruchamianie testów jednostkowych dla kodu platformy .NET
Przewodnik: programowanie oparte na testach za pomocą Eksploratora testów
Pisanie testów jednostkowych dla języka C/C++ w programie Visual Studio
Przykład rozwiązania bankowego
W tym artykule używamy tworzenia fikcyjnej aplikacji o nazwie MyBank
jako przykładu. Nie potrzebujesz rzeczywistego kodu, aby postępować zgodnie z wyjaśnieniami w tym artykule. Metody testowe są napisane w języku C# i prezentowane przy użyciu platformy Microsoft Unit Testing Framework dla kodu zarządzanego. Jednak koncepcje są łatwo przenoszone do innych języków i struktur.
Nasza pierwsza próba zaprojektowania MyBank
aplikacji obejmuje składnik kont, który reprezentuje indywidualne konto i jego transakcje z bankiem, oraz składnik bazy danych, który reprezentuje funkcjonalność agregacji i zarządzania poszczególnymi kontami.
Tworzymy Bank
rozwiązanie, które zawiera dwa projekty:
Accounts
BankDB
Nasza pierwsza próba zaprojektowania Accounts
projektu zawiera klasę do przechowywania podstawowych informacji o koncie, interfejs określający typowe funkcje dowolnego typu konta, takie jak depozytowanie i wycofywanie zasobów z konta, oraz klasa pochodząca z interfejsu reprezentującego konto kontrolne. Rozpoczynamy projekty Konta, tworząc następujące pliki źródłowe:
AccountInfo.cs definiuje podstawowe informacje dotyczące konta.
IAccount.cs definiuje standardowy
IAccount
interfejs konta, w tym metody depozytu i wypłaty aktywów z konta oraz pobierania salda konta.CheckingAccount.cs zawiera klasę
CheckingAccount
, która implementujeIAccount
interfejs dla konta ewidencjonowania.
Wiemy z doświadczenia, że jedną rzeczą, jaką musi zrobić wypłata z konta kontrolnego, jest upewnienie się, że kwota wycofana jest mniejsza niż saldo konta. Dlatego zastąpimy metodę IAccount.Withdraw
w CheckingAccount
metodzie , która sprawdza ten warunek. Metoda może wyglądać następująco:
public void Withdraw(double amount)
{
if(m_balance >= amount)
{
m_balance -= amount;
}
else
{
throw new ArgumentException(nameof(amount), "Withdrawal exceeds balance!");
}
}
Teraz, gdy mamy już jakiś kod, nadszedł czas na testowanie.
Tworzenie testów jednostkowych za pomocą narzędzia Copilot
Możesz również użyć polecenia ukośnika Copilot /tests
, aby wygenerować testy jednostkowe na podstawie kodu. Możesz na przykład wpisać /tests using NUnit Framework
polecenie , aby wygenerować testy NUnit. Aby uzyskać więcej informacji, zobacz Use slash commands in Copilot Chat (Używanie poleceń ukośnika w rozmowie copilot).
Tworzenie projektów testów jednostkowych i metod testowych (C#)
W przypadku języka C# często szybsze jest generowanie projektu testów jednostkowych i wycinków testów jednostkowych z kodu. Możesz też ręcznie utworzyć projekt testów jednostkowych i testować w zależności od wymagań. Jeśli chcesz utworzyć testy jednostkowe na podstawie kodu z platformą innej firmy, musisz zainstalować jedno z tych rozszerzeń: NUnit lub xUnit. Jeśli nie używasz języka C#, pomiń tę sekcję i przejdź do sekcji Tworzenie projektu testów jednostkowych i testów jednostkowych ręcznie.
Generowanie wycinków projektu testów jednostkowych i testów jednostkowych
W oknie edytora kodu kliknij prawym przyciskiem myszy i wybierz polecenie Utwórz testy jednostkowe z menu prawym przyciskiem myszy.
Uwaga
Polecenie menu Create Unit Tests (Tworzenie testów jednostkowych ) jest dostępne tylko dla kodu języka C#. Aby użyć tej metody z platformą .NET Core lub .NET Standard, wymagany jest program Visual Studio 2019 lub nowszy.
Uwaga
Polecenie menu Create Unit Tests (Tworzenie testów jednostkowych ) jest dostępne tylko dla kodu języka C#. Aby użyć tej metody z platformą .NET Core lub .NET Standard, wymagany jest program Visual Studio 2019 lub nowszy.
Wybierz przycisk OK , aby zaakceptować wartości domyślne, aby utworzyć testy jednostkowe, lub zmienić wartości używane do utworzenia i nadania nazwy projektowi testów jednostkowych i testom jednostkowym. Możesz wybrać kod, który jest domyślnie dodawany do metod testów jednostkowych.
Wycinki testu jednostkowego są tworzone w nowym projekcie testu jednostkowego dla wszystkich metod w klasie.
Teraz przejdź dalej, aby dowiedzieć się, jak napisać testy, aby test jednostkowy był zrozumiały, oraz wszelkie dodatkowe testy jednostkowe, które warto dodać, aby dokładnie przetestować kod.
Ręczne tworzenie projektu testów jednostkowych i testów jednostkowych
Projekt testu jednostkowego zwykle odzwierciedla strukturę pojedynczego projektu kodu. W przykładzie MyBank dodasz dwa projekty testów jednostkowych o nazwie AccountsTests
i BankDbTests
do Bank
rozwiązania. Nazwy projektów testowych są dowolne, ale przyjęcie standardowej konwencji nazewnictwa jest dobrym pomysłem.
Aby dodać projekt testu jednostkowego do rozwiązania:
W Eksplorator rozwiązań kliknij rozwiązanie prawym przyciskiem myszy i wybierz polecenie Dodaj>nowy projekt.
Wpisz test w polu wyszukiwania szablonu projektu, aby znaleźć szablon projektu testu jednostkowego dla platformy testowej, której chcesz użyć. (W przykładach w tym artykule używamy biblioteki MSTest).
Na następnej stronie nadaj projektowi nazwę. Aby przetestować
Accounts
projekt naszego przykładu, możesz nazwać projektAccountsTests
.W projekcie testu jednostkowego dodaj odwołanie do projektu kodu w ramach testu, w naszym przykładzie do projektu Accounts.
Aby utworzyć odwołanie do projektu kodu:
W projekcie testu jednostkowego w Eksplorator rozwiązań kliknij prawym przyciskiem myszy węzeł Odwołania lub Zależności, a następnie wybierz pozycję Dodaj odwołanie do projektu lub Dodaj odwołanie, w zależności od tego, co jest dostępne.
W oknie dialogowym Menedżer odwołań otwórz węzeł Rozwiązanie i wybierz pozycję Projekty. Wybierz nazwę projektu kodu i zamknij okno dialogowe.
Każdy projekt testu jednostkowego zawiera klasy dublujące nazwy klas w projekcie kodu. W naszym przykładzie AccountsTests
projekt będzie zawierał następujące klasy:
AccountInfoTests
klasa zawiera metody testów jednostkowych dlaAccountInfo
klasy w projekcieAccounts
CheckingAccountTests
klasa zawiera metody testów jednostkowych dlaCheckingAccount
klasy.
Pisanie testów
Używana struktura testów jednostkowych i funkcja IntelliSense programu Visual Studio przeprowadzi Cię przez proces pisania kodu dla testów jednostkowych dla projektu kodu. Aby uruchomić w Eksploratorze testów, większość struktur wymaga dodania określonych atrybutów do identyfikowania metod testów jednostkowych. Struktury zapewniają również sposób — zwykle za pośrednictwem instrukcji asercyjnych lub atrybutów metody — aby wskazać, czy metoda testowa przeszła, czy nie powiodła się. Inne atrybuty identyfikują opcjonalne metody konfiguracji, które są w inicjowaniu klasy i przed każdym testem metody i metody usuwania, które są uruchamiane po każdej metodzie testowej i przed zniszczeniem klasy.
Wzorzec AAA (Organizuj, Act, Assert) jest typowym sposobem pisania testów jednostkowych dla metody testowej.
Sekcja Rozmieszczanie metody testu jednostkowego inicjuje obiekty i ustawia wartość danych przekazanych do metody testowanej.
Sekcja Act wywołuje metodę testową z ułożonymi parametrami.
Sekcja Assert sprawdza, czy akcja metody testowej działa zgodnie z oczekiwaniami. W przypadku platformy .NET metody w Assert klasie są często używane do weryfikacji.
Aby przetestować metodę CheckingAccount.Withdraw
naszego przykładu, możemy napisać dwa testy: jeden, który weryfikuje standardowe zachowanie metody, i jeden, który sprawdza, czy wycofanie więcej niż saldo zakończy się niepowodzeniem (poniższy kod przedstawia test jednostkowy MSTest, który jest obsługiwany na platformie .NET). CheckingAccountTests
W klasie dodajemy następujące metody:
[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
// arrange
double currentBalance = 10.0;
double withdrawal = 1.0;
double expected = 9.0;
var account = new CheckingAccount("JohnDoe", currentBalance);
// act
account.Withdraw(withdrawal);
// assert
Assert.AreEqual(expected, account.Balance);
}
[TestMethod]
public void Withdraw_AmountMoreThanBalance_Throws()
{
// arrange
var account = new CheckingAccount("John Doe", 10.0);
// act and assert
Assert.ThrowsException<System.ArgumentException>(() => account.Withdraw(20.0));
}
Aby uzyskać więcej informacji na temat platform testów jednostkowych firmy Microsoft, zobacz jeden z następujących artykułów:
Ustawianie limitów czasu dla testów jednostkowych
Jeśli używasz platformy MSTest, możesz użyć TimeoutAttribute elementu , aby ustawić limit czasu dla pojedynczej metody testowej:
[TestMethod]
[Timeout(2000)] // Milliseconds
public void My_Test()
{ ...
}
Aby ustawić limit czasu na maksymalną dozwoloną wartość:
[TestMethod]
[Timeout(TestTimeout.Infinite)] // Milliseconds
public void My_Test ()
{ ...
}
Uruchamianie testów w Eksploratorze testów
Podczas kompilowanie projektu testowego testy są wyświetlane w Eksploratorze testów. Jeśli Eksplorator testów nie jest widoczny, wybierz pozycję Testuj w menu programu Visual Studio, wybierz pozycję Windows, a następnie wybierz pozycję Eksplorator testów (lub naciśnij Ctrl + E, T).
Podczas uruchamiania, zapisywania i ponownego uruchamiania testów Eksplorator testów może wyświetlić wyniki w grupach testów, testów z powodzeniem, pominiętych testów i nieuruchomionych testów. Na pasku narzędzi można wybrać różne opcje grupowania.
Testy można również filtrować w dowolnym widoku, pasując do tekstu w polu wyszukiwania na poziomie globalnym lub wybierając jeden ze wstępnie zdefiniowanych filtrów. W dowolnym momencie można uruchomić dowolny wybór testów. Wyniki przebiegu testu są natychmiast widoczne na pasku pass/fail w górnej części okna eksploratora. Szczegóły wyniku metody testowej są wyświetlane po wybraniu testu.
Uruchamianie i wyświetlanie testów
Pasek narzędzi Eksplorator testów ułatwia odnajdywanie, organizowanie i uruchamianie zainteresowanych testów.
Możesz wybrać pozycję Uruchom wszystko, aby uruchomić wszystkie testy (lub nacisnąć Ctrl + R, V) lub wybrać pozycję Uruchom, aby wybrać podzestaw testów do uruchomienia (Ctrl + R, T). Wybierz test, aby wyświetlić szczegóły tego testu w okienku szczegółów testu. Wybierz polecenie Otwórz test w menu prawym przyciskiem myszy (Klawiatura: F12), aby wyświetlić kod źródłowy wybranego testu.
Jeśli poszczególne testy nie mają zależności, które uniemożliwiają ich uruchamianie w dowolnej kolejności, włącz równoległe wykonywanie testów w menu ustawień paska narzędzi. Może to znacznie skrócić czas potrzebny na uruchomienie wszystkich testów.
Uruchamianie testów po każdej kompilacji
Aby uruchomić testy jednostkowe po każdej kompilacji lokalnej, otwórz ikonę ustawień na pasku narzędzi Eksplorator testów i wybierz pozycję Uruchom testy po kompilacji.
Filtrowanie i grupowanie listy testów
Jeśli masz dużą liczbę testów, możesz wpisać w polu wyszukiwania Eksplorator testów, aby filtrować listę według określonego ciągu. Możesz ograniczyć zdarzenie filtru bardziej, wybierając z listy filtrów.
Przycisk | opis |
---|---|
Aby zgrupować testy według kategorii, wybierz przycisk Grupuj według . |
Aby uzyskać więcej informacji, zobacz Uruchamianie testów jednostkowych za pomocą Eksploratora testów.
Q&A
.: Jak mogę debugowanie testów jednostkowych?
1: Użyj Eksploratora testów, aby rozpocząć sesję debugowania dla testów. Przechodzenie przez kod za pomocą debugera programu Visual Studio bezproblemowo przenosi Cię między testami jednostkowymi a projektem testowym. Aby rozpocząć debugowanie:
W edytorze programu Visual Studio ustaw punkt przerwania w co najmniej jednej metodze testowania, którą chcesz debugować.
Uwaga
Ponieważ metody testowe mogą być uruchamiane w dowolnej kolejności, ustaw punkty przerwania we wszystkich metodach testowych, które chcesz debugować.
W Eksploratorze testów wybierz metody testowania, a następnie wybierz pozycję Debuguj wybrane testy z menu skrótów.
Dowiedz się więcej o debugowaniu testów jednostkowych.
.: Jeśli używam funkcji TDD, jak mogę wygenerować kod na podstawie testów?
1: Użyj szybkich akcji, aby wygenerować klasy i metody w kodzie projektu. Napisz instrukcję w metodzie testowej, która wywołuje klasę lub metodę, którą chcesz wygenerować, a następnie otwórz żarówkę wyświetlaną pod błędem. Jeśli wywołanie jest konstruktorem nowej klasy, wybierz pozycję Generuj typ z menu i postępuj zgodnie z instrukcjami kreatora, aby wstawić klasę w projekcie kodu. Jeśli wywołanie metody jest metodą, wybierz pozycję Generuj metodę z menu IntelliSense.
.: Czy mogę utworzyć testy jednostkowe, które przyjmują wiele zestawów danych jako dane wejściowe w celu uruchomienia testu?
Odpowiedź: Tak. Metody testów opartych na danych umożliwiają testowanie zakresu wartości przy użyciu pojedynczej metody testu jednostkowego. Użyj atrybutu DataRow
DynamicData
, lub DataSource
dla metody testowej, która określa źródło danych zawierające wartości zmiennych, które chcesz przetestować.
Metoda przypisana jest uruchamiana raz dla każdego wiersza w źródle danych. Eksplorator testów zgłasza błąd testu dla metody, jeśli którakolwiek z iteracji zakończy się niepowodzeniem. Okienko szczegółów wyników testu dla metody przedstawia metodę stanu pass/fail dla każdego wiersza danych.
Dowiedz się więcej o testach jednostkowych opartych na danych.
.: Czy mogę wyświetlić, ile kodu jest testowane przez testy jednostkowe?
Odpowiedź: Tak. Możesz określić ilość kodu, który jest rzeczywiście testowany przez testy jednostkowe przy użyciu narzędzia pokrycia programu Visual Studio Code w programie Visual Studio Enterprise. Obsługiwane są języki natywne i zarządzane oraz wszystkie struktury testów jednostkowych, które mogą być uruchamiane przez platformę Unit Test Framework.
Pokrycie kodu można uruchamiać na wybranych testach lub we wszystkich testach w rozwiązaniu. W oknie Wyniki pokrycia kodu jest wyświetlana wartość procentowa bloków kodu produktu, które były wykonywane według wiersza, funkcji, klasy, przestrzeni nazw i modułu.
Aby uruchomić pokrycie kodu dla metod testowych w rozwiązaniu, wybierz pozycję Testuj>pokrycie kodu dla wszystkich testów.
Wyniki pokrycia są wyświetlane w oknie Wyniki pokrycia kodu.
Dowiedz się więcej na temat pokrycia kodu.
.: Czy mogę przetestować metody w kodzie, które mają zależności zewnętrzne?
Odpowiedź: Tak. Jeśli masz program Visual Studio Enterprise, platforma Microsoft Fakes może być używana z metodami testowymi, które piszesz przy użyciu struktur testów jednostkowych dla kodu zarządzanego.
Firma Microsoft Fakes używa dwóch metod tworzenia klas zastępczych dla zależności zewnętrznych:
Wycinki generują klasy zastępcze pochodzące z interfejsu nadrzędnego docelowej klasy zależności. Metody wycinkowe można zastąpić publicznymi metodami wirtualnymi klasy docelowej.
Podkładki używają instrumentacji środowiska uruchomieniowego do przekierowywania wywołań do metody docelowej do metody zastępczej podkładki dla metod innych niż wirtualne.
W obu podejściach używasz wygenerowanych delegatów wywołań do metody zależności, aby określić zachowanie, które ma zostać określone w metodzie testowej.
Dowiedz się więcej o izolowaniu metod testów jednostkowych za pomocą platformy Microsoft Fakes.
.: Czy można używać innych struktur testów jednostkowych do tworzenia testów jednostkowych?
1: Tak, wykonaj następujące kroki, aby znaleźć i zainstalować inne platformy. Po ponownym uruchomieniu programu Visual Studio otwórz ponownie rozwiązanie, aby utworzyć testy jednostkowe, a następnie wybierz zainstalowane struktury tutaj:
Wycinki testu jednostkowego zostaną utworzone przy użyciu wybranej platformy.
.: Jak mogę wyeksportować wyniki testu jednostkowego?
Elementy: Możesz użyć pliku .runsettings z wierszem polecenia lub środowiskiem IDE programu Visual Studio, aby skonfigurować testy jednostkowe i ustawić plik wyników testu. Aby uzyskać więcej informacji, zobacz LoggerRunSettings, element.