Szybki start: tworzenie aplikacji z uwzględnieniem testów za pomocą narzędzia Eksplorator testów
Zaleca się utworzenie testów jednostkowych, aby pomóc w utrzymaniu poprawnego działania kodu przez wiele kroków przyrostowych cyklu wytwarzania oprogramowania.Istnieje kilka środowisk, których możesz użyć do pisania testów jednostkowych, łącznie z niektórymi opracowanymi przez inne firmy.Niektóre środowiska testowe są wyspecjalizowane w testowaniu różnych języków lub platform.Eksplorator testów dostarcza pojedynczy interfejs do testów jednostkowych w dowolnym z tych środowisk.Dostępne są adaptery dla większości powszechnie stosowanych środowisk, a możesz również napisać własne adaptery dla innych środowisk.
Eksplorator testów zastępuje okna testów jednostkowych ze starszych wersji programu Visual Studio.Jego zalety obejmują:
Uruchamianie testów platformy .NET, niezarządzanych, baz danych oraz innych rodzajów testów przy użyciu pojedynczego interfejsu.
Używanie wybranego środowiska testów jednostkowych, takiego jak NUnit lub środowisk MSTest.
Oglądanie wszystkich potrzebnych informacji w jednym oknie.
Używanie Eksploratora testów
Aby uruchomić testy jednostkowe za pomocą Eksploratora testów
Utwórz testy jednostkowe, które używają wybranych środowisk testowych.
Na przykład aby utworzyć test, który używa środowiska MSTest:
Utwórz projekt testów.
W oknie dialogowym Nowy projekt rozwiń węzeł Visual Basic, Visual C# lub Visual C++, a następnie wybierz opcję Test.
Wybierz opcje Projekt testów jednostkowych.
Napisz każdy test jednostkowy jako metodę.Przed każdą metodą testu umieść atrybut [TestMethod].
Na pasku menu wybierz kolejno opcje Test > Uruchom testy jednostkowe > Wszystkie testy.
Rozwiązanie zostanie skompilowane, a testy uruchomione.
Otwarty zostanie Eksplorator testów, który wyświetli podsumowanie wyników.
Aby zobaczyć pełną listę testów: Wybierz opcję Pokaż wszystko w dowolnej kategorii.
Aby powrócić do podsumowania, wybierz widok STRONA GŁÓWNA.
Aby wyświetlić szczegóły wyników testu: Wybierz test w Eksploratorze testów, aby wyświetlić szczegóły, takie jak komunikaty wyjątków w okienku szczegółów.
Aby przejść do kodu testu: Kliknij dwukrotnie test w Eksploratorze testów lub wybierz opcję Otwórz test w menu skrótów.
Aby debugować test: Otwórz menu skrótów jednego lub więcej testów, a następnie wybierz opcję Debuguj wybrane testy.
![]() |
---|
Wyświetlane wyniki dotyczą ostatniego uruchomienia.Kolorowe paski wyników pokazują jedynie wyniki wykonanych testów.Na przykład jeśli uruchomisz kilka testów i niektóre z nich nie powiodą się, a następnie uruchomisz jedynie testy, które powiodły się, to wszystkie paski wyników zostaną wyświetlone na zielono. |
[!UWAGA]
Jeśli nie pojawi się żaden test, upewnij się, że zainstalowano adapter do połączenia Eksploratora testów ze środowiskiem testowym, którego używasz.Aby uzyskać więcej informacji, zobacz Używanie różnych środowisk testowych w Eksploratorze testów.
Instruktaż: Używanie testów jednostkowych do opracowania metody
W tym instruktażu pokazano, w jaki sposób opracować przetestowaną metodę w języku C# za pomocą środowiska testów jednostkowych firmy Microsoft.Możesz ją łatwo przystosować do innych języków i używać innych środowisk testowych, takich jak NUnit.Aby uzyskać więcej informacji, zobacz Używanie różnych środowisk testowych.
Utworzenie testu i metody
Utworzenie projekt biblioteki klas języka Visual C#.Projekt ten będzie zawierał kod, który chcemy dostarczyć.W tym przykładzie jest on nazwany MyMath.
Utwórz projekt testów.
W oknie dialogowym Nowy projekt wybierz kolejno opcje Visual C# > Test, a następnie wybierz polecenie Projekt testu jednostkowego.
Napisz podstawową metodę testową.Sprawdź wynik uzyskany dla określonych danych wejściowych:
[TestMethod] public void BasicRooterTest() { // Create an instance to test: Rooter rooter = new Rooter(); // Define a test input and output value: double expectedResult = 2.0; double input = expectedResult * expectedResult; // Run the method under test: double actualResult = rooter.SquareRoot(input); // Verify the result: Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 100); }
Wygeneruj metodę z testu.
Umieść kursor na elemencie Rooter, a następnie w menu skrótów wybierz kolejno opcje Generuj > Nowy typ.
W oknie dialogowym Generuj nowy typ ustaw Projekt na projekt biblioteki klas.W tym przykładzie jest to MyMath.
Umieść kursor na elemencie SquareRoot, a następnie w menu skrótów wybierz kolejno opcje Generuj > Procedura zastępcza metody.
Uruchom test jednostkowy.
W menu Test wybierz kolejno opcje Uruchom testy jednostkowe > Wszystkie testy.
Rozwiązanie zostanie skompilowane i uruchomione.
Otwarty zostanie Eksplorator testów, który wyświetli wyniki.
Test pojawi się w sekcji Testy zakończone niepomyślnie.
Wybierz nazwę testu.
Szczegóły testu zostaną wyświetlone w dolnej części Eksploratora testów.
Zaznacz elementy w obszarze Ślad stosu, aby zobaczyć, w którym miejscu testy nie powiodły się.
Do tej pory utworzono test i procedurę zastępczą, którą zmodyfikujesz, aby test powiódł się.
Po każdej zmianie wszystkie testy powinny kończyć się powodzeniem
W pliku MyMath\Rooter.cs popraw kod metody SquareRoot:
public double SquareRoot(double input) { return input / 2; }
W Eksploratorze testów, wybierz Uruchom wszystkie.
Kod zostanie skompilowany, a test uruchomiony.
Test zakończył się powodzeniem.
Dodawanie testów, aby rozszerzyć zakres danych wejściowych
Aby zwiększyć pewność, że kod działa we wszystkich przypadkach, dodaj testy, które sprawdzają szerszy zakres wartości wejściowych.
Porada
Unikaj zmieniania istniejących testów, które powiodły się.Zamiast tego dodaj nowe testy.Zmieniaj istniejące testy tylko gdy zmienią się wymagania użytkownika.Zasada ta pomaga upewnić się, że nie tracisz istniejących funkcji w trakcie pracy nad rozszerzeniem kodu.
W klasie testów dodaj następujący test, który sprawdzi zakres wartości wejściowych:
[TestMethod] public void RooterValueRange() { // Create an instance to test: Rooter rooter = new Rooter(); // Try a range of values: for (double expectedResult = 1e-8; expectedResult < 1e+8; expectedResult = expectedResult * 3.2) { RooterOneValue(rooter, expectedResult); } } private void RooterOneValue(Rooter rooter, double expectedResult) { double input = expectedResult * expectedResult; double actualResult = rooter.SquareRoot(input); Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 1000); }
W Eksploratorze testów, wybierz Uruchom wszystkie.
Nowy test kończy się niepowodzeniem, mimo że kod nadal przechodzi pierwszy test.
Aby znaleźć punkt awarii, wybierz test, który zakończył się niepowodzeniem, i w dolnej części Eksploratora testów wybierz górny element w sekcji Ślad stosu.
Sprawdź testowaną metodę, aby zobaczyć, co może być źle.W klasie MyMath.Rooter przepisz ponownie:
public double SquareRoot(double input) { double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = result - (result * result - input) / (2 * result); } return result; }
W Eksploratorze testów, wybierz Uruchom wszystkie.
Teraz kod przechodzi oba testy.
Dodawanie testów wyjątkowych przypadków
Dodaj test ujemnych danych wejściowych:
[TestMethod] public void RooterTestNegativeInputx() { Rooter rooter = new Rooter(); try { rooter.SquareRoot(-10); } catch (ArgumentOutOfRangeException e) { return; } Assert.Fail(); }
W Eksploratorze testów, wybierz Uruchom wszystkie.
Testowana metoda zapętla się i musi zostać anulowana ręcznie.
Wybierz Anuluj.
Test zatrzyma się po 10 sekundach.
Napraw kod metody:
public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } ...
W Eksploratorze testów, wybierz Uruchom wszystkie.
Kod przechodzi wszystkie testy.
Refaktoryzacja bez zmieniania testów
Uprość kod, ale nie zmieniaj testów.
Porada
Refaktoryzacja jest zmianą, której celem jest usprawnienia działania kodu lub uczynienie go łatwiejszym w zrozumieniu.Nie jest przeznaczona do zmiany zachowania kodu i z tego powodu testy nie są zmieniane.
Zaleca się, aby wykonać kroki refaktoryzacji oddzielnie od kroków, które rozszerzają funkcjonalność.Utrzymanie testów w niezmienionej postaci daje pewność, że podczas refaktoryzacji nie zostaną przypadkowo wprowadzone usterki.
public class Rooter { public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = (result + input / result) / 2; //was: result = result - (result * result - input) / (2*result); } return result; } }
Wybierz opcję Uruchom wszystko.
Kod nadal przechodzi wszystkie testy.