Samouczek: testowanie biblioteki klas platformy .NET przy użyciu programu Visual Studio Code
W tym samouczku pokazano, jak zautomatyzować testowanie jednostkowe przez dodanie projektu testowego do rozwiązania.
Warunki wstępne
- Ten samouczek współpracuje z rozwiązaniem utworzonym w Tworzenie biblioteki klas platformy .NET przy użyciu programu Visual Studio Code.
Tworzenie projektu testów jednostkowych
Testy jednostkowe zapewniają zautomatyzowane testowanie oprogramowania podczas opracowywania i publikowania. Struktura testowania używana w tym samouczku to MSTest. MSTest jest jedną z trzech platform testowych, z których można wybrać. Pozostałe to xUnit i nUnit .
Uruchom program Visual Studio Code.
Otwórz rozwiązanie
ClassLibraryProjects
utworzone w Tworzenie biblioteki klas platformy .NET przy użyciu programu Visual Studio Code.W eksploratorze rozwiązań wybierz pozycję Nowy projektlub z palety poleceń wybierz pozycję .NET: Nowy projekt.
Wybierz Projekt testowy MSTest, nadaj mu nazwę "StringLibraryTest", wybierz domyślny katalog i wybierz Utwórz projekt.
Szablon projektu tworzy plik UnitTest1.cs z następującym kodem:
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }
Kod źródłowy utworzony przez szablon testu jednostkowego wykonuje następujące czynności:
- Stosuje atrybut TestClassAttribute do klasy
UnitTest1
. - Stosuje atrybut TestMethodAttribute do definiowania
TestMethod1
. - Importuje przestrzeń nazw Microsoft.VisualStudio.TestTools.UnitTesting, która zawiera typy używane do testowania jednostkowego. Przestrzeń nazw jest importowana przy użyciu dyrektywy
global using
w GlobalUsings.cs.
Każda metoda oznaczona [TestMethod] w klasie testowej oznaczonej [TestClass] jest uruchamiana automatycznie po wywołaniu testu jednostkowego.
- Stosuje atrybut TestClassAttribute do klasy
Dodawanie odwołania do projektu
Aby projekt testowy działał z klasą StringLibrary
, dodaj odwołanie w projekcie StringLibraryTest
do projektu StringLibrary
.
W eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt "StringLibraryTest" i wybierz pozycję Dodaj odwołanie do projektu.
Wybierz "StringLibrary".
Dodawanie i uruchamianie metod testów jednostkowych
Gdy program Visual Studio wywołuje test jednostkowy, uruchamia każdą metodę oznaczoną atrybutem TestMethodAttribute w klasie oznaczonej atrybutem TestClassAttribute. Metoda testowa kończy się po znalezieniu pierwszego błędu lub gdy wszystkie testy zawarte w metodzie zakończyły się pomyślnie.
Najbardziej typowe testy wywołują członków klasy Assert. Wiele metod asercyjnych obejmuje co najmniej dwa parametry, z których jeden jest oczekiwanym wynikiem testu, a drugi jest rzeczywistym wynikiem testu. Niektóre z najczęściej wywoływanych metod klasy Assert
przedstawiono w poniższej tabeli:
Metody asercji | Funkcja |
---|---|
Assert.AreEqual |
Sprawdza, czy dwie wartości lub obiekty są równe. Asercja kończy się niepowodzeniem, jeśli wartości lub obiekty nie są równe. |
Assert.AreSame |
Sprawdza, czy dwie zmienne obiektu odwołują się do tego samego obiektu. Asercja kończy się niepowodzeniem, jeśli zmienne odwołują się do różnych obiektów. |
Assert.IsFalse |
Sprawdza, czy warunek jest false . Asercja kończy się niepowodzeniem, jeśli warunek ma wartość true . |
Assert.IsNotNull |
Sprawdza, czy obiekt nie jest null . Asercja kończy się niepowodzeniem, jeśli obiekt jest null . |
Można również użyć metody Assert.ThrowsException w metodzie testowej, aby wskazać typ wyjątku, który ma zostać zgłoszony. Test kończy się niepowodzeniem, jeśli określony wyjątek nie zostanie zgłoszony.
Podczas testowania metody StringLibrary.StartsWithUpper
chcesz podać kilka ciągów rozpoczynających się od wielkiej litery. Oczekujesz, że metoda zwróci true
w tych przypadkach, aby można było wywołać metodę Assert.IsTrue. Podobnie chcesz podać wiele ciągów, które zaczynają się od innego znaku niż wielkie litery. Oczekujesz, że metoda zwróci false
w tych przypadkach, aby można było wywołać metodę Assert.IsFalse.
Ponieważ metoda biblioteki obsługuje ciągi, należy również upewnić się, że pomyślnie obsługuje pusty ciąg (String.Empty
) i ciąg null
. Pusty ciąg to taki, który nie ma znaków i którego Length wynosi 0. Ciąg null
to ciąg, który nie został zainicjowany. Można wywołać StartsWithUpper
bezpośrednio jako metodę statyczną i przekazać jeden argument String. Możesz też wywołać StartsWithUpper
jako metodę rozszerzenia w zmiennej string
przypisanej do null
.
Zdefiniujesz trzy metody, z których każda wywołuje metodę Assert dla każdego elementu w tablicy ciągów. Wywołasz przeciążenie metody umożliwiające określenie komunikatu o błędzie wyświetlanego w przypadku niepowodzenia testu. Komunikat identyfikuje ciąg, który spowodował błąd.
Aby utworzyć metody testowe:
Otwórz StringLibraryTest/UnitTest1.cs i zastąp cały kod poniższym kodem.
using Microsoft.VisualStudio.TestTools.UnitTesting; using UtilityLibraries; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestStartsWithUpper() { // Tests that we expect to return true. string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsTrue(result, string.Format("Expected for '{0}': true; Actual: {1}", word, result)); } } [TestMethod] public void TestDoesNotStartWithUpper() { // Tests that we expect to return false. string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word, result)); } } [TestMethod] public void DirectCallWithNullOrEmpty() { // Tests that we expect to return false. string?[] words = { string.Empty, null }; foreach (var word in words) { bool result = StringLibrary.StartsWithUpper(word); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word == null ? "<null>" : word, result)); } } } }
Test wielkich liter w metodzie
TestStartsWithUpper
obejmuje grecką wielką literę alfa (U+0391) i cyrylicką wielką literę EM (U+041C). Test małych liter w metodzieTestDoesNotStartWithUpper
obejmuje małą grecką literę alfa (U+03B1) i małą cyrylicką literę Ghe (U+0433).Zapisz zmiany.
Kompilowanie i uruchamianie testów
W eksploratorze rozwiązań kliknij rozwiązanie prawym przyciskiem myszy i wybierz pozycję Build lub z palety poleceń wybierz pozycję .NET: Build.
Wybierz okno testowania, wybierz Uruchom testy lub z palety poleceń wybierz Test: Uruchom wszystkie testy.
Obsługa niepowodzeń testów
Jeśli wykonujesz programowanie oparte na testach (TDD), najpierw piszesz testy i kończą się one niepowodzeniem przy pierwszym uruchomieniu. Następnie dodasz kod do aplikacji, który sprawia, że test zakończy się pomyślnie. Na potrzeby tego samouczka utworzono test po napisaniu kodu aplikacji, który jest weryfikowany, więc nie zaobserwowano niepowodzenia testu. Aby sprawdzić, czy test zakończy się niepowodzeniem, gdy oczekujesz, że zakończy się niepowodzeniem, dodaj nieprawidłową wartość do danych wejściowych testu.
Zmodyfikuj tablicę
words
w metodzieTestDoesNotStartWithUpper
, aby uwzględnić ciąg "Błąd".string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Uruchom testy, klikając na zieloną ikonę obok testu w edytorze.
Dane wyjściowe pokazują, że test kończy się niepowodzeniem i zawiera komunikat o błędzie dla testu, który zakończył się niepowodzeniem: "Assert.IsFalse failed. Oczekiwano wartości "Błąd": false; rzeczywiste: prawda". Ze względu na błąd, żadne ciągi w tablicy po "Error" nie zostały przetestowane.
Test programu Visual Studio Code zakończył się niepowodzeniem
Usuń ciąg "Błąd", który dodałeś w kroku.
Ponownie uruchom test, a testy przejdą pomyślnie.
Przetestuj wersję Release biblioteki
Teraz, gdy wszystkie testy zostały pomyślnie wykonane podczas uruchamiania wersji Debug biblioteki, uruchom testy jeszcze raz dla wersji Release biblioteki. Wiele czynników, w tym optymalizacje kompilatora, może czasami generować różne zachowanie między kompilacjami wersji Debug i Release.
Uruchom testy, korzystając z konfiguracji kompilacji typu Release.
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
Testy kończą się powodzeniem.
Debugowanie testów
Jeśli używasz programu Visual Studio Code jako środowiska IDE, możesz użyć tego samego procesu pokazanego w Debugowanie aplikacji konsolowej platformy .NET przy użyciu programu Visual Studio Code do debugowania kodu przy użyciu projektu testów jednostkowych. Zamiast uruchamiać projekt aplikacji ShowCase, otwórz StringLibraryTest/UnitTest1.csi wybierz pozycję Debug Tests w bieżącym pliku między wierszami 7 i 8. Jeśli nie możesz go znaleźć, naciśnij Ctrl+Shift+P, aby otworzyć paletę poleceń, a następnie wprowadź polecenie Ponownie załaduj okno.
Program Visual Studio Code uruchamia projekt testowy z dołączonym debugerem. Wykonanie zostanie zatrzymane w dowolnym punkcie przerwania dodanym do projektu testowego lub bazowego kodu biblioteki.
Dodatkowe zasoby
Następne kroki
W tym samouczku przeprowadzono testy jednostkowe biblioteki klas. Możesz udostępnić bibliotekę innym osobom, publikując ją jako pakiet w NuGet. Aby dowiedzieć się, jak to zrobić, postępuj zgodnie z samouczkiem NuGet:
Jeśli publikujesz bibliotekę jako pakiet NuGet, inne osoby mogą je instalować i używać. Aby dowiedzieć się, jak to zrobić, postępuj zgodnie z samouczkiem NuGet:
Biblioteka nie musi być dystrybuowana jako pakiet. Może być on powiązany z aplikacją konsolową, która z niej korzysta. Aby dowiedzieć się, jak opublikować aplikację konsolową, zobacz wcześniejszy samouczek z tej serii:
Rozszerzenie Visual Studio Code C# Dev Kit udostępnia więcej narzędzi do tworzenia aplikacji i bibliotek języka C#:
Zestaw deweloperski C#