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:
V nabídce sady Visual Studio nejvyšší úrovně vyberte Soubor>nový>projekt.
Do vyhledávacího pole šablony zadejte řešení a pak vyberte prázdnou šablonu ř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 tlačítko 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ým znakem, v opačném případě vrátífalse
hodnotu .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 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ů:
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 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.
Pojmenujte projekt StringLibraryTests a klepněte na tlačítko 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 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.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}"); } } } }
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ů.
Zvolte tlačítko Uložit s jiným kódováním.
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:
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:
Volitelně vyberte okno editoru kódu, které obsahuje kód pro StringLibrary. Toto je Class1.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.)
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 pak Dokončit.
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.)
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ů 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 " ➖ ").
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ý čte
if (String.IsNullOrWhiteSpace(s))
metoduStartsWithUpper
. 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 zelenou značku zaškrtnutí na řádku, který čte
return Char.IsUpper(s[0])
metoduStartsWithUpper
. 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.
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:
Do souboru zdrojového kódu testu projektu přidejte následující
TestStartsWithLower
metody 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 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}");
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 StringLibrary třída. Live Unit Testing teď ukazuje, že naše pokrytí kódu je rozšířeno na metodu
StartsWithLower
.
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
.
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}"); } }
Při spuštění testu Live Unit Testing označuje, že
TestHasEmbeddedSpaces
metoda 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 pro metodu
HasEmbeddedSpaces
. Také hlásí selhání testu přidáním červeného "🞩" na řádky pokryté neúspěšnými testy.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: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:
Vyberte Ladit vše , pokud chcete ladit neúspěšný test.
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 jefalse
. 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.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é 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.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, 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í vHasEmbeddedSpaces
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.Nahraďte porovnání rovnosti voláním System.Char.IsWhiteSpace metody:
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.