Sdílet prostřednictvím


Začínáme s 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 měli nainstalovanou verzi Visual Studio Enterprise s pracovní zátěží vývoj 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 horní nabídce Visual Studio vyberte Soubor>Nový>Projekt.

  2. Do vyhledávacího pole šablony zadejte řešení a vyberte šablonu Prázdné ř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 knihovnu tříd a vyberte šablonu knihovny tříd, která cílí na .NET nebo .NET Standard. Klikněte na 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ými písmeny; v opačném případě vrátí false.

    • StartsWithLower vrá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 hlavní nabídce sady Visual Studio vyberte Sestavení>Ř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íku řešeníklikněte pravým tlačítkem myši na řešení UtilityLibraries a vyberte Přidat>Nový projekt.

  2. Do vyhledávacího pole šablony zadejte jednotkový test, vyberte C# a pak vyberte MSTest Unit Test Project pro šablonu .NET. Klikněte na Další.

    Poznámka

    V sadě Visual Studio 2019 verze 16.9 je název šablony projektu MSTest projekt jednotkových testů.

  3. Pojmenujte projekt StringLibraryTests a klikněte na 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 na projekt StringLibraryTests a vyberete Přidat>Referenci projektu. V dialogovém okně Správce odkazů se ujistěte, že je vybraná karta Řešení, a vyberte projekt StringLibrary, jak je znázorněno na následujícím obrázku.

    dialogové okno Správce odkazů

    dialogové okno Správce odkazů

  6. Nahraďte základní testovací kód jednotkových testů 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 tak, že na panelu nástrojů vyberete ikonu Uložit.

    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.

    Zvolit kódování souborů

    Zvolit kódování souborů

  9. V rozevíracím seznamu Kódování dialogového okna Pokročilé možnosti uložení zvolte Unicode (UTF-8 bez podpisu) – kódová stránka 65001, jak je znázorněno na následujícím obrázku.

    volba kódování UTF-8

  10. Zkompilujte projekt jednotkových testů výběrem Sestavit>Znovu sestavit řešení z nabídky Visual Studio nejvyšší úrovně.

Vytvořili jste knihovnu tříd i některé jednotkové testy. 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. Jedná se o Class1.cs projektu jazyka C# nebo Class1.vb projektu 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 Dokončit.

  1. V okně Live Unit Testing vyberte odkaz "Zahrnout všechny testy" (alternativně vyberte ikonu tlačítka Playlist, poté vyberte StringLibraryTest, což vybere všechny testy pod ním. Potom zrušte výběr tlačítka seznam skladeb pro ukončení režimu ú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ů Live Unit Testing zobrazí celkové výsledky 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 zahrnovaly všechny cesty kódu v metodě StartsWithUpper 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 " ➖ ").

Okno Live Test Exploreru a editoru kódu po spuštění live unit testing

Okno Live Test Exploreru a editoru kódu po spuštění 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ý obsahuje if (String.IsNullOrWhiteSpace(s)) v metodě 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.

    pokrytí kódu pro podmínkový výraz if

    pokrytí kódu pro podmíněný příkaz if

  2. Klikněte na zelené zaškrtávací znaménko na řádku, na kterém je uvedeno return Char.IsUpper(s[0]) v metodě 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.

    pokrytí kódu pro návratový příkaz

    pokrytí kódu pro návratový příkaz

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

Rozšířit pokrytí testů

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 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 DirectCallWithNullOrEmpty metodu přidáním následujícího kódu bezprostředně po volání metody Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsFalse.

    // 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ě.

    Průzkumník živého testování po rozšíření pokrytí testů

    Průzkumník pro živé testování po rozšíření pokrytí testů

  4. Přepněte do okna, které obsahuje zdrojový kód pro třídu StringLibrary. Testování jednotek v reálném čase teď ukazuje, že pokrytí kódu se rozšířilo na metodu StartsWithLower.

    Pokrytí kódem pro metodu StartsWithLower

    Pokrytí kódu metody StartsWithLower

V některých případech můžou být úspěšné testy v Průzkumníku testů zašedlé. To znamená, že se test právě spouští, nebo že se test neběžel 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. Když se test spustí, Live Unit Testing znamená, že metoda TestHasEmbeddedSpaces selhala, jak ukazuje následující obrázek:

    Průzkumník živého testu hlásí neúspěšný test

    Průzkumník živého testu hlásí neúspěšný test

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

  4. Najeďte myší na řádek se signaturou metody HasEmbeddedSpaces. Live Unit Testing zobrazuje nástrojovou lištu, která oznamuje, že metoda je pokryta jedním testem, jak ukazuje následující obrázek.

    informace o živém testování jednotek u neúspěšného testu

    informace o živém testování jednotek při neúspěšném testu

  5. Vyberte neúspěšný test TestHasEmbeddedSpaces. 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:

    Možnosti Live Unit Testing pro neúspěšný test

    možnosti Live Unit Testing pro neúspěšný test

  6. Vyberte možnost Debug All pro ladění neúspěšného testu.

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

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

    dialogové okno výjimky „Live Unit Testing“

    Dialogové okno výjimky Live Unit Testing

    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:

    nástroje pro ladění sady Visual Studio

    nástroje pro ladění sady Visual Studio

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

  8. Vyberte Ladit>Pokračovat, stiskněte F5nebo 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) provedl 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 metodě HasEmbeddedSpaces. 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 metody System.Char.IsWhiteSpace:

    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.