Začínáme s funkcí Live Unit Testing

Když v řešení sady Visual Studio povolíte Live Unit Testing, vizuálně znázorňuje pokrytí testu a stav testů. Live Unit Testing také dynamicky provádí testy při každé úpravě kódu a okamžitě vás upozorní, když změny způsobí selhání testů.

Živé testování částí lze použít k testování řešení, která cílí na rozhraní .NET Framework, .NET Core nebo .NET 5 nebo novější. V tomto kurzu se naučíte používat Live Unit Testing vytvořením jednoduché knihovny tříd, která cílí na .NET, a vytvoříte projekt MSTest, který cílí na .NET k otestování.

Kompletní řešení jazyka C# si můžete stáhnout z úložiště MicrosoftDocs/visualstudio-docs na GitHubu.

Požadavky

Tento kurz vyžaduje, abyste nainstalovali edici Visual Studio Enterprise s úlohou vývoje desktopových aplikací .NET.

Vytvoření řešení a projektu knihovny tříd

Začněte vytvořením řešení sady Visual Studio s názvem UtilityLibraries, které se skládá z jednoho projektu knihovny tříd .NET StringLibrary.

Řešení je jen kontejner pro jeden nebo více projektů. Pokud chcete vytvořit prázdné řešení, otevřete Visual Studio a postupujte takto:

  1. V nabídce sady Visual Studio nejvyšší úrovně vyberte Soubor>nový>projekt.

  2. Do vyhledávacího pole šablony zadejte řešení a pak vyberte prázdnou šablonu řešení . Pojmenujte projekt UtilityLibraries.

  3. Dokončete vytváření řešení.

Teď, když jste vytvořili řešení, vytvoříte knihovnu tříd s názvem StringLibrary, která obsahuje řadu rozšiřujících metod pro práci s řetězci.

  1. V Průzkumník řešení klikněte pravým tlačítkem na řešení UtilityLibraries a vyberte Přidat>nový projekt.

  2. Do vyhledávacího pole šablony zadejte knihovnutříd a vyberte šablonu knihovny tříd, která cílí na .NET nebo .NET Standard. Klikněte na tlačítko Další.

  3. Pojmenujte projekt StringLibrary.

  4. Kliknutím na Vytvořit vytvoříte projekt.

  5. Nahraďte veškerý existující kód v editoru kódu následujícím kódem:

    using System;
    
    namespace UtilityLibraries
    {
        public static class StringLibrary
        {
            public static bool StartsWithUpper(this string s)
            {
                if (String.IsNullOrWhiteSpace(s))
                    return false;
    
                return Char.IsUpper(s[0]);
            }
    
            public static bool StartsWithLower(this string s)
            {
                if (String.IsNullOrWhiteSpace(s))
                    return false;
    
                return Char.IsLower(s[0]);
            }
    
            public static bool HasEmbeddedSpaces(this string s)
            {
                foreach (var ch in s.Trim())
                {
                    if (ch == ' ')
                        return true;
                }
                return false;
            }
        }
    }
    

    StringLibrary má tři statické metody:

    • StartsWithUpper vrátí true , pokud řetězec začíná velkým znakem, v opačném případě vrátí falsehodnotu .

    • StartsWithLowervrátí true , pokud řetězec začíná malými písmeny, v opačném případě vrátí false.

    • HasEmbeddedSpaces vrátí true , pokud řetězec obsahuje vložený prázdný znak; v opačném případě vrátí false.

  6. V nabídce sady Visual Studio nejvyšší úrovně vyberte Sestavit>řešení sestavení. Sestavení by mělo proběhnout úspěšně.

Vytvoření testovacího projektu

Dalším krokem je vytvoření projektu testování jednotek pro testování knihovny StringLibrary. Testy jednotek vytvořte provedením následujících kroků:

  1. V Průzkumník řešení klikněte pravým tlačítkem na řešení UtilityLibraries a vyberte Přidat>nový projekt.

  2. Do vyhledávacího pole šablony zadejte test jednotek, vyberte jazyk C# a pak vyberte projekt MSTest Unit Test pro .NET. Klikněte na tlačítko Další.

    Poznámka:

    V sadě Visual Studio 2019 verze 16.9 je název šablony projektu MSTest projekt unit test.

  3. Pojmenujte projekt StringLibraryTests a klepněte na tlačítko Další.

  4. Zvolte buď doporučenou cílovou architekturu, nebo .NET 8, a pak zvolte Vytvořit.

    Poznámka:

    Tento úvodní kurz používá Live Unit Testing s testovací architekturou MSTest. Můžete také použít testovací architektury xUnit a NUnit.

  5. Projekt testování jednotek nemůže automaticky získat přístup k knihovně tříd, kterou testuje. Přístup k testovací knihovně získáte přidáním odkazu na projekt knihovny tříd. Uděláte to tak, že kliknete pravým tlačítkem myši na StringLibraryTests projekt a vyberete Přidat>odkaz na projekt. V dialogovém okně Správce odkazů se ujistěte, že je vybrána karta Řešení , a vyberte projekt StringLibrary, jak je znázorněno na následujícím obrázku.

    The Reference Manager dialog

    The Reference Manager dialog

  6. Nahraďte často používaný testovací kód jednotek poskytnutý šablonou následujícím kódem:

    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestStartsWithUpper()
            {
                // Tests that we expect to return true.
                string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" };
                foreach (var word in words)
                {
                    bool result = word.StartsWithUpper();
                    Assert.IsTrue(result,
                                  $"Expected for '{word}': true; Actual: {result}");
                }
            }
    
            [TestMethod]
            public void TestDoesNotStartWithUpper()
            {
                // Tests that we expect to return false.
                string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " " };
                foreach (var word in words)
                {
                    bool result = word.StartsWithUpper();
                    Assert.IsFalse(result,
                                   $"Expected for '{word}': false; Actual: {result}");
                }
            }
    
            [TestMethod]
            public void DirectCallWithNullOrEmpty()
            {
                // Tests that we expect to return false.
                string[] words = { String.Empty, null };
                foreach (var word in words)
                {
                    bool result = StringLibrary.StartsWithUpper(word);
                    Assert.IsFalse(result,
                                   $"Expected for '{(word == null ? "<null>" : word)}': " +
                                   $"false; Actual: {result}");
                }
            }
        }
    }
    
  7. Projekt uložte výběrem ikony Uložit na panelu nástrojů.

    Vzhledem k tomu, že kód testu jednotek obsahuje některé znaky jiné než ASCII, zobrazí se následující dialogové okno s upozorněním, že při uložení souboru ve výchozím formátu ASCII dojde ke ztrátě některých znaků.

  8. Zvolte tlačítko Uložit s jiným kódováním.

    Choose a file encoding

    Choose a file encoding

  9. V rozevíracím seznamu Kódování dialogového okna Upřesnit možnosti uložení zvolte Unicode (UTF-8 bez podpisu) - Codepage 65001, jak ukazuje následující obrázek:

    Choosing the UTF-8 encoding

  10. Zkompilujte projekt testování jednotek výběrem možnosti Sestavit>znovu sestavit řešení z nabídky sady Visual Studio nejvyšší úrovně.

Vytvořili jste knihovnu tříd i některé testy jednotek. Dokončili jste prelimináře potřebné k používání Live Unit Testing.

Povolení živého testování částí

Zatím jste sice napsali testy pro knihovnu tříd StringLibrary, ale neprovedli jste je. Live Unit Testing je spustí automaticky, jakmile ho povolíte. Uděláte to takto:

  1. Volitelně vyberte okno editoru kódu, které obsahuje kód pro StringLibrary. Toto je třída 1.cs pro projekt jazyka C# nebo Class1.vb pro projekt jazyka Visual Basic. (Tento krok umožňuje vizuálně zkontrolovat výsledky testů a rozsah pokrytí kódu, jakmile povolíte Live Unit Testing.)

  2. V nabídce Visual Studio nejvyšší úrovně vyberte Test Live Unit Testing>Start.>

  3. Ověřte konfiguraci live Unit Testing tím, že se ujistěte, že kořenový adresář úložiště obsahuje cestu ke zdrojovým souborům pro projekt nástroje i testovací projekt. Vyberte Další a pak Dokončit.

  1. V okně Live Unit Testing vyberte odkaz zahrnout všechny testy (případně vyberte ikonu tlačítka Seznam stop a pak vyberte StringLibraryTest, který vybere všechny testy pod ním. Potom zrušte výběr tlačítka Seznam stop a ukončete režim úprav.)

  2. Visual Studio znovu sestaví projekt a spustí Live Unit Test, který automaticky spustí všechny testy.

  1. Visual Studio znovu sestaví projekt a spustí Live Unit Test, který automaticky spustí všechny testy.

Po dokončení testů zobrazí Live Unit Testing celkový výsledek i výsledek jednotlivých testů. Kromě toho okno editoru kódu graficky zobrazuje pokrytí testovacího kódu i výsledek testů. Jak ukazuje následující obrázek, všechny tři testy byly úspěšně provedeny. Ukazuje také, že naše testy pokryly všechny cesty kódu v StartsWithUpper metodě a všechny testy byly úspěšně provedeny (což je označeno zelenou značkou zaškrtnutí " ")."). Nakonec ukazuje, že žádná z dalších metod v StringLibrary nemá pokrytí kódu (což je označeno modrou čárou " ➖ ").

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

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

Podrobnější informace o pokrytí testů a výsledcích testů můžete získat také výběrem konkrétní ikony pokrytí kódu v okně editoru kódu. Pokud chcete tento detail prozkoumat, postupujte takto:

  1. Klikněte na zelenou značku zaškrtnutí na řádku, který čte if (String.IsNullOrWhiteSpace(s)) metodu StartsWithUpper . Jak ukazuje následující obrázek, Live Unit Testing označuje, že tři testy pokrývají tento řádek kódu a že všechny byly úspěšně provedeny.

    Code coverage for the if conditional statement

    Code coverage for the if conditional statement

  2. Klikněte na zelenou značku zaškrtnutí na řádku, který čte return Char.IsUpper(s[0]) metodu StartsWithUpper . Jak ukazuje následující obrázek, Live Unit Testing označuje, že pouze dva testy pokrývají tento řádek kódu a že všechny byly úspěšně provedeny.

    Code coverage for the return statement

    Code coverage for the return statement

Hlavním problémem, který Live Unit Testing identifikuje, je neúplné pokrytí kódu. Budete ho řešit v další části.

Rozbalení pokrytí testu

V této části rozšíříte testy jednotek na metodu StartsWithLower . I když to uděláte, Live Unit Testing bude dynamicky pokračovat v testování kódu.

Pokud chcete rozšířit pokrytí kódu na metodu StartsWithLower , postupujte takto:

  1. Do souboru zdrojového kódu testu projektu přidejte následující TestStartsWithLower metody a TestDoesNotStartWithLower metody:

    // Code to add to UnitTest1.cs
    [TestMethod]
    public void TestStartsWithLower()
    {
        // Tests that we expect to return true.
        string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство" };
        foreach (var word in words)
        {
            bool result = word.StartsWithLower();
            Assert.IsTrue(result,
                          $"Expected for '{word}': true; Actual: {result}");
        }
    }
    
    [TestMethod]
    public void TestDoesNotStartWithLower()
    {
        // Tests that we expect to return false.
        string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва",
                           "1234", ".", ";", " "};
        foreach (var word in words)
        {
            bool result = word.StartsWithLower();
            Assert.IsFalse(result,
                           $"Expected for '{word}': false; Actual: {result}");
        }
    }
    
  2. Upravte metodu DirectCallWithNullOrEmpty přidáním následujícího kódu bezprostředně po volání Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsFalse metody.

    // Code to add to UnitTest1.cs
    result = StringLibrary.StartsWithLower(word);
    Assert.IsFalse(result,
                   $"Expected for '{(word == null ? "<null>" : word)}': " +
                   $"false; Actual: {result}");
    
  3. Live Unit Testing při úpravě zdrojového kódu automaticky spustí nové a upravené testy. Jak ukazuje následující obrázek, všechny testy, včetně těch dvou, které jste přidali, a toho, který jste upravili, proběhly úspěšně.

    The Live Test Explorer after expanding test coverage

    The Live Test Explorer after expanding test coverage

  4. Přepněte do okna, které obsahuje zdrojový kód pro StringLibrary třída. Live Unit Testing teď ukazuje, že naše pokrytí kódu je rozšířeno na metodu StartsWithLower .

    Code coverage for the StartsWithLower method

    Code coverage for the StartsWithLower method

V některých případech můžou být úspěšné testy v Průzkumníku testů neaktivní. To znamená, že se test právě spouští nebo že se test nespustí znovu, protože nedošlo k žádným změnám kódu, které by ovlivnily test od posledního spuštění.

Zatím byly všechny naše testy úspěšné. V další části se podíváme, jak můžete zvládnout selhání testu.

Zpracování selhání testu

V této části se dozvíte, jak pomocí Live Unit Testing identifikovat, řešit potíže a řešit chyby testů. Provedete to rozšířením pokrytí testů na metodu HasEmbeddedSpaces .

  1. Do testovacího souboru přidejte následující metodu:

    [TestMethod]
    public void TestHasEmbeddedSpaces()
    {
        // Tests that we expect to return true.
        string[] phrases = { "one car", "Name\u0009Description",
                             "Line1\nLine2", "Line3\u000ALine4",
                             "Line5\u000BLine6", "Line7\u000CLine8",
                             "Line0009\u000DLine10", "word1\u00A0word2" };
        foreach (var phrase in phrases)
        {
            bool result = phrase.HasEmbeddedSpaces();
            Assert.IsTrue(result,
                          $"Expected for '{phrase}': true; Actual: {result}");
        }
    }
    
  2. Při spuštění testu Live Unit Testing označuje, že TestHasEmbeddedSpaces metoda selhala, jak ukazuje následující obrázek:

    The Live Test Explorer reporting a failed test

    The Live Test Explorer reporting a failed test

  3. Vyberte okno, ve které se zobrazí kód knihovny. Live Unit Testing rozšířil pokrytí kódu pro metodu HasEmbeddedSpaces . Také hlásí selhání testu přidáním červeného "🞩" na řádky pokryté neúspěšnými testy.

  4. Najeďte myší na řádek s podpisem HasEmbeddedSpaces metody. Live Unit Testing zobrazuje popis, který hlásí, že metoda je pokryta jedním testem, jak ukazuje následující obrázek:

    Live Unit Testing information on a failed test

    Live Unit Testing information on a failed test

  5. Vyberte test TestHasEmbeddedSpaces, který selhal. Live Unit Testing nabízí několik možností, jako je spuštění všech testů a ladění všech testů, jak ukazuje následující obrázek:

    Live Unit Testing options for a failed test

    Live Unit Testing options for a failed test

  6. Vyberte Ladit vše , pokud chcete ladit neúspěšný test.

  7. Visual Studio spustí test v režimu ladění.

    Test přiřadí každý řetězec v poli proměnné pojmenované phrase a předá ji metodě HasEmbeddedSpaces . Spuštění programu pozastaví a vyvolá ladicí program při prvním výrazu assert je false. Dialogové okno výjimky, které je výsledkem neočekávané hodnoty volání Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue metody, je znázorněno na následujícím obrázku.

    Live Unit Testing exception dialog

    Live Unit Testing exception dialog

    Kromě toho jsou k dispozici všechny nástroje pro ladění, které sada Visual Studio poskytuje, které nám pomůžou vyřešit náš neúspěšný test, jak ukazuje následující obrázek:

    Visual Studio debugging tools

    Visual Studio debugging tools

    Všimněte si v okně Automatické hodnoty , že hodnota phrase proměnné je Name\tDescription, což je druhý prvek pole. Testovací metoda očekává HasEmbeddedSpaces , že se vrátí true , když je předán tento řetězec; místo toho vrátí false. Očividně nerozpozná znak tabulátoru jako vložený prostor.

  8. Vyberte Pokračovat v ladění>, stiskněte klávesu F5 nebo klikněte na tlačítko Pokračovat na panelu nástrojů a pokračujte v provádění testovacího programu. Vzhledem k tomu, že došlo k neošetřené výjimce, test se ukončí. To poskytuje dostatek informací pro předběžné šetření chyby. Buď TestHasEmbeddedSpaces (testovací rutina) provedla nesprávný předpoklad, nebo HasEmbeddedSpaces správně nerozpozná všechny vložené mezery.

  9. Pokud chcete diagnostikovat a opravit problém, začněte metodou StringLibrary.HasEmbeddedSpaces . Podívejte se na porovnání v HasEmbeddedSpaces metodě. Považuje vložený prostor za U+0020. Standard Unicode však obsahuje několik dalších znaků mezery. To naznačuje, že kód knihovny nesprávně otestoval prázdný znak.

  10. Nahraďte porovnání rovnosti voláním System.Char.IsWhiteSpace metody:

    if (Char.IsWhiteSpace(ch))
    
  11. Live Unit Testing automaticky znovu spustí neúspěšnou testovací metodu.

    Live Unit Testing zobrazuje aktualizované výsledky, které se zobrazí také v okně editoru kódu.