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:

  1. Wybierz pozycję Plik>nowy>projekt z menu programu Visual Studio najwyższego poziomu.

  2. Wpisz rozwiązanie w polu wyszukiwania szablonu, a następnie wybierz szablon Puste rozwiązanie . Nadaj projektowi nazwę UtilityLibraries.

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

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy rozwiązanie UtilityLibraries i wybierz pozycję Dodaj>nowy projekt.

  2. Wpisz bibliotekę klas w polu wyszukiwania szablonu, a następnie wybierz szablon Biblioteka klas przeznaczony dla platformy .NET lub .NET Standard. Kliknij przycisk Dalej.

  3. Nadaj projektowi nazwę StringLibrary.

  4. Kliknij przycisk Utwórz , aby utworzyć projekt.

  5. 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 Zwraca true wartość , jeśli ciąg zaczyna się od wielkiej litery; w przeciwnym razie zwraca wartość false.

    • StartsWithLowerZwraca true wartość , jeśli ciąg rozpoczyna się od małego znaku; w przeciwnym razie zwraca wartość false.

    • HasEmbeddedSpaces Zwraca true wartość , jeśli ciąg zawiera osadzony znak odstępu; w przeciwnym razie zwraca wartość false.

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

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy rozwiązanie UtilityLibraries i wybierz pozycję Dodaj>nowy projekt.

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

  3. Nadaj projektowi nazwę StringLibraryTests i kliknij przycisk Dalej.

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

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

    The Reference Manager dialog

    The Reference Manager dialog

  6. 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}");
                }
            }
        }
    }
    
  7. 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.

  8. Wybierz przycisk Zapisz przy użyciu innego kodowania .

    Choose a file encoding

    Choose a file encoding

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

    Choosing the UTF-8 encoding

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

  1. Opcjonalnie wybierz okno edytora kodu zawierające kod stringLibrary. Jest to klasa 1.cs dla projektu 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).

  2. Wybierz pozycję Testuj testy>jednostkowe>na żywo Rozpocznij z menu programu Visual Studio najwyższego poziomu.

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

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

  2. Program Visual Studio ponownie skompiluje projekt i uruchomi test jednostkowy na żywo, który automatycznie uruchamia wszystkie testy.

  1. 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ę "➖").

The Live Test Explorer and code editor window after starting Live Unit testing

The Live Test Explorer and code editor window after starting Live Unit testing

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:

  1. Kliknij zielony znacznik wyboru w wierszu, który odczytuje if (String.IsNullOrWhiteSpace(s)) w metodzie StartsWithUpper . 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.

    Code coverage for the if conditional statement

    Code coverage for the if conditional statement

  2. Kliknij zielony znacznik wyboru w wierszu, który odczytuje return Char.IsUpper(s[0]) w metodzie StartsWithUpper . 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.

    Code coverage for the return statement

    Code coverage for the return statement

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:

  1. Dodaj następujące TestStartsWithLower metody i TestDoesNotStartWithLower 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}");
        }
    }
    
  2. Zmodyfikuj metodę DirectCallWithNullOrEmpty , dodając następujący kod bezpośrednio po wywołaniu Microsoft.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}");
    
  3. 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.

    The Live Test Explorer after expanding test coverage

    The Live Test Explorer after expanding test coverage

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

    Code coverage for the StartsWithLower method

    Code coverage for the StartsWithLower method

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 .

  1. 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}");
        }
    }
    
  2. Po wykonaniu testu funkcja Live Unit Testing wskazuje, że TestHasEmbeddedSpaces metoda nie powiodła się, jak pokazano na poniższej ilustracji:

    The Live Test Explorer reporting a failed test

    The Live Test Explorer reporting a failed test

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

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

    Live Unit Testing information on a failed test

    Live Unit Testing information on a failed test

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

    Live Unit Testing options for a failed test

    Live Unit Testing options for a failed test

  6. Wybierz pozycję Debuguj wszystko , aby debugować test, który zakończył się niepowodzeniem.

  7. Program Visual Studio wykonuje test w trybie debugowania.

    Test przypisuje każdy ciąg w tablicy do zmiennej o nazwie phrase i przekazuje go do HasEmbeddedSpaces 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łania Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue metody, jest pokazane na poniższej ilustracji.

    Live Unit Testing exception dialog

    Live Unit Testing exception dialog

    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:

    Visual Studio debugging tools

    Visual Studio debugging tools

    Zwróć uwagę, że w oknie Autos wartość phrase zmiennej to "Name\tDescription", który jest drugim elementem tablicy. Metoda testowa HasEmbeddedSpaces oczekuje zwrócenia true , gdy zostanie przekazany ten ciąg. Zamiast tego zwraca wartość false. Oczywiście nie rozpoznaje znaku "\t", znaku tabulatora jako osadzonego miejsca.

  8. Wybierz pozycję Debuguj>kontynuuj, naciśnij klawisz 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 lub HasEmbeddedSpaces nie rozpoznaje poprawnie wszystkich osadzonych spacji.

  9. Aby zdiagnozować i rozwiązać problem, zacznij od StringLibrary.HasEmbeddedSpaces metody . Przyjrzyj się porównaniu w metodzie HasEmbeddedSpaces . 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.

  10. Zastąp porównanie równości wywołaniem System.Char.IsWhiteSpace metody :

    if (Char.IsWhiteSpace(ch))
    
  11. 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.