Wskazówki: tworzenie i uruchamianie testów jednostkowych zarządzanego kodu

Niniejszy przewodnik zostanie krok po kroku przez tworzenie, uruchamianie i dostosowywanie szereg testy jednostek przy użyciu struktury testów jednostkowych firmy Microsoft dla kodu zarządzanego i Visual Studio Eksploratora testów.Zaczyna się od projektu C#, który jest w fazie projektowania, tworzenia testów, które wykonuje kod, uruchomić te testy i należy sprawdzić, czy wyniki.Następnie możesz zmienić kodu projektu i ponownie uruchom testy.

Ten temat zawiera następujące sekcje:

Przygotuj Instruktaż

Utwórz projekt testu jednostki

Utworzenie klasy testu

Utwórz pierwsza metoda testu

Tworzenie i Uruchamianie testów

Rozwiąż kodu i ponownie uruchom testów

Użyj testy jednostek, aby poprawić kodu

[!UWAGA]

Niniejszy przewodnik używa struktury testów jednostkowych firmy Microsoft dla kodu zarządzanego.Eksploratora testów również uruchamiać testy z innych firm jednostek struktur testów, które mają karty dla Eksploratora testów.Aby uzyskać więcej informacji, zobacz Porady: instalacja frameworków testów jednostkowych innych firm

[!UWAGA]

Aby dowiedzieć się, jak uruchamiać testy z wiersza polecenia, zobacz Wskazówki: korzystanie z narzędzia testu w wierszu polecenia.

Wymagania wstępne

Przygotuj Instruktaż

  1. Otwórz program Visual Studio.

  2. Na pliku menu, wskaż opcję Nowy a następnie kliknij przycisk projektu.

    Nowy projekt pojawi się okno dialogowe.

  3. W obszarze zainstalowane szablony, kliknij przycisk Visual C#.

  4. Na liście typów aplikacji, kliknij przycisk biblioteki klas.

  5. W Nazwa wpisz Bank a następnie kliknij przycisk OK.

    [!UWAGA]

    Jeśli nazwa "Bank" jest już używana, wybierz inną nazwę dla projektu.

    Nowy projekt Bank jest tworzony i wyświetlany w Eksploratorze rozwiązań z plikiem Class1.cs otwarty w edytorze kodu.

    [!UWAGA]

    Jeśli plik Class1.cs nie jest otwarty w edytorze kodu, kliknij dwukrotnie plik Class1.cs w Eksploratorze rozwiązań, aby go otworzyć.

  6. Skopiuj kod źródłowy z Przykładowy projekt dotyczący tworzenia testów jednostkowych.

  7. Zamień zawartość oryginalnego Class1.cs kod z Przykładowy projekt dotyczący tworzenia testów jednostkowych.

  8. Zapisz plik jako BankAccount.cs

  9. W menu Kompilacja kliknij Kompiluj rozwiązanie.

Masz teraz projekt o nazwie Bank.Zawiera kod źródłowy do testowania i narzędzia do testowania za pomocą.Przestrzeń nazw dla Bank, BankAccountNS, zawiera publicznych klasy waluty, której metody spowoduje przetestowanie w poniższych procedur.

W tym szybki start, możemy skupić się na Debit metody.Metoda debetową jest wywoływane, gdy pieniędzy wycofanych z konta zawiera i następujący kod:

// method under test
public void Debit(double amount)
{
    if(amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    m_balance += amount;
}

Utwórz projekt testu jednostki

Wstępnie: postępuj zgodnie z instrukcjami w procedurze przygotowania Instruktaż.

Aby utworzyć projekt testu jednostki

  1. Na pliku menu, wybierz Dodaj, a następnie wybierz Nowy projekt....

  2. W oknie dialogowym Nowy projekt, rozwiń węzeł zainstalowane, rozwiń węzeł Visual C#, a następnie wybierz testu.

  3. Wybierz z listy szablonów, Projekt testu jednostki.

  4. W Nazwa wprowadź BankTest, a następnie wybierz OK.

    BankTests projekt jest dodawany do Bank rozwiązania.

  5. W BankTests projekt, Dodaj odwołanie do Bank rozwiązania.

    W Eksploratorze rozwiązań, wybierz odwołania w BankTests projektu, a następnie wybierz Dodaj odwołanie z menu kontekstowego.

  6. W oknie dialogowym Reference Manager rozwiń rozwiązanie a następnie sprawdź Bank elementu.

Utworzenie klasy testu

Potrzebujemy klasę testu do sprawdzania BankAccount klasy.Firma Microsoft może używać UnitTest1.cs, który został wygenerowany przez szablon projektu, ale możemy należy nadać plikowi i klasy nazwy opisowej.Firma Microsoft może zrobić w jednym kroku, zmiana nazwy pliku w Eksploratorze rozwiązań.

Zmiana nazwy pliku klasy

W Eksploratorze rozwiązań wybierz plik UnitTest1.cs w projekcie BankTests.Z menu kontekstowego wybierz polecenie Zmień nazwę, a następnie zmień nazwę pliku na BankAccountTests.cs.Wybierz Tak w oknie dialogowym, które pyta, jeśli chcesz zmienić wszystkie odwołania w projekcie do elementu kod "UnitTest1".W tym kroku zmieni nazwę klasy do BankAccountTests.

Plik BankAccountTests.cs zawiera teraz następujący kod:

// unit test code
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BankTests
{
    [TestClass]
    public class BankAccountTests
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
}

Dodaj element za pomocą instrukcji do projektu, w obszarze testu

Firma Microsoft może również dodać przez użytkownika za pomocą instrukcji do klasy, aby umożliwić do wywołania do projektu w obszarze testu bez przy użyciu w pełni kwalifikowanej nazwy.W górnej części plik klasy należy dodać:

using BankAccountNS;

Wymagania dotyczące klasy testu

Minimalne wymagania dotyczące klasę testu są następujące:

  • [TestClass] Atrybut jest wymagany w jednostce Microsoft testowania struktury dla zarządzany kod dowolne klasy, która zawiera metody testu jednostki, które ma zostać uruchomiony w Eksploratora testów.

  • Każdej metody przewidzianej Eksploratora testów do uruchomienia musi mieć [TestMethod]atrybutu.

Masz inne klasy w projekcie testu jednostki, które nie mają [TestClass] atrybutu która może mieć innych metod klas testów, które nie mają [TestMethod] atrybutu.Te klasy i metody można użyć w swojej metody testu.

Utwórz pierwsza metoda testu

W tej procedurze, możemy zapisze metody weryfikacji zachowanie testowanie jednostkowe Debit metody BankAccount klasy.Metoda jest wymienione powyżej.

Analizując metody w obszarze testu, określamy, czy istnieją co najmniej trzy zachowania, które muszą zostać sprawdzone:

  1. Metoda zgłasza [ArgumentOutOfRangeException] Jeśli kwota debetową jest większa niż saldo.

  2. Zgłasza także ArgumentOutOfRangeException Jeśli wielkość debetową jest mniejsza od zera.

  3. Jeśli kontrole w 1.) i 2). są spełnione, metoda odejmuje wartość z danym koncie.

W naszych pierwszego badania, użyj prawidłową kwotę (jeden jest mniejsza niż saldo konta, którym jest większa od zera) wycofa z konta poprawną wielkość.

Aby utworzyć metodę testu

  1. Dodaj element za pomocą BankAccountNS; instrukcji do pliku BankAccountTests.cs.

  2. Dodaj następujące metody do tej BankAccountTests klasy:

    // unit test code
    [TestMethod]
    public void Debit_WithValidAmount_UpdatesBalance()
    {
        // arrange
        double beginningBalance = 11.99;
        double debitAmount = 4.55;
        double expected = 7.44;
        BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
    
        // act
        account.Debit(debitAmount);
    
        // assert
        double actual = account.Balance;
        Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly");
    }
    

Metoda jest raczej proste.Firma Microsoft konfigurowania nowego BankAccount obiekt z saldo początkowe, a następnie cofnąć prawidłową wartość.Używamy Microsoft struktury testów jednostkowych dla kodu zarządzanego AreEqual metody umożliwia sprawdzenie, czy saldo końcowe jest firma Microsoft oczekuje.

Wymagania dotyczące metody badania

Metoda testu musi spełniać następujące wymagania:

  • Metoda musi zostać nadany [TestMethod] atrybutu.

  • Metoda musi zwracać void.

  • Metoda nie może mieć parametrów.

Tworzenie i Uruchamianie testów

Tworzenie i Uruchamianie testów

  1. Na Tworzenie menu, wybierz polecenie tworzyć rozwiązania.

    Jeśli nie ma żadnych błędów, z zostanie wyświetlone okno UnitTestExplorer Debit_WithValidAmount_UpdatesBalance się na liście nie Uruchom testy grupy.Jeśli Eksploratora testów nie pojawia się po pomyślnym kompilacji, należy wybrać testu z menu wybierz systemu Windows, a następnie wybierz Eksploratora testów.

  2. Wybierz Uruchom wszystko do uruchomienia testu.Ponieważ test jest uruchomiona na pasku stanu u góry okna jest animowana.Na końcu przebieg testu że na pasku przechodzi w stan zielony w przypadku wszystkich metod testów lub czerwony Jeśli którykolwiek z testów kończą się niepowodzeniem.

  3. W takim przypadku test nie powiodło się.Metoda testu zostanie przeniesiona do nie powiodło się testy.grupy.Wybierz metodę w Eksploratorze testów, aby wyświetlić szczegóły u dołu okna.

Rozwiąż kodu i ponownie uruchom testów

Analizowanie wyników testu

Wynik testu zawiera komunikat opisujący błąd.Dla AreEquals wyświetla komunikat metody, możesz oczekiwaną ((**oczekiwano <XXX>**parametru) i co faktycznie zostało odebrane ( rzeczywisty <YYY> parametru).Oczekiwaną saldo zrezygnować z saldo początkowe, ale zamiast tego wzrosło o wartość cofnięcia.

Ponowne testy kodu debetową pokazuje, że w poszukiwaniu usterkę zakończyło się pomyślnie testu jednostki.Ilość wycofania jest dodawany na danym koncie, gdy należy odjęta.

Popraw usterkę

Aby rozwiązać problem, po prostu zastąpić linię

m_balance += amount;

with

m_balance -= amount;

Ponownie uruchom test

Eksplorator testowanie, wybierz Uruchom wszystko ponownie uruchomić test.Czerwony/zielony pasek przechodzi w stan zielony, a test zostanie przeniesiona do przekazany testów grupy.

Użyj testy jednostek, aby poprawić kodu

W tej sekcji opisano, jak iterację analizy, rozwoju testów jednostkowych i refaktoryzacji może pomóc zwiększyć kodu produkcyjnego bardziej niezawodnych i skutecznych.

Analiza problemów

Po utworzeniu metody, aby upewnić się, czy prawidłową kwotę jest poprawnie odejmuje Debit metody, firma Microsoft można włączyć pozostałych przypadkach w naszej analizie oryginalny:

  1. Metoda zgłasza ArgumentOutOfRangeException Jeśli kwota debetową jest większa niż saldo.

  2. Zgłasza także ArgumentOutOfRangeException Jeśli wielkość debetową jest mniejsza od zera.

Tworzenie metod testu

Zobowiązania wydaje się pierwszej próby podczas tworzenia metody testowania, aby rozwiązać te problemy:

//unit test method
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = -100.00;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // act
    account.Debit(debitAmount);

    // assert is handled by ExpectedException
}

Używamy ExpectedExceptionAttribute atrybut do potwierdzenia, że po prawej został wyjątek.Atrybut powoduje, że testu kończy się niepowodzeniem, chyba że ArgumentOutOfRangeException zgłaszany.Uruchamianie testu z obu dodatnie i ujemne debitAmount wartości i tymczasowo modyfikowania metody badanych wyjątku ogólnej ApplicationException Jeśli wartość jest mniejsza od zera pokazuje test działa prawidłowo.Do przetestowania przypadków, gdy ilości wycofanych jest większy niż saldo, wszystko, co trzeba zrobić to:

  1. Utwórz nowy test metodę o nazwie Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange.

  2. Kopiowanie treści metody z Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange do nowej metody.

  3. Ustaw debitAmount jako liczbę większą niż saldo.

Uruchamianie testów

Uruchamianie dwie metody o różnych wartościach dla debitAmount pokazuje, że testy odpowiednio obsługi naszych pozostałych przypadkach.Uruchamianie wszystkich trzech testów Potwierdź, że obejmuje wszystkie przypadki w naszej analizie oryginalnego.

Kontynuować analizę

Ostatnie dwie metody badania są jednak również nieco Deprymujące.Firma Microsoft nie może być niektórych warunków, które w testowanego kodu zgłasza wyjątek, jeśli albo przetestować działa.Inny sposób pozwalających dwóch warunków byłoby pomocne.Jak firma Microsoft reakcji o problemie więcej, okaże się czy mamy do czynienia warunku, które zostało naruszone wzrosną naszych zaufania testy.Te informacje będą również bardzo prawdopodobne warto mechanizm produkcji, który obsługuje wyjątek, gdy jest generowany przez metodę badanych.Generowanie więcej informacji, gdy wystąpił metody umożliwi wszystkich zainteresowanych, ale ExpectedException atrybutu nie można podać te informacje...

Spojrzenie na metodę badanych ponownie, firma Microsoft Zobacz obu instrukcji warunkowych, użyj ArgumentOutOfRangeException Konstruktor pobierający Nazwa argumentu jako parametr:

throw new ArgumentOutOfRangeException("amount");

W wyniku wyszukiwania biblioteki MSDN możemy wykryć konstruktora opisujący informacje o wiele więcej.#ctor(String, Object, String) zawiera nazwę argument, wartość argumentu i komunikat zdefiniowanej przez użytkownika.Firma Microsoft może refactor metodę badanych tego konstruktora.Jeszcze lepsze elementy członkowskie typu publicznej można wykorzystać do określenie błędów.

Refactor testowanego kodu

Najpierw definiujemy dwie stałe dla komunikatów o błędach w zakresie klasy:

// class under test
public const string DebitAmountExceedsBalanceMessage = "Debit amount exceeds balance";
public const string DebitAmountLessThanZeroMessage = "Debit amount less than zero";

Następnie zmodyfikuj mamy dwie instrukcje warunkowe w Debit metody:

// method under test
// ...
    if (amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount", amount, DebitAmountExceedsBalanceMessage);
    }

    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount", amount, DebitAmountLessThanZeroMessage);
    }
// ...

Refactor metody testu

W metodzie naszych testu, możemy najpierw usunąć ExpectedException atrybutu.W tym miejscu firma Microsoft łap zwrócony wyjątek i sprawdzić, czy został zgłoszony w instrukcji poprawne warunku.Jednak firma Microsoft teraz zdecydować, jedną z dwóch opcji, aby sprawdzić nasze warunki pozostałe.Na przykład w Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange metody, firma Microsoft można wykonać jedną z następujących czynności:

  • Potwierdzenia, że ActualValue Właściwości wyjątku (drugi parametr ArgumentOutOfRangeException Konstruktor) jest większy niż saldo początkowe.Ta opcja wymaga testowanie przez nas ActualValue Właściwości wyjątku przed beginningBalance zmiennej metody badania i również wymaga, a następnie sprawdź, czy ActualValue jest większa od zera.

  • Potwierdzenia, że wiadomość (trzeci parametr konstruktora) zawiera DebitAmountExceedsBalanceMessage zdefiniowanego w BankAccount klasy.

StringAssert.Contains Metody w struktury testów jednostkowych Microsoft pozwala nam Sprawdź druga opcja bez obliczeń, które są wymagane pierwszej opcji.

Druga próba wprowadzenia zmian do Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange może wyglądać tak:

[TestMethod]
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // act
    try
    {
        account.Debit(debitAmount);
    }
    catch (ArgumentOutOfRangeException e)
    {
        // assert
        StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
    }
}

Sprawdź jeszcze raz, ponowne zapisywanie adresów i Analizuj ponownie

Podczas możemy ponów test metody badania o różnych wartościach, możemy występują następujące informacje:

  1. Firma Microsoft łap poprawne błąd przy użyciu potwierdzenia gdzie debitAmount większą niż saldo, Contains potwierdzenia pomyślnej, wyjątek jest ignorowana, a więc metody zakończy się pomyślnie.Jest to zachowanie, które chcemy.

  2. Jeśli używamy debitAmount jest mniejszy niż 0, potwierdzenia nie powiodło się, ponieważ jest zwracana niewłaściwy komunikat o błędzie.Potwierdzenia także nie działa, jeśli firma Microsoft wprowadzenie tymczasowego ArgumentOutOfRange wyjątek w punkcie innej metody, ścieżka kodu testu.Zbyt jest dobra.

  3. Jeśli debitAmount wartość jest prawidłowa, (tj. mniej niż saldo, ale większa od zera, nie jest wyjątek, więc potwierdzenia nigdy nie zostanie zablokowany.Metody zakończy się pomyślnie.To nie jest dobra, ponieważ chcemy metoda testu kończy się niepowodzeniem, jeśli nie wyjątku.

Fakt trzeci jest usterkę w naszym metody.Aby spróbować rozwiązać ten problem, dodamy Fail potwierdzenia na końcu metody na potrzeby obsługi przypadków, w których nie wyjątku.

Jednak ponowne pokazuje, że teraz fałszywe, jeśli poprawne wyjątek.Instrukcja catch resetuje wyjątek i metoda będzie nadal występował można było wykonać, się niepowodzeniem w nowych potwierdzenia.Aby rozwiązać problem, nowe, dodamy return instrukcji po StringAssert.Ponowne potwierdza, możemy wyeliminowaniu naszych problemów.Nasze ostateczna wersja Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange wygląda podobnie do następujących:

[TestMethod]
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // act
    try
    {
        account.Debit(debitAmount);    
    }
    catch (ArgumentOutOfRangeException e)
    {
        // assert
        StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
        return;
    }
    Assert.Fail("No exception was thrown.");
}

W tej sekcji końcowego pracy NAS poprawy naszych kodu testu doprowadziło do metody badania niezawodne i bardziej przydatnych informacji.Jednak co ważniejsze, również spowodowało lepszy kod w naszym projektu w obszarze testu dodatkowe analizy.