Rozpoczynanie pracy z funkcją Live Unit Testing
Po włączeniu funkcji Live Unit Testing w rozwiązaniu programu Visual Studio wizualnie przedstawia pokrycie testowe i stan testów. Live Unit Testing również dynamicznie wykonuje testy za każdym razem, gdy modyfikujesz kod i natychmiast powiadamia o tym, kiedy zmiany powodują niepowodzenie testów.
Testy jednostkowe na żywo mogą służyć do testowania rozwiązań przeznaczonych dla programów .NET Framework, .NET Core lub .NET 5+. W tym samouczku dowiesz się, jak używać funkcji Live Unit Testing, tworząc prostą bibliotekę klas przeznaczoną dla platformy .NET, a następnie utworzysz projekt MSTest przeznaczony dla platformy .NET, aby go przetestować.
Kompletne rozwiązanie języka C# można pobrać z repozytorium MicrosoftDocs/visualstudio-docs w witrynie GitHub.
Wymagania wstępne
Ten samouczek wymaga zainstalowania programu Visual Studio Enterprise z obciążeniem tworzenia aplikacji klasycznych platformy .NET.
Tworzenie rozwiązania i projektu biblioteki klas
Zacznij od utworzenia rozwiązania programu Visual Studio o nazwie UtilityLibraries składającego się z pojedynczego projektu biblioteki klas platformy .NET StringLibrary.
Rozwiązanie to tylko kontener dla co najmniej jednego projektu. Aby utworzyć puste rozwiązanie, otwórz program Visual Studio i wykonaj następujące czynności:
Wybierz pozycję Plik>nowy>projekt z menu programu Visual Studio najwyższego poziomu.
Wpisz rozwiązanie w polu wyszukiwania szablonu, a następnie wybierz szablon Puste rozwiązanie . Nadaj projektowi nazwę UtilityLibraries.
Zakończ tworzenie rozwiązania.
Po utworzeniu rozwiązania utworzysz bibliotekę klas o nazwie StringLibrary zawierającą wiele metod rozszerzeń do pracy z ciągami.
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy rozwiązanie UtilityLibraries i wybierz pozycję Dodaj>nowy projekt.
Wpisz bibliotekę klas w polu wyszukiwania szablonu, a następnie wybierz szablon Biblioteka klas przeznaczony dla platformy .NET lub .NET Standard. Kliknij przycisk Dalej.
Nadaj projektowi nazwę StringLibrary.
Kliknij przycisk Utwórz , aby utworzyć projekt.
Zastąp cały istniejący kod w edytorze kodu następującym kodem:
using System; namespace UtilityLibraries { public static class StringLibrary { public static bool StartsWithUpper(this string s) { if (String.IsNullOrWhiteSpace(s)) return false; return Char.IsUpper(s[0]); } public static bool StartsWithLower(this string s) { if (String.IsNullOrWhiteSpace(s)) return false; return Char.IsLower(s[0]); } public static bool HasEmbeddedSpaces(this string s) { foreach (var ch in s.Trim()) { if (ch == ' ') return true; } return false; } } }
StringLibrary ma trzy metody statyczne:
StartsWithUpper
Zwracatrue
wartość , jeśli ciąg zaczyna się od wielkiej litery; w przeciwnym razie zwraca wartośćfalse
.StartsWithLower
Zwracatrue
wartość , jeśli ciąg rozpoczyna się od małego znaku; w przeciwnym razie zwraca wartośćfalse
.HasEmbeddedSpaces
Zwracatrue
wartość , jeśli ciąg zawiera osadzony znak odstępu; w przeciwnym razie zwraca wartośćfalse
.
Wybierz pozycję Kompiluj>rozwiązanie kompilacji z menu programu Visual Studio najwyższego poziomu. Kompilacja powinna zakończyć się pomyślnie.
Tworzenie projektu testowego
Następnym krokiem jest utworzenie projektu testu jednostkowego w celu przetestowania biblioteki StringLibrary. Utwórz testy jednostkowe, wykonując następujące czynności:
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy rozwiązanie UtilityLibraries i wybierz pozycję Dodaj>nowy projekt.
Wpisz test jednostkowy w polu wyszukiwania szablonu, wybierz pozycję C# jako język, a następnie wybierz szablon MSTest Unit Test Project for .NET. Kliknij przycisk Dalej.
Uwaga
W programie Visual Studio 2019 w wersji 16.9 nazwa szablonu projektu MSTest to Unit Test Project.
Nadaj projektowi nazwę StringLibraryTests i kliknij przycisk Dalej.
Wybierz zalecaną strukturę docelową lub platformę .NET 8, a następnie wybierz pozycję Utwórz.
Uwaga
Ten samouczek wprowadzający korzysta z funkcji Live Unit Testing z platformą testową MSTest. Możesz również użyć platform testowych xUnit i NUnit.
Projekt testu jednostkowego nie może automatycznie uzyskać dostępu do biblioteki klas, którą testuje. Dostęp do biblioteki testowej można uzyskać, dodając odwołanie do projektu biblioteki klas. W tym celu kliknij prawym przyciskiem myszy
StringLibraryTests
projekt i wybierz polecenie Dodaj>odwołanie do projektu. W oknie dialogowym Menedżer odwołań upewnij się, że wybrano kartę Rozwiązanie, a następnie wybierz projekt StringLibrary, jak pokazano na poniższej ilustracji.Zastąp standardowy kod testu jednostkowego dostarczony przez szablon następującym kodem:
using System; 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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{(word == null ? "<null>" : word)}': " + $"false; Actual: {result}"); } } } }
Zapisz projekt, wybierając ikonę Zapisz na pasku narzędzi.
Ponieważ kod testu jednostkowego zawiera niektóre znaki inne niż ASCII, zostanie wyświetlone następujące okno dialogowe z ostrzeżeniem, że niektóre znaki zostaną utracone, jeśli zapiszesz plik w domyślnym formacie ASCII.
Wybierz przycisk Zapisz przy użyciu innego kodowania .
Na liście rozwijanej Kodowanie okna dialogowego Zaawansowane opcje zapisywania wybierz pozycję Unicode (UTF-8 bez podpisu) — Strona kodowa 65001, jak pokazano na poniższej ilustracji:
Skompiluj projekt testu jednostkowego, wybierając pozycję Kompiluj>ponownie rozwiązanie z menu programu Visual Studio najwyższego poziomu.
Utworzono bibliotekę klas, a także niektóre testy jednostkowe. Ukończono wstępne czynności wymagane do korzystania z testów jednostkowych na żywo.
Włączanie testów jednostkowych na żywo
Do tej pory, mimo że zostały napisane testy dla biblioteki klas StringLibrary, nie zostały one wykonane. Funkcja Live Unit Testing wykonuje je automatycznie po jej włączeniu. W tym celu wykonaj następujące czynności:
Opcjonalnie wybierz okno edytora kodu zawierające kod stringLibrary. Jest to Class1.cs dla projektu w języku C# lub Class1.vb dla projektu Visual Basic. (Ten krok umożliwia wizualne sprawdzenie wyników testów i zakresu pokrycia kodu po włączeniu testowania jednostkowego na żywo).
Wybierz pozycję Testuj testy>jednostkowe>na żywo Rozpocznij z menu programu Visual Studio najwyższego poziomu.
Sprawdź konfigurację funkcji Live Unit Testing, upewniając się, że katalog główny repozytorium zawiera ścieżkę do plików źródłowych zarówno dla projektu narzędziowego, jak i projektu testowego. Wybierz przycisk Dalej , a następnie pozycję Zakończ.
W oknie Live Unit Testing wybierz link dołącz wszystkie testy (alternatywnie wybierz ikonę przycisku Lista odtwarzania, a następnie wybierz pozycję StringLibraryTest, która wybiera wszystkie testy poniżej. Następnie usuń zaznaczenie przycisku Lista odtwarzania, aby zamknąć tryb edycji.
Program Visual Studio ponownie skompiluje projekt i uruchomi test jednostkowy na żywo, który automatycznie uruchamia wszystkie testy.
- Program Visual Studio ponownie skompiluje projekt i uruchomi test jednostkowy na żywo, który automatycznie uruchamia wszystkie testy.
Po zakończeniu uruchamiania testów funkcja Live Unit Testing wyświetla zarówno ogólne wyniki, jak i wynik poszczególnych testów. Ponadto okno edytora kodu graficznie wyświetla zarówno pokrycie kodu testowego, jak i wynik testów. Jak pokazano na poniższej ilustracji, wszystkie trzy testy zostały wykonane pomyślnie. Pokazuje również, że nasze testy obejmowały wszystkie ścieżki kodu w StartsWithUpper
metodzie, a wszystkie te testy zostały wykonane pomyślnie (co jest wskazywane przez zielony znacznik wyboru, "^"). Na koniec pokazuje, że żadna z innych metod w ciąguLibrary nie ma pokrycia kodu (co jest wskazywane przez niebieską linię "➖").
Możesz również uzyskać bardziej szczegółowe informacje na temat pokrycia testu i wyników testów, wybierając określoną ikonę pokrycia kodu w oknie edytora kodu. Aby zbadać ten szczegół, wykonaj następujące czynności:
Kliknij zielony znacznik wyboru w wierszu, który odczytuje
if (String.IsNullOrWhiteSpace(s))
w metodzieStartsWithUpper
. Jak pokazano na poniższej ilustracji, testy jednostkowe na żywo wskazują, że trzy testy obejmują ten wiersz kodu i że wszystkie zostały wykonane pomyślnie.Kliknij zielony znacznik wyboru w wierszu, który odczytuje
return Char.IsUpper(s[0])
w metodzieStartsWithUpper
. Jak pokazano na poniższej ilustracji, funkcja Live Unit Testing wskazuje, że tylko dwa testy obejmują ten wiersz kodu i że wszystkie zostały wykonane pomyślnie.
Głównym problemem, który identyfikuje usługa Live Unit Testing, jest niekompletne pokrycie kodu. Zajmiesz się nim w następnej sekcji.
Rozwiń pokrycie testowe
W tej sekcji rozszerzysz testy jednostkowe na metodę StartsWithLower
. Chociaż to zrobisz, testowanie jednostkowe na żywo będzie nadal testować kod.
Aby rozszerzyć pokrycie kodu na metodę StartsWithLower
, wykonaj następujące czynności:
Dodaj następujące
TestStartsWithLower
metody iTestDoesNotStartWithLower
do pliku kodu źródłowego testu projektu:// Code to add to UnitTest1.cs [TestMethod] public void TestStartsWithLower() { // Tests that we expect to return true. string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство" }; foreach (var word in words) { bool result = word.StartsWithLower(); Assert.IsTrue(result, $"Expected for '{word}': true; Actual: {result}"); } } [TestMethod] public void TestDoesNotStartWithLower() { // Tests that we expect to return false. string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва", "1234", ".", ";", " "}; foreach (var word in words) { bool result = word.StartsWithLower(); Assert.IsFalse(result, $"Expected for '{word}': false; Actual: {result}"); } }
Zmodyfikuj metodę
DirectCallWithNullOrEmpty
, dodając następujący kod bezpośrednio po wywołaniuMicrosoft.VisualStudio.TestTools.UnitTesting.Assert.IsFalse
metody .// Code to add to UnitTest1.cs result = StringLibrary.StartsWithLower(word); Assert.IsFalse(result, $"Expected for '{(word == null ? "<null>" : word)}': " + $"false; Actual: {result}");
Funkcja Live Unit Testing automatycznie wykonuje nowe i zmodyfikowane testy podczas modyfikowania kodu źródłowego. Jak pokazano na poniższej ilustracji, wszystkie testy, w tym dwa dodane i zmodyfikowane, zakończyły się pomyślnie.
Przejdź do okna zawierającego kod źródłowy klasy StringLibrary. Funkcja Live Unit Testing pokazuje teraz, że nasze pokrycie kodu zostało rozszerzone na metodę
StartsWithLower
.
W niektórych przypadkach pomyślne testy w Eksploratorze testów mogą być wyszarawe. Oznacza to, że test jest obecnie wykonywany lub że test nie został uruchomiony ponownie, ponieważ nie nastąpiły żadne zmiany kodu, które miałyby wpływ na test od czasu ostatniego wykonania.
Do tej pory wszystkie nasze testy zakończyły się pomyślnie. W następnej sekcji sprawdzimy, jak można obsłużyć niepowodzenie testu.
Obsługa niepowodzenia testu
W tej sekcji dowiesz się, jak używać testów jednostkowych na żywo do identyfikowania, rozwiązywania problemów i rozwiązywania problemów z błędami testów. W tym celu rozszerzysz pokrycie testowe HasEmbeddedSpaces
do metody .
Dodaj następującą metodę do pliku testowego:
[TestMethod] public void TestHasEmbeddedSpaces() { // Tests that we expect to return true. string[] phrases = { "one car", "Name\u0009Description", "Line1\nLine2", "Line3\u000ALine4", "Line5\u000BLine6", "Line7\u000CLine8", "Line0009\u000DLine10", "word1\u00A0word2" }; foreach (var phrase in phrases) { bool result = phrase.HasEmbeddedSpaces(); Assert.IsTrue(result, $"Expected for '{phrase}': true; Actual: {result}"); } }
Po wykonaniu testu funkcja Live Unit Testing wskazuje, że
TestHasEmbeddedSpaces
metoda nie powiodła się, jak pokazano na poniższej ilustracji:Wybierz okno z wyświetlonym kodem biblioteki. Funkcja Live Unit Testing rozszerzyła pokrycie kodu do
HasEmbeddedSpaces
metody . Raportuje również niepowodzenie testu przez dodanie czerwonego "🞩" do wierszy objętych testami zakończonymi niepowodzeniem.Umieść kursor nad wierszem z podpisem
HasEmbeddedSpaces
metody. Funkcja Live Unit Testing wyświetla etykietkę narzędzia, która zgłasza, że metoda jest objęta jednym testem, jak pokazano na poniższej ilustracji:Wybierz test TestHasEmbeddedSpaces, który zakończył się niepowodzeniem. Funkcja Live Unit Testing udostępnia kilka opcji, takich jak uruchamianie wszystkich testów i debugowanie wszystkich testów, jak pokazano na poniższej ilustracji:
Wybierz pozycję Debuguj wszystko , aby debugować test, który zakończył się niepowodzeniem.
Program Visual Studio wykonuje test w trybie debugowania.
Test przypisuje każdy ciąg w tablicy do zmiennej o nazwie
phrase
i przekazuje go doHasEmbeddedSpaces
metody . Wykonywanie programu wstrzymuje się i wywołuje debuger przy pierwszym wyrażeniu asercyjnym .false
Okno dialogowe wyjątku, które wynika z nieoczekiwanej wartości wywołaniaMicrosoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue
metody, jest pokazane na poniższej ilustracji.Ponadto wszystkie narzędzia debugowania udostępniane przez program Visual Studio są dostępne, aby ułatwić nam rozwiązywanie problemów z testem, który zakończył się niepowodzeniem, jak pokazano na poniższej ilustracji:
Zwróć uwagę, że w oknie Autos wartość
phrase
zmiennej to "Name\tDescription", który jest drugim elementem tablicy. Metoda testowaHasEmbeddedSpaces
oczekuje zwróceniatrue
, gdy zostanie przekazany ten ciąg. Zamiast tego zwraca wartośćfalse
. Oczywiście nie rozpoznaje znaku "\t", znaku tabulatora jako osadzonego miejsca.Wybierz pozycję Debuguj>kontynuuj, naciśnij F5 lub kliknij przycisk Kontynuuj na pasku narzędzi, aby kontynuować wykonywanie programu testowego. Ponieważ wystąpił nieobsługiwany wyjątek, test kończy się. Zapewnia to wystarczającą ilość informacji na potrzeby wstępnego badania błędu. Albo
TestHasEmbeddedSpaces
(rutyna testowa) dokonała nieprawidłowego założenia lubHasEmbeddedSpaces
nie rozpoznaje poprawnie wszystkich osadzonych spacji.Aby zdiagnozować i rozwiązać problem, zacznij od
StringLibrary.HasEmbeddedSpaces
metody . Przyjrzyj się porównaniu w metodzieHasEmbeddedSpaces
. Uważa, że osadzona przestrzeń ma być U+0020. Jednak standard Unicode zawiera wiele innych znaków spacji. Sugeruje to, że kod biblioteki został nieprawidłowo przetestowany pod kątem znaku odstępu.Zastąp porównanie równości wywołaniem System.Char.IsWhiteSpace metody :
if (Char.IsWhiteSpace(ch))
Testy jednostkowe na żywo automatycznie ponownie uruchamiają metodę testu, która zakończyła się niepowodzeniem.
Funkcja Live Unit Testing wyświetla zaktualizowane wyniki, które są również wyświetlane w oknie edytora kodu.