Kurz: Testování knihovny tříd .NET pomocí .NET pomocí sady Visual Studio

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

Požadavky

Vytvoření projektu testování částí

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

  1. Spusťte Visual Studio.

  2. ClassLibraryProjects Otevřete řešení, které jste vytvořili v části Vytvoření knihovny tříd .NET pomocí sady Visual Studio.

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

    1. V Průzkumníku řešení klikněte pravým tlačítkem myši na řešení 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 jazyk C# nebo Visual Basic a pak v seznamu Platformy zvolte Všechny platformy .

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

    4. Na stránce Konfigurovat nový projekt zadejte StringLibraryTest do pole Název projektu. Pak zvolte Další.

    5. Na stránce Další informace vyberte v poli Framework rozhraní .NET 8 (Preview). Potom zvolte Create (Vytvořit).

  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 class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Sub TestSub()
    
            End Sub
        End Class
    End Namespace
    

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

    • Importuje Microsoft.VisualStudio.TestTools.UnitTesting obor názvů, který obsahuje typy používané pro testování jednotek. V jazyce C# se obor názvů importuje prostřednictvím global using direktivy v souboru GlobalUsings.cs.
    • TestClassAttribute Použije atribut na UnitTest1 třídu.
    • Tento atribut se použije TestMethodAttribute k definování TestMethod1 v jazyce C# nebo TestSub v jazyce Visual Basic.

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

Přidání odkazu na projekt

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

  1. V Průzkumníku řešení klikněte pravým tlačítkem myši na uzel Závislosti projektu StringLibraryTest a v místní nabídce vyberte Přidat odkaz na projekt.

  2. V dialogovém okně Správce odkazů rozbalte uzel Projekty a vyberte pole vedle StringLibrary. Přidání odkazu na StringLibrary sestavení umožňuje kompilátoru najít metody StringLibrary při kompilaci stringLibraryTest projektu.

  3. Vyberte OK.

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

Když Visual Studio spustí test jednotek, spustí každou metodu označenou atributem TestMethodAttribute ve třídě, která je označena atributem TestClassAttribute . Testovací metoda skončí, když se najde první selhání nebo když všechny testy obsažené v metodě proběhly úspěšně.

Nejběžnější testy volají členy Assert třídy. 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 Assert nejčastěji nazývaných metod třídy jsou uvedené v následující tabulce:

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

Můžete také použít metodu Assert.ThrowsException v testovací metodě k označení typu výjimky, kterou má vyvolat. Test selže, pokud není vyvolán 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 se metoda v těchto případech vrátí true , takže můžete metodu Assert.IsTrue volat. Podobně chcete zadat řadu řetězců, které začínají něčím jiným než velkým znakem. Očekáváte, že se metoda v těchto případech vrátí false , takže můžete metodu Assert.IsFalse volat.

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), platný řetězec, který neobsahuje žádné znaky a jehož Length je 0, a null ř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 UnitTest1.cs nebo UnitTest1.vb nahraďte kód následujícím kódem:

    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));
                }
            }
        }
    }
    
    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 TestStartsWithUpper metodě obsahuje řecké velké písmeno alfa (U+0391) a velké písmeno cyrilice EM (U+041C). Test malých písmen v TestDoesNotStartWithUpper metodě obsahuje řecké malé písmeno alfa (U+03B1) a malé písmeno cyrilice Ghe (U+0433).

  2. Na řádku nabídek vyberte Soubor>Save UnitTest1.cs As nebo File>Save UnitTest1.vb As. V dialogovém okně Uložit soubor jako vyberte šipku vedle tlačítka Uložit a vyberte Uložit s kódováním.

    Visual Studio Save File As dialog

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

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

    Visual Studio Advanced Save Options dialog

    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 nebudou správné.

  5. Na řádku nabídek vyberte Test>Spustit všechny testy. Pokud se okno Průzkumníka testů neotevře, otevřete ho výběrem Průzkumníka testů>. Tyto tři testy jsou uvedeny v části Úspěšné testy a v části Souhrn se zobrazí zpráva o výsledku spuštění testu.

    Test Explorer window with passing tests

Zpracování 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, který test uspěje. Pro účely tohoto kurzu jste vytvořili test po napsání kódu aplikace, který ověří, takže se test nepovede. Pokud chcete ověřit, že test selže, když očekáváte, že selže, přidejte do vstupu testu neplatnou hodnotu.

  1. words Upravte pole v TestDoesNotStartWithUpper metodě tak, aby zahrnoval řetězec Error. Soubor nemusíte ukládat, protože Visual Studio automaticky ukládá otevřené soubory při sestavení řešení pro spouštění testů.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Spusťte test výběrem možnosti Test>Run All Tests (Spustit všechny testy) na řádku nabídek. Okno Průzkumníka testů označuje, že dva testy proběhly úspěšně a jeden selhal.

    Test Explorer window with failing tests

  3. Vyberte neúspěšný test . TestDoesNotStartWith

    V okně Průzkumníka testů se zobrazí zpráva vytvořená výrazem Assert.IsFalse se nezdařila. Byl očekáváno pro chybu: false; actual: True". Kvůli selhání nebyly po otestování chyby v poli žádné řetězce.

    Test Explorer window showing the IsFalse assertion failure

  4. Odeberte řetězec Chyba, který jste přidali v kroku 1. Znovu spusťte test a testy projdou.

Testování verze knihovny

Teď, když testy proběhly při spuštění sestavení ladění knihovny, spusťte testy ještě jednou oproti sestavení vydané verze 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í sestavení vydané verze:

  1. Na panelu nástrojů sady Visual Studio změňte konfiguraci sestavení z ladění na verzi.

    Visual Studio toolbar with release build highlighted

  2. V Průzkumníku řešení klikněte pravým tlačítkem myši na projekt StringLibrary a v místní nabídce vyberte Sestavit a knihovnu znovu zkompilujte.

    StringLibrary context menu with build command

  3. Testy jednotek spusťte tak, že v řádku nabídek vyberete Možnost Spustit>všechny testy. 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 kurzu: Ladění konzolové aplikace .NET pomocí sady Visual Studio k ladění kódu pomocí projektu testování jednotek. Místo spuštění projektu aplikace ShowCase klikněte pravým tlačítkem myši na projekt StringLibraryTests a v místní nabídce vyberte Ladit testy .

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

Další prostředky

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:

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

Požadavky

Vytvoření projektu testování částí

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

  1. Spusťte Visual Studio.

  2. ClassLibraryProjects Otevřete řešení, které jste vytvořili v části Vytvoření knihovny tříd .NET pomocí sady Visual Studio.

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

    1. V Průzkumníku řešení klikněte pravým tlačítkem myši na řešení 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 jazyk C# nebo Visual Basic a pak v seznamu Platformy zvolte Všechny platformy .

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

    4. Na stránce Konfigurovat nový projekt zadejte StringLibraryTest do pole Název projektu. Pak zvolte Další.

    5. Na stránce Další informace vyberte v poli Framework možnost .NET 7 (standardní podpora). Potom zvolte Create (Vytvořit).

  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.

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

    Zdrojový kód vytvořený šablonou testu jednotek 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 spuštění testu jednotek.

Přidání odkazu na projekt

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

  1. V Průzkumníku řešení klikněte pravým tlačítkem myši na uzel Závislosti projektu StringLibraryTest a v místní nabídce vyberte Přidat odkaz na projekt.

  2. V dialogovém okně Správce odkazů rozbalte uzel Projekty a vyberte pole vedle StringLibrary. Přidání odkazu na StringLibrary sestavení umožňuje kompilátoru najít metody StringLibrary při kompilaci stringLibraryTest projektu.

  3. Vyberte OK.

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

Když Visual Studio spustí test jednotek, spustí každou metodu označenou atributem TestMethodAttribute ve třídě, která je označena atributem TestClassAttribute . Testovací metoda skončí, když se najde první selhání nebo když všechny testy obsažené v metodě proběhly úspěšně.

Nejběžnější testy volají členy Assert třídy. 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 Assert nejčastěji nazývaných metod třídy jsou uvedené v následující tabulce:

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

Můžete také použít metodu Assert.ThrowsException v testovací metodě k označení typu výjimky, kterou má vyvolat. Test selže, pokud není vyvolán 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 se metoda v těchto případech vrátí true , takže můžete metodu Assert.IsTrue volat. Podobně chcete zadat řadu řetězců, které začínají něčím jiným než velkým znakem. Očekáváte, že se metoda v těchto případech vrátí false , takže můžete metodu Assert.IsFalse volat.

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), platný řetězec, který neobsahuje žádné znaky a jehož Length je 0, a null ř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 UnitTest1.cs nebo UnitTest1.vb nahraďte kód následujícím kódem:

    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));
                }
            }
        }
    }
    
    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 TestStartsWithUpper metodě obsahuje řecké velké písmeno alfa (U+0391) a velké písmeno cyrilice EM (U+041C). Test malých písmen v TestDoesNotStartWithUpper metodě obsahuje řecké malé písmeno alfa (U+03B1) a malé písmeno cyrilice Ghe (U+0433).

  2. Na řádku nabídek vyberte Soubor>Save UnitTest1.cs As nebo File>Save UnitTest1.vb As. V dialogovém okně Uložit soubor jako vyberte šipku vedle tlačítka Uložit a vyberte Uložit s kódováním.

    Visual Studio Save File As dialog

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

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

    Visual Studio Advanced Save Options dialog

    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 nebudou správné.

  5. Na řádku nabídek vyberte Test>Spustit všechny testy. Pokud se okno Průzkumníka testů neotevře, otevřete ho výběrem Průzkumníka testů>. Tyto tři testy jsou uvedeny v části Úspěšné testy a v části Souhrn se zobrazí zpráva o výsledku spuštění testu.

    Test Explorer window with passing tests

Zpracování 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, který test uspěje. Pro účely tohoto kurzu jste vytvořili test po napsání kódu aplikace, který ověří, takže se test nepovede. Pokud chcete ověřit, že test selže, když očekáváte, že selže, přidejte do vstupu testu neplatnou hodnotu.

  1. words Upravte pole v TestDoesNotStartWithUpper metodě tak, aby zahrnoval řetězec Error. Soubor nemusíte ukládat, protože Visual Studio automaticky ukládá otevřené soubory při sestavení řešení pro spouštění testů.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Spusťte test výběrem možnosti Test>Run All Tests (Spustit všechny testy) na řádku nabídek. Okno Průzkumníka testů označuje, že dva testy proběhly úspěšně a jeden selhal.

    Test Explorer window with failing tests

  3. Vyberte neúspěšný test . TestDoesNotStartWith

    V okně Průzkumníka testů se zobrazí zpráva vytvořená výrazem Assert.IsFalse se nezdařila. Byl očekáváno pro chybu: false; actual: True". Kvůli selhání nebyly po otestování chyby v poli žádné řetězce.

    Test Explorer window showing the IsFalse assertion failure

  4. Odeberte řetězec Chyba, který jste přidali v kroku 1. Znovu spusťte test a testy projdou.

Testování verze knihovny

Teď, když testy proběhly při spuštění sestavení ladění knihovny, spusťte testy ještě jednou oproti sestavení vydané verze 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í sestavení vydané verze:

  1. Na panelu nástrojů sady Visual Studio změňte konfiguraci sestavení z ladění na verzi.

    Visual Studio toolbar with release build highlighted

  2. V Průzkumníku řešení klikněte pravým tlačítkem myši na projekt StringLibrary a v místní nabídce vyberte Sestavit a knihovnu znovu zkompilujte.

    StringLibrary context menu with build command

  3. Testy jednotek spusťte tak, že v řádku nabídek vyberete Možnost Spustit>všechny testy. 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 kurzu: Ladění konzolové aplikace .NET pomocí sady Visual Studio k ladění kódu pomocí projektu testování jednotek. Místo spuštění projektu aplikace ShowCase klikněte pravým tlačítkem myši na projekt StringLibraryTests a v místní nabídce vyberte Ladit testy .

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

Další prostředky

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:

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

Požadavky

Vytvoření projektu testování částí

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

  1. Spusťte Visual Studio.

  2. ClassLibraryProjects Otevřete řešení, které jste vytvořili v části Vytvoření knihovny tříd .NET pomocí sady Visual Studio.

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

    1. V Průzkumníku řešení klikněte pravým tlačítkem myši na řešení 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 jazyk C# nebo Visual Basic a pak v seznamu Platformy zvolte Všechny platformy .

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

    4. Na stránce Konfigurovat nový projekt zadejte StringLibraryTest do pole Název projektu. Pak zvolte Další.

    5. Na stránce Další informace vyberte v poli Framework možnost .NET 6 (dlouhodobá podpora). Potom zvolte Create (Vytvořit).

  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.

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

    Zdrojový kód vytvořený šablonou testu jednotek 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 spuštění testu jednotek.

Přidání odkazu na projekt

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

  1. V Průzkumníku řešení klikněte pravým tlačítkem myši na uzel Závislosti projektu StringLibraryTest a v místní nabídce vyberte Přidat odkaz na projekt.

  2. V dialogovém okně Správce odkazů rozbalte uzel Projekty a vyberte pole vedle StringLibrary. Přidání odkazu na StringLibrary sestavení umožňuje kompilátoru najít metody StringLibrary při kompilaci stringLibraryTest projektu.

  3. Vyberte OK.

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

Když Visual Studio spustí test jednotek, spustí každou metodu označenou atributem TestMethodAttribute ve třídě, která je označena atributem TestClassAttribute . Testovací metoda skončí, když se najde první selhání nebo když všechny testy obsažené v metodě proběhly úspěšně.

Nejběžnější testy volají členy Assert třídy. 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 Assert nejčastěji nazývaných metod třídy jsou uvedené v následující tabulce:

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

Můžete také použít metodu Assert.ThrowsException v testovací metodě k označení typu výjimky, kterou má vyvolat. Test selže, pokud není vyvolán 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 se metoda v těchto případech vrátí true , takže můžete metodu Assert.IsTrue volat. Podobně chcete zadat řadu řetězců, které začínají něčím jiným než velkým znakem. Očekáváte, že se metoda v těchto případech vrátí false , takže můžete metodu Assert.IsFalse volat.

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), platný řetězec, který neobsahuje žádné znaky a jehož Length je 0, a null ř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 UnitTest1.cs nebo UnitTest1.vb nahraďte kód následujícím kódem:

    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));
                }
            }
        }
    }
    
    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 TestStartsWithUpper metodě obsahuje řecké velké písmeno alfa (U+0391) a velké písmeno cyrilice EM (U+041C). Test malých písmen v TestDoesNotStartWithUpper metodě obsahuje řecké malé písmeno alfa (U+03B1) a malé písmeno cyrilice Ghe (U+0433).

  2. Na řádku nabídek vyberte Soubor>Save UnitTest1.cs As nebo File>Save UnitTest1.vb As. V dialogovém okně Uložit soubor jako vyberte šipku vedle tlačítka Uložit a vyberte Uložit s kódováním.

    Visual Studio Save File As dialog

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

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

    Visual Studio Advanced Save Options dialog

    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 nebudou správné.

  5. Na řádku nabídek vyberte Test>Spustit všechny testy. Pokud se okno Průzkumníka testů neotevře, otevřete ho výběrem Průzkumníka testů>. Tyto tři testy jsou uvedeny v části Úspěšné testy a v části Souhrn se zobrazí zpráva o výsledku spuštění testu.

    Test Explorer window with passing tests

Zpracování 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, který test uspěje. Pro účely tohoto kurzu jste vytvořili test po napsání kódu aplikace, který ověří, takže se test nepovede. Pokud chcete ověřit, že test selže, když očekáváte, že selže, přidejte do vstupu testu neplatnou hodnotu.

  1. words Upravte pole v TestDoesNotStartWithUpper metodě tak, aby zahrnoval řetězec Error. Soubor nemusíte ukládat, protože Visual Studio automaticky ukládá otevřené soubory při sestavení řešení pro spouštění testů.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Spusťte test výběrem možnosti Test>Run All Tests (Spustit všechny testy) na řádku nabídek. Okno Průzkumníka testů označuje, že dva testy proběhly úspěšně a jeden selhal.

    Test Explorer window with failing tests

  3. Vyberte neúspěšný test . TestDoesNotStartWith

    V okně Průzkumníka testů se zobrazí zpráva vytvořená výrazem Assert.IsFalse se nezdařila. Byl očekáváno pro chybu: false; actual: True". Kvůli selhání nebyly po otestování chyby v poli žádné řetězce.

    Test Explorer window showing the IsFalse assertion failure

  4. Odeberte řetězec Chyba, který jste přidali v kroku 1. Znovu spusťte test a testy projdou.

Testování verze knihovny

Teď, když testy proběhly při spuštění sestavení ladění knihovny, spusťte testy ještě jednou oproti sestavení vydané verze 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í sestavení vydané verze:

  1. Na panelu nástrojů sady Visual Studio změňte konfiguraci sestavení z ladění na verzi.

    Visual Studio toolbar with release build highlighted

  2. V Průzkumníku řešení klikněte pravým tlačítkem myši na projekt StringLibrary a v místní nabídce vyberte Sestavit a knihovnu znovu zkompilujte.

    StringLibrary context menu with build command

  3. Testy jednotek spusťte tak, že v řádku nabídek vyberete Možnost Spustit>všechny testy. 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 kurzu: Ladění konzolové aplikace .NET pomocí sady Visual Studio k ladění kódu pomocí projektu testování jednotek. Místo spuštění projektu aplikace ShowCase klikněte pravým tlačítkem myši na projekt StringLibraryTests a v místní nabídce vyberte Ladit testy .

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

Další prostředky

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: