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 tematów:

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 temacie. 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.

MyBank Solution 2019

MyBank Solution 2022

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 dla konta, w tym metody depozytu i wypłaty aktywów z konta oraz pobierania salda konta.

  • Plik CheckingAccount.cs zawiera klasę CheckingAccount , która implementuje IAccount 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 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

  1. W oknie edytora kodu kliknij prawym przyciskiem myszy i wybierz polecenie Utwórz testy jednostkowe z menu prawym przyciskiem myszy.

    From the editor window, view the context menu

    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.

    From the editor window, view the context menu

    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.

  2. Kliknij 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.

    Create Unit Tests dialog box in Visual Studio

    Create Unit Tests dialog box in Visual Studio

  3. Wycinki testu jednostkowego są tworzone w nowym projekcie testu jednostkowego dla wszystkich metod w klasie.

    The unit tests are created

    The unit tests are created

  4. 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:

  1. W Eksplorator rozwiązań kliknij rozwiązanie prawym przyciskiem myszy i wybierz polecenie Dodaj>nowyprojekt.

  2. 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 temacie używamy biblioteki MSTest).

  3. Na następnej stronie nadaj projektowi nazwę. Aby przetestować Accounts projekt naszego przykładu, możesz nazwać projekt AccountsTests.

  4. 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:

    1. 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.

    2. 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:

  • AccountInfoTestsklasa zawiera metody testów jednostkowych dla AccountInfo klasy w projekcie Accounts

  • CheckingAccountTests klasa zawiera metody testów jednostkowych dla CheckingAccount 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 temató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 klawisze Ctrl + E, T).

Unit Test Explorer

Unit Test Explorer

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.

Run tests from the Test Explorer toolbar

Run tests from the Test Explorer toolbar

Możesz wybrać pozycję Uruchom wszystko, aby uruchomić wszystkie testy (lub nacisnąć klawisze 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.

Search filter categories

Search filter categories

Przycisk opis
Test Explorer group button 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.

Pytania i odpowiedzi

Pyt.: 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:

  1. 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ć.

  2. 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.

Pyt.: 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.

Generate Method Stub Quick Action Menu

Generate Method Stub Quick Action Menu

Pyt.: 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 DataRowDynamicData , 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.

Pyt.: 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 kodu programu Visual Studio 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.

Code coverage results

Code coverage results

Dowiedz się więcej na temat pokrycia kodu.

Pyt.: 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:

  1. 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.

  2. 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.

Pyt.: 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:

Select other installed unit test framework

Wycinki testu jednostkowego zostaną utworzone przy użyciu wybranej platformy.