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:
V horní nabídce Visual Studio vyberte Soubor>Nový>Projekt.
Do vyhledávacího pole šablony zadejte řešení a vyberte šablonu Prázdné řešení. Pojmenujte projekt UtilityLibraries.
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.
V Průzkumník řešeníklikněte pravým tlačítkem na řešení UtilityLibraries a vyberte Přidat>Nový projekt.
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ší.
Pojmenujte projekt StringLibrary.
Kliknutím na Vytvořit vytvořte projekt.
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
.
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ů:
V Průzkumníku řešeníklikněte pravým tlačítkem myši na řešení UtilityLibraries a vyberte Přidat>Nový projekt.
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ů.
Pojmenujte projekt StringLibraryTests a klikněte na Další.
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.
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.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}"); } } } }
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ů.
Zvolte tlačítko Uložit s jiným kódováním.
kódování souborů
kódování souborů
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.
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:
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.)
V nabídce Visual Studio nejvyšší úrovně vyberte Test>Live Unit Testing>Start.
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.
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.)
Visual Studio znovu sestaví projekt a spustí Live Unit Test, který automaticky spustí všechny testy.
- 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 " ➖ ").
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:
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.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.
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:
Do souboru zdrojového kódu testu projektu přidejte následující
TestStartsWithLower
aTestDoesNotStartWithLower
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}"); } }
Upravte
DirectCallWithNullOrEmpty
metodu přidáním následujícího kódu bezprostředně po volání metodyMicrosoft.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}");
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ě.
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
.
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
.
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}"); } }
Když se test spustí, Live Unit Testing znamená, že metoda
TestHasEmbeddedSpaces
selhala, jak ukazuje následující obrázek: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.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.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:
Vyberte možnost Debug All pro ladění neúspěšného testu.
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á hoHasEmbeddedSpaces
metodě. Spuštění programu se pozastaví a vyvolá ladicí program při prvním vyhodnocení výrazu assertfalse
. Dialogové okno výjimky, které je výsledkem neočekávané hodnoty volání metodyMicrosoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue
, je znázorněno na následujícím obrázku.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:
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á, žeHasEmbeddedSpaces
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.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, neboHasEmbeddedSpaces
správně nerozpozná všechny vložené mezery.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.Nahraďte porovnání rovnosti voláním metody System.Char.IsWhiteSpace:
if (Char.IsWhiteSpace(ch))
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.