Udostępnij za pośrednictwem


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.

Wymagania wstępne

Tworzenie projektu testu jednostkowego

Testy jednostkowe zapewniają zautomatyzowane testowanie oprogramowania podczas opracowywania i publikowania. Struktura testowania używana w tym samouczku to MSTest. MSTest to jedna z trzech platform testowych, z których można wybrać. Pozostałe to xUnit i nUnit.

  1. Uruchom program Visual Studio Code.

  2. ClassLibraryProjects Otwórz rozwiązanie utworzone w temacie Tworzenie biblioteki klas platformy .NET przy użyciu programu Visual Studio Code.

  3. Utwórz projekt testu jednostkowego o nazwie "StringLibraryTest".

    dotnet new mstest -o StringLibraryTest
    

    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:

    Każda metoda oznaczona tagiem [TestMethod] w klasie testowej oznaczonej tagiem [TestClass] jest uruchamiana automatycznie po wywołaniu testu jednostkowego.

  4. Dodaj projekt testowy do rozwiązania.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

Dodawanie odwołania do projektu

Aby projekt testowy działał z klasą StringLibrary , dodaj odwołanie w projekcie StringLibraryTestStringLibrary do projektu.

  1. Uruchom następujące polecenie:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

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 oznaczonym 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łuje elementy członkowskie Assert klasy. 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 Assert najczęściej nazywanych metodami klasy przedstawiono w poniższej tabeli:

Metody asertywne Function
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 to false. Asercja kończy się niepowodzeniem, jeśli warunek to true.
Assert.IsNotNull Sprawdza, czy obiekt nie nulljest . Asercja kończy się niepowodzeniem, jeśli obiekt ma wartość null.

Możesz również użyć Assert.ThrowsException metody w metodzie testowej, aby wskazać typ wyjątku, który powinien zostać zgłoszony. Test kończy się niepowodzeniem, jeśli określony wyjątek nie zostanie zgłoszony.

Podczas testowania StringLibrary.StartsWithUpper metody chcesz podać wiele ciągów, które zaczynają się od znaku wielkiej litery. Oczekujesz, że metoda zwróci true się 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 się 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 null ciąg. Pusty ciąg to taki, który nie ma znaków i którego Length ma wartość 0. Ciąg null to ciąg, który nie został zainicjowany. Możesz wywołać StartsWithUpper metodę statyczną bezpośrednio i przekazać pojedynczy String argument. Możesz też wywołać StartsWithUpper metodę rozszerzenia dla zmiennej przypisanej string do nullmetody .

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, które umożliwia określenie komunikatu o błędzie, który ma być wyświetlany w przypadku niepowodzenia testu. Komunikat identyfikuje ciąg, który spowodował błąd.

Aby utworzyć metody testowe:

  1. Otwórz plik 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 TestStartsWithUpper metodzie zawiera literę wielkiej litery greckiej alfa (U+0391) i cyrylica wielka litera EM (U+041C). Test małych liter w metodzie TestDoesNotStartWithUpper zawiera małą literę alfa (U+03B1) i małą literę Cyrylica Ghe (U+0433).

  2. Zapisz zmiany.

  3. Uruchom testy:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Dane wyjściowe terminalu pokazują, że wszystkie testy zostały pomyślnie wykonane.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
    
    Passed!  - Failed:     0, Passed:     3, Skipped:     0, Total:     3, Duration: 3 ms - StringLibraryTest.dll (net8.0)
    

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.

  1. Zmodyfikuj tablicę words w metodzie TestDoesNotStartWithUpper , aby uwzględnić ciąg "Błąd".

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Uruchom testy:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Dane wyjściowe terminalu pokazują, że jeden 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 nie zostały przetestowane żadne ciągi w tablicy po przetestowaniu błędu.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
      Failed TestDoesNotStartWithUpper [28 ms]
      Error Message:
       Assert.IsFalse failed. Expected for 'Error': false; Actual: True
      Stack Trace:
         at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33
    
    Failed!  - Failed:     1, Passed:     2, Skipped:     0, Total:     3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
    
  3. Usuń ciąg "Błąd", który został dodany w kroku 1. Uruchom ponownie test i testy przejdą.

Testowanie wersji biblioteki

Teraz, gdy wszystkie testy zostały wykonane podczas uruchamiania kompilacji debugowania biblioteki, uruchom testy dodatkowego czasu względem kompilacji wydania biblioteki. Wiele czynników, w tym optymalizacji kompilatora, może czasami generować różne zachowanie między kompilacjami debugowania i wydania.

  1. Uruchom testy z konfiguracją kompilacji wydania:

    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 artykule Debugowanie aplikacji konsolowej .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 plik StringLibraryTest/UnitTest1.cs i wybierz pozycję Debuguj wszystkie testy między wierszami 7 i 8. Jeśli nie możesz go znaleźć, naciśnij klawisze Ctrl+Shift+P, aby otworzyć paletę poleceń i wprowadzić polecenie Załaduj ponownie 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 przetestowano bibliotekę klas. Bibliotekę można udostępnić innym osobom, publikując ją w pakiecie 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#:

W tym samouczku pokazano, jak zautomatyzować testowanie jednostkowe przez dodanie projektu testowego do rozwiązania.

Wymagania wstępne

Tworzenie projektu testu jednostkowego

Testy jednostkowe zapewniają zautomatyzowane testowanie oprogramowania podczas opracowywania i publikowania. Struktura testowania używana w tym samouczku to MSTest. MSTest to jedna z trzech platform testowych, z których można wybrać. Pozostałe to xUnit i nUnit.

  1. Uruchom program Visual Studio Code.

  2. ClassLibraryProjects Otwórz rozwiązanie utworzone w temacie Tworzenie biblioteki klas platformy .NET przy użyciu programu Visual Studio Code.

  3. Utwórz projekt testu jednostkowego o nazwie "StringLibraryTest".

    dotnet new mstest -o StringLibraryTest
    

    Szablon projektu tworzy plik UnitTest1.cs z następującym kodem:

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    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:

    Każda metoda oznaczona tagiem [TestMethod] w klasie testowej oznaczonej tagiem [TestClass] jest uruchamiana automatycznie po wywołaniu testu jednostkowego.

  4. Dodaj projekt testowy do rozwiązania.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

Dodawanie odwołania do projektu

Aby projekt testowy działał z klasą StringLibrary , dodaj odwołanie w projekcie StringLibraryTestStringLibrary do projektu.

  1. Uruchom następujące polecenie:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

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 oznaczonym 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łuje elementy członkowskie Assert klasy. 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 Assert najczęściej nazywanych metodami klasy przedstawiono w poniższej tabeli:

Metody asertywne Function
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 to false. Asercja kończy się niepowodzeniem, jeśli warunek to true.
Assert.IsNotNull Sprawdza, czy obiekt nie nulljest . Asercja kończy się niepowodzeniem, jeśli obiekt ma wartość null.

Możesz również użyć Assert.ThrowsException metody w metodzie testowej, aby wskazać typ wyjątku, który powinien zostać zgłoszony. Test kończy się niepowodzeniem, jeśli określony wyjątek nie zostanie zgłoszony.

Podczas testowania StringLibrary.StartsWithUpper metody chcesz podać wiele ciągów, które zaczynają się od znaku wielkiej litery. Oczekujesz, że metoda zwróci true się 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 się 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 null ciąg. Pusty ciąg to taki, który nie ma znaków i którego Length ma wartość 0. Ciąg null to ciąg, który nie został zainicjowany. Możesz wywołać StartsWithUpper metodę statyczną bezpośrednio i przekazać pojedynczy String argument. Możesz też wywołać StartsWithUpper metodę rozszerzenia dla zmiennej przypisanej string do nullmetody .

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, które umożliwia określenie komunikatu o błędzie, który ma być wyświetlany w przypadku niepowodzenia testu. Komunikat identyfikuje ciąg, który spowodował błąd.

Aby utworzyć metody testowe:

  1. Otwórz plik 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 TestStartsWithUpper metodzie zawiera literę wielkiej litery greckiej alfa (U+0391) i cyrylica wielka litera EM (U+041C). Test małych liter w metodzie TestDoesNotStartWithUpper zawiera małą literę alfa (U+03B1) i małą literę Cyrylica Ghe (U+0433).

  2. Zapisz zmiany.

  3. Uruchom testy:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Dane wyjściowe terminalu pokazują, że wszystkie testy zostały pomyślnie wykonane.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
    
    Passed!  - Failed:     0, Passed:     3, Skipped:     0, Total:     3, Duration: 3 ms - StringLibraryTest.dll (net7.0)
    

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.

  1. Zmodyfikuj tablicę words w metodzie TestDoesNotStartWithUpper , aby uwzględnić ciąg "Błąd".

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Uruchom testy:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Dane wyjściowe terminalu pokazują, że jeden 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 nie zostały przetestowane żadne ciągi w tablicy po przetestowaniu błędu.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
      Failed TestDoesNotStartWithUpper [28 ms]
      Error Message:
       Assert.IsFalse failed. Expected for 'Error': false; Actual: True
      Stack Trace:
         at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33
    
    Failed!  - Failed:     1, Passed:     2, Skipped:     0, Total:     3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
    
  3. Usuń ciąg "Błąd", który został dodany w kroku 1. Uruchom ponownie test i testy przejdą.

Testowanie wersji biblioteki

Teraz, gdy wszystkie testy zostały wykonane podczas uruchamiania kompilacji debugowania biblioteki, uruchom testy dodatkowego czasu względem kompilacji wydania biblioteki. Wiele czynników, w tym optymalizacji kompilatora, może czasami generować różne zachowanie między kompilacjami debugowania i wydania.

  1. Uruchom testy z konfiguracją kompilacji wydania:

    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 artykule Debugowanie aplikacji konsolowej .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 plik StringLibraryTest/UnitTest1.cs i wybierz pozycję Debuguj wszystkie testy między wierszami 7 i 8. Jeśli nie możesz go znaleźć, naciśnij klawisze Ctrl+Shift+P, aby otworzyć paletę poleceń i wprowadzić polecenie Załaduj ponownie 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 przetestowano bibliotekę klas. Bibliotekę można udostępnić innym osobom, publikując ją w pakiecie 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:

W tym samouczku pokazano, jak zautomatyzować testowanie jednostkowe przez dodanie projektu testowego do rozwiązania.

Wymagania wstępne

Tworzenie projektu testu jednostkowego

Testy jednostkowe zapewniają zautomatyzowane testowanie oprogramowania podczas opracowywania i publikowania. Struktura testowania używana w tym samouczku to MSTest. MSTest to jedna z trzech platform testowych, z których można wybrać. Pozostałe to xUnit i nUnit.

  1. Uruchom program Visual Studio Code.

  2. ClassLibraryProjects Otwórz rozwiązanie utworzone w temacie Tworzenie biblioteki klas platformy .NET przy użyciu programu Visual Studio Code.

  3. Utwórz projekt testu jednostkowego o nazwie "StringLibraryTest".

    dotnet new mstest -f net6.0 -o StringLibraryTest
    

    Polecenie -f net6.0 zmienia domyślną strukturę docelową na net6.0 wersję.

    Polecenie -o or --output określa lokalizację do umieszczenia wygenerowanych danych wyjściowych.

    Szablon projektu tworzy plik UnitTest1.cs z następującym kodem:

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    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:

    Każda metoda oznaczona tagiem [TestMethod] w klasie testowej oznaczonej tagiem [TestClass] jest uruchamiana automatycznie po wywołaniu testu jednostkowego.

  4. Dodaj projekt testowy do rozwiązania.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

Dodawanie odwołania do projektu

Aby projekt testowy działał z klasą StringLibrary , dodaj odwołanie w projekcie StringLibraryTestStringLibrary do projektu.

  1. Uruchom następujące polecenie:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

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 oznaczonym 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łuje elementy członkowskie Assert klasy. 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 Assert najczęściej nazywanych metodami klasy przedstawiono w poniższej tabeli:

Metody asertywne Function
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 to false. Asercja kończy się niepowodzeniem, jeśli warunek to true.
Assert.IsNotNull Sprawdza, czy obiekt nie nulljest . Asercja kończy się niepowodzeniem, jeśli obiekt ma wartość null.

Możesz również użyć Assert.ThrowsException metody w metodzie testowej, aby wskazać typ wyjątku, który powinien zostać zgłoszony. Test kończy się niepowodzeniem, jeśli określony wyjątek nie zostanie zgłoszony.

Podczas testowania StringLibrary.StartsWithUpper metody chcesz podać wiele ciągów, które zaczynają się od znaku wielkiej litery. Oczekujesz, że metoda zwróci true się 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 się 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 null ciąg. Pusty ciąg to taki, który nie ma znaków i którego Length ma wartość 0. Ciąg null to ciąg, który nie został zainicjowany. Możesz wywołać StartsWithUpper metodę statyczną bezpośrednio i przekazać pojedynczy String argument. Możesz też wywołać StartsWithUpper metodę rozszerzenia dla zmiennej przypisanej string do nullmetody .

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, które umożliwia określenie komunikatu o błędzie, który ma być wyświetlany w przypadku niepowodzenia testu. Komunikat identyfikuje ciąg, który spowodował błąd.

Aby utworzyć metody testowe:

  1. Otwórz plik 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 TestStartsWithUpper metodzie zawiera literę wielkiej litery greckiej alfa (U+0391) i cyrylica wielka litera EM (U+041C). Test małych liter w metodzie TestDoesNotStartWithUpper zawiera małą literę alfa (U+03B1) i małą literę Cyrylica Ghe (U+0433).

  2. Zapisz zmiany.

  3. Uruchom testy:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Dane wyjściowe terminalu pokazują, że wszystkie testy zostały pomyślnie wykonane.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
    
    Passed!  - Failed:     0, Passed:     3, Skipped:     0, Total:     3, Duration: 3 ms - StringLibraryTest.dll (net6.0)
    

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.

  1. Zmodyfikuj tablicę words w metodzie TestDoesNotStartWithUpper , aby uwzględnić ciąg "Błąd".

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Uruchom testy:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Dane wyjściowe terminalu pokazują, że jeden 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 nie zostały przetestowane żadne ciągi w tablicy po przetestowaniu błędu.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
      Failed TestDoesNotStartWithUpper [28 ms]
      Error Message:
       Assert.IsFalse failed. Expected for 'Error': false; Actual: True
      Stack Trace:
         at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33
    
    Failed!  - Failed:     1, Passed:     2, Skipped:     0, Total:     3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
    
  3. Usuń ciąg "Błąd", który został dodany w kroku 1. Uruchom ponownie test i testy przejdą.

Testowanie wersji biblioteki

Teraz, gdy wszystkie testy zostały wykonane podczas uruchamiania kompilacji debugowania biblioteki, uruchom testy dodatkowego czasu względem kompilacji wydania biblioteki. Wiele czynników, w tym optymalizacji kompilatora, może czasami generować różne zachowanie między kompilacjami debugowania i wydania.

  1. Uruchom testy z konfiguracją kompilacji wydania:

    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 artykule Debugowanie aplikacji konsolowej .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 plik StringLibraryTest/UnitTest1.cs i wybierz pozycję Debuguj wszystkie testy między wierszami 7 i 8. Jeśli nie możesz go znaleźć, naciśnij klawisze Ctrl+Shift+P, aby otworzyć paletę poleceń i wprowadzić polecenie Załaduj ponownie 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 przetestowano bibliotekę klas. Bibliotekę można udostępnić innym osobom, publikując ją w pakiecie 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: