Sdílet prostřednictvím


Kurz: Testování knihovny tříd .NET

V tomto kurzu se dozvíte, jak automatizovat testování jednotek přidáním testovacího projektu do řešení.

Předpoklady

Tento kurz funguje s řešením, které vytvoříte v Vytvoření knihovny tříd .NET.

Vytvoření projektu testování jednotek

Testy jednotek poskytují automatizované testování softwaru během vývoje a publikování. MSTest je jednou ze tří testovacích architektur, ze které si můžete vybrat. Ostatní jsou xUnit a nUnit.

  1. Spusťte Visual Studio.

  2. Otevřete řešení ClassLibraryProjects, které jste vytvořili v Vytvoření knihovny tříd .NET.

  3. Do řešení přidejte nový projekt testu jednotek s názvem StringLibraryTest.

    1. Klikněte pravým tlačítkem na řešení v Solution Explorer a vyberte Přidat>Nový projekt.

    2. Na stránce Přidat nový projekt zadejte do vyhledávacího pole mstest. V seznamu Jazyků zvolte C# nebo Visual Basic a pak v seznamu Platformy zvolte Všechny platformy.

    3. Zvolte šablonu MSTest Test Project a pak zvolte Další.

    4. Na stránce Konfigurace nového projektu zadejte StringLibraryTest do pole Název projektu. Pak zvolte Další.

    5. Na stránce Přidatné informace vyberte .NET 10 v poli Framework, Vyberte Microsoft.Testing.Platform pro Test runner a pak zvolte Create.

    Zadejte další informace pro projekt MSTest Test.

  4. Visual Studio vytvoří projekt a otevře soubor třídy v okně kódu s následujícím kódem. Pokud se jazyk, který chcete použít, nezobrazuje, změňte výběr jazyka v horní části stránky.

    namespace StringLibraryTest
    {
    
        [TestClass]
        public sealed class Test1
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class Test1
            <TestMethod>
            Sub TestSub()
    
            End Sub
        End Class
    End Namespace
    

    Zdrojový kód vytvořený šablonou jednotkového testu provede následující:

    Každá metoda označená [TestMethod] v testovací třídě označené [TestClass] se automaticky spustí při spuštění jednotkového testu.

  1. Spusťte Visual Studio Code.

  2. Otevřete řešení ClassLibraryProjects, které jste vytvořili v Vytvoření knihovny tříd .NET.

  3. V Solution Explorer vyberte Nový projekt nebo v paletě příkazů vyberte .NET: Nový projekt.

  4. Vyberte projekt MSTest Test, pojmenujte ho StringLibraryTest, vyberte výchozí adresář a vyberte Vytvořit projekt.

    Šablona projektu vytvoří StringLibraryTest/Test1.cs s následujícím kódem:

    namespace StringLibraryTest;
    
    [TestClass]
    public class Test1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    

    Zdrojový kód vytvořený šablonou jednotkového testu provede následující:

    Každá metoda označená metodou [TestMethod] v testovací třídě označené pomocí třídy [TestClass] se spustí automaticky při vyvolání testu jednotek.

  1. Otevřete terminál a přejděte do složky tutorials obsahující projekty StringLibrary a ShowCase.

  2. Vytvořte nový testovací projekt MSTest:

    dotnet new mstest -n StringLibraryTest
    

    Šablona projektu vytvoří StringLibraryTest/Test1.cs s následujícím kódem:

    namespace StringLibraryTest;
    
    [TestClass]
    public class Test1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    

    Zdrojový kód vytvořený šablonou jednotkového testu provede následující:

    Každá metoda označená metodou [TestMethod] v testovací třídě označené pomocí třídy [TestClass] se spustí automaticky při vyvolání testu jednotek.

Přidání odkazu na projekt

Aby testovací projekt fungoval s třídou StringLibrary, přidejte do projektu StringLibraryTest odkaz na projekt StringLibrary.

  1. V Solution Explorer klikněte pravým tlačítkem myši na uzel Dependencies projektu StringLibraryTest a v místní nabídce vyberte Přidat odkaz na projekt.

  2. V dialogovém okně Správce odkazů vyberte pole vedle stringLibrary.

    Přidejte StringLibrary jako odkaz na projekt pro StringLibraryTest.

  3. Vyberte OK.

  1. V Solution Explorer klikněte pravým tlačítkem na projekt StringLibraryTest a vyberte Přidat referenční informace o projektu.

  2. Vyberte StringLibrary.

  1. Přejděte do složky StringLibraryTest a přidejte odkaz na projekt:

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

Přidání a spuštění metod testování jednotek

Když se spustí test jednotek, každá metoda označená atributem TestMethodAttribute ve třídě označené atributem TestClassAttribute se spustí automaticky. Testovací metoda skončí, když se najde první selhání nebo když všechny testy obsažené v metodě proběhnou úspěšně.

Nejběžnější testy volají na členy třídy Assert. Mnoho metod assert zahrnuje alespoň dva parametry, jeden z nich je očekávaný výsledek testu a druhý z nich je skutečný výsledek testu. Některé z nejčastěji volaných metod třídy Assert jsou uvedeny v následující tabulce:

Metody Assert Funkce
Assert.AreEqual Ověřuje, že jsou dvě hodnoty nebo objekty stejné. Aserce selže, pokud se hodnoty nebo objekty nerovnají.
Assert.AreSame Ověřuje, že dvě proměnné objektu odkazují na stejný objekt. Asert selže, pokud proměnné odkazují na různé objekty.
Assert.IsFalse Ověřuje, že podmínka je false. Výraz assert selhává, pokud je podmínka truesplněna.
Assert.IsNotNull Ověřuje, že objekt není null. Assert selže, pokud je objekt null.

Můžete také použít metodu Assert.Throws v testovací metodě k označení typu výjimky, kterou má vyvolat. Test selže, pokud není vyvolána zadaná výjimka.

Při testování StringLibrary.StartsWithUpper metody chcete zadat řadu řetězců, které začínají velkými písmeny. Očekáváte, že metoda vrátí true v těchto případech, takže můžete volat metodu Assert.IsTrue. Podobně chcete zadat několik řetězců, které začínají něčím jiného než velkým písmenem. Očekáváte, že metoda vrátí false v těchto případech, takže můžete volat metodu Assert.IsFalse.

Vzhledem k tomu, že vaše metoda knihovny zpracovává řetězce, chcete se také ujistit, že úspěšně zpracovává prázdný řetězec (String.Empty) a null řetězec. Prázdný řetězec je řetězec, který nemá žádné znaky a jehož Length je 0. Řetězec null je řetězec, který nebyl inicializován. Můžete volat StartsWithUpper přímo jako statickou metodu a předat jeden String argument. Nebo můžete volat StartsWithUpper jako rozšiřující metodu pro proměnnou přiřazenou stringnull.

Definujete tři metody, z nichž každá volá metodu Assert pro každý prvek v řetězcovém poli. Zavoláte přetížení metody, které vám umožní zadat chybovou zprávu, která se zobrazí v případě selhání testu. Zpráva identifikuje řetězec, který způsobil selhání.

Vytvoření testovacích metod:

  1. V okně kódu Test1.cs nebo Test1.vb nahraďte kód následujícím kódem:

    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public sealed class Test1
        {
            [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>"}': false; Actual: {result}");
                }
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    Imports UtilityLibraries
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Public Sub TestStartsWithUpper()
                ' Tests that we expect to return true.
                Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsTrue(result,
                           $"Expected for '{word}': true; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub TestDoesNotStartWithUpper()
                ' Tests that we expect to return false.
                Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " "}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsFalse(result,
                           $"Expected for '{word}': false; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub DirectCallWithNullOrEmpty()
                ' Tests that we expect to return false.
                Dim words() As String = {String.Empty, Nothing}
                For Each word In words
                    Dim result As Boolean = StringLibrary.StartsWithUpper(word)
                    Assert.IsFalse(result,
                           $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}")
                Next
            End Sub
        End Class
    End Namespace
    

    Test velkých písmen v metodě TestStartsWithUpper obsahuje řecké velké písmeno alfa (U+0391) a velké písmeno cyrilice EM (U+041C). Test malých písmen v metodě TestDoesNotStartWithUpper obsahuje řecké malé písmeno alfa (U+03B1) a cyrilské malé písmeno Ghe (U+0433).

  2. Na liště nabídky vyberte Soubor>Uložit Test1.cs jako nebo Soubor>Uložit Test1.vb jako. V dialogovém okně Uložit soubor jako vyberte šipku vedle tlačítka Uložit a vyberte Uložit s kódováním.

  3. V dialogovém okně Potvrdit uložit jako vyberte tlačítko Ano a soubor uložte.

  4. V dialogovém okně Rozšířené možnosti uložení vyberte Unicode (UTF-8 s podpisem) – kódová stránka 65001 z rozevíracího seznamu Kódování a vyberte OK.

    Pokud zdrojový kód neuložíte jako soubor s kódováním UTF8, Visual Studio ho může uložit jako soubor ASCII. V takovém případě modul runtime přesně nekóduje znaky UTF8 mimo rozsah ASCII a výsledky testu nejsou správné.

  5. V nabídce vyberte Test>Spustit všechny testy. Pokud se okno průzkumníka testů neotevře, otevřete ho tak, že zvolíte Test>Průzkumníka testů. Tři testy jsou uvedeny v sekci Úspěšné testy a sekce Souhrn hlásí výsledek spuštění testu.

    okno Průzkumníka testů s úspěšnými testy

  1. Otevřete StringLibraryTest/Test1.cs a nahraďte veškerý kód následujícím kódem.

    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public sealed class Test1
        {
            [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>"}': false; Actual: {result}");
                }
            }
        }
    }
    

    Test velkých písmen v metodě TestStartsWithUpper obsahuje řecké velké písmeno alfa (U+0391) a velké písmeno cyrilice EM (U+041C). Test malých písmen v metodě TestDoesNotStartWithUpper obsahuje řecké malé písmeno alfa (U+03B1) a cyrilské malé písmeno Ghe (U+0433).

  2. Uložte provedené změny.

Sestavení a spuštění testů

  1. V Solution Explorer klikněte pravým tlačítkem na řešení a vyberte Build nebo z palety příkazů vyberte .NET: Sestavení.

  2. Vyberte okno Testování , vyberte Spustit testy nebo z palety příkazů vyberte Test: Spustit všechny testy.

    Visual Studio Code Průzkumník testů

  1. Otevřete StringLibraryTest/Test1.cs a nahraďte veškerý kód následujícím kódem:

    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public sealed class Test1
        {
            [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>"}': false; Actual: {result}");
                }
            }
        }
    }
    

    Test velkých písmen v metodě TestStartsWithUpper obsahuje řecké velké písmeno alfa (U+0391) a velké písmeno cyrilice EM (U+041C). Test malých písmen v metodě TestDoesNotStartWithUpper obsahuje řecké malé písmeno alfa (U+03B1) a cyrilské malé písmeno Ghe (U+0433).

  2. Uložte změny a spusťte testy:

    dotnet test
    

    Testy by měly proběhnout.

Řešení selhání testů

Pokud provádíte vývoj řízený testy (TDD), nejdřív napíšete testy a při prvním spuštění selžou. Pak do aplikace přidáte kód, díky kterému test projde. Pro účely tohoto kurzu jste vytvořili test po napsání kódu aplikace, který má ověřit, takže jste neviděli, že by test selhal. Pokud chcete ověřit, že test selže, když očekáváte, že selže, přidejte do vstupu testu neplatnou hodnotu.

  1. Upravte pole words v metodě TestDoesNotStartWithUpper tak, aby zahrnoval řetězec Error.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  1. Spusťte test výběrem možnosti Test>Spustit všechny testy z menu. Okno Průzkumníka testů značí, že dva testy byly úspěšné a jedna selhala.

    okno Průzkumníka testů s neúspěšnými testy

  2. Vyberte neúspěšný test, TestDoesNotStartWith.

    Okno Průzkumníka testů zobrazí zprávu vytvořenou výrazem: "Assert.IsFalse selhal." Očekávalo se pro 'Error': false; skutečnost: true. Kvůli chybě se řetězce v poli za 'Error' neotestovaly.

    Okno Test Explorer zobrazuje selhání tvrzení IsFalse

  1. Testy spusťte kliknutím na zelenou chybu vedle testu v editoru.

    Výstup ukazuje, že test selže a zobrazí chybovou zprávu pro neúspěšný test: Assert.IsFalse selhal. Očekáváno pro 'Chyba': false; skutečná hodnota: true". Kvůli selhání nebyly v poli testovány žádné řetězce za "Error".

    Neúspěšný test Visual Studio Code

  1. Spusťte testy:

    dotnet test
    

    Výstup ukazuje, že test selže a zobrazí chybovou zprávu pro neúspěšný test: Assert.IsFalse selhal. Očekáváno pro 'Chyba': false; skutečná hodnota: true". Kvůli selhání nebyly v poli testovány žádné řetězce za "Error".

  1. Odeberte řetězec Chyba, který jste přidali.

  2. Znovu spusťte test a testy projdou.

Testování verze knihovny

Nyní, když byly všechny testy úspěšně provedeny při spuštění Debug sestavení knihovny, spusťte testy ještě jednou proti Release sestavení knihovny. Řada faktorů, včetně optimalizací kompilátoru, může někdy způsobit jiné chování mezi sestaveními Debug a Release.

Otestování vydané sestavy:

  1. Na panelu nástrojů Visual Studio změňte konfiguraci sestavení z Debug na Release.

  2. V Solution Explorer klikněte pravým tlačítkem na projekt StringLibrary a v místní nabídce vyberte Build a knihovnu znovu zkompilujte.

  3. Testy jednotek spusťte tak, že v nabídce zvolíte Test>Spustit všechny testy. Testy jsou úspěšné.

Spusťte testy s konfigurací sestavení Release.

dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release

Testy jsou úspěšné.

Spusťte testy s konfigurací sestavení Release.

dotnet test --configuration Release

Testy jsou úspěšné.

Ladění testů

Pokud jako integrované vývojové prostředí používáte Visual Studio, můžete použít stejný postup uvedený v Tutorial: Ladění konzolové aplikace .NET k ladění kódu pomocí projektu testování jednotek. Místo spuštění projektu aplikace ShowCase klikněte pravým tlačítkem na projekt StringLibraryTests a v místní nabídce vyberte Ladění testů.

Visual Studio spustí testovací projekt s připojeným ladicím programem. Provádění se zastaví na kterémkoli bodě přerušení, který jste přidali do testovacího projektu nebo základní knihovny kódu.

Pokud jako integrované vývojové prostředí používáte Visual Studio Code, můžete použít stejný postup uvedený v Debug konzolové aplikace .NET k ladění kódu pomocí projektu testování jednotek. Místo spuštění projektu aplikace ShowCase otevřete StringLibraryTest/Test1.cs a vyberte Ladicí testy v aktuálním souboru mezi řádky 7 a 8. Pokud ho nemůžete najít, otevřete stisknutím kombinace kláves Ctrl+Shift+P paletu příkazů a zadejte Znovu načíst okno.

Visual Studio Code spustí testovací projekt s připojeným ladicím programem. Provádění programu se zastaví na libovolné zarážce, kterou jste přidali do testovacího projektu nebo knihovního kódu.

Dodatečné zdroje

Úklid zdrojů

GitHub automaticky odstraní váš Codespace po 30 dnech nečinnosti. Pokud plánujete prozkoumat další tutoriály z této série, můžete ponechat Codespace zřízený. Pokud jste připraveni navštívit web .NET ke stažení sady .NET SDK, můžete svůj Codespace odstranit. Pokud chcete odstranit Codespace, otevřete okno prohlížeče a přejděte do služby Codespaces. V okně se zobrazí seznam Codespaces. Vyberte tři tečky (...) v položce naučného výukového prostředí codespace. Pak vyberte Odstranit.

Další kroky

V tomto kurzu jste otestovali knihovnu tříd. Knihovnu můžete zpřístupnit ostatním tak, že ji publikujete do NuGetu jako balíček. Postup najdete v kurzu NuGet:

Pokud publikujete knihovnu jako balíček NuGet, můžou ji nainstalovat a používat i ostatní uživatelé. Postup najdete v kurzu NuGet:

Knihovna nemusí být distribuována jako balíček. Může být součástí konzolové aplikace, která ji používá. Informace o publikování konzolové aplikace najdete v předchozím kurzu této série:

Publikovat .NET konzolovou aplikaci