Základní informace o testování částí
Vytvořením a spuštěním testů jednotek zkontrolujte, že váš kód funguje podle očekávání. Říká se tomu testování částí, protože funkce programu můžete rozdělit na diskrétní testovatelné chování, které můžete testovat jako jednotlivé jednotky. Visual Studio Průzkumník testů nabízí flexibilní a efektivní způsob spouštění testů jednotek a zobrazení jejich výsledků v Visual Studio. Visual Studio nainstaluje rozhraní Microsoftu pro testování částí pro spravovaný a nativní kód. Pomocí rozhraní pro testování částí můžete vytvářet testy jednotek, spouštět je a hlásit výsledky těchto testů. Testy jednotek spusťte znovu, když změníte test, jestli váš kód stále funguje správně. Visual Studio Enterprise to můžete provést automaticky pomocí Live Unit Testing, který detekuje testy ovlivněné změnami kódu a spouští je na pozadí při psaní.
Testování částí má největší vliv na kvalitu kódu, pokud je nedílnou součástí pracovního postupu vývoje softwaru. Jakmile napíšete funkci nebo jiný blok kódu aplikace, vytvořte testy jednotek, které ověří chování kódu v reakci na standardní, hraniční a nesprávné případy vstupních dat a zkontrolují explicitní nebo implicitní předpoklady provedené kódem. Při vývoji řízeném testy testů vytvoříte testy jednotek před napsání kódu, takže testy jednotek použijete jako dokumentaci k návrhu i funkční specifikace.
Průzkumník testů může také spouštět rozhraní testování částí třetích open source, která mají implementovaná doplňková rozhraní Průzkumníka testů. Řadu těchto rozhraní můžete přidat prostřednictvím správce rozšíření Visual Studio a galerie Visual Studio aplikací. Další informace najdete v tématu Instalace rozhraní testování částí třetích stran.
Můžete rychle generovat projekty testů a testovací metody z kódu nebo ručně vytvářet testy podle potřeby. Pokud k prozkoumání kódu .NET používáte IntelliTest, můžete vygenerovat testovací data a sadu testů jednotek. Pro každý příkaz v kódu se generuje zkušební vstup, který tento příkaz spustí. Zjistěte, jak generovat testy jednotek pro kód .NET.
Začínáme
Úvod do testování částí, který vás přesměruje přímo na kódování, najdete v jednom z těchto témat:
Příklad řešení MyBank
V tomto článku používáme jako příklad vývoj fiktivní aplikace s MyBank názvem . K tomu, abyste postupovat podle vysvětlení v tomto tématu, nepotřebujete skutečný kód. Testovací metody jsou napsány v jazyce C# a prezentovány pomocí rozhraní Microsoft Unit Testing Framework pro spravovaný kód. Koncepty se ale snadno přenášejí do jiných jazyků a architektur.


Náš první pokus o návrh aplikace zahrnuje součást účtů, která představuje individuální účet a jeho transakce s bankou, a databázovou komponentu, která představuje funkci pro agregaci a správu MyBank jednotlivých účtů.
Vytvoříme MyBank řešení, které obsahuje dva projekty:
AccountsBankDb
Náš první pokus o návrh projektu obsahuje třídu pro uložení základních informací o účtu, rozhraní, které určuje běžné funkce libovolného typu účtu, jako je ukládání a nahánění prostředků z účtu, a třídu odvozenou z rozhraní, které představuje kontrolní Accounts účet. Projekty Accounts začneme vytvořením následujících zdrojových souborů:
AccountInfo.cs definuje základní informace pro účet.
Soubor IAccount.cs definuje standardní rozhraní pro účet, včetně metod pro ukládání a získávání prostředků z účtu a pro načtení
IAccountzůstatku účtu.Soubor CheckingAccount.cs obsahuje
CheckingAccounttřídu, kteráIAccountimplementuje rozhraní pro účet kontroly.
Ze zkušeností víme, že jednou z věcí, kterou musí udělat kontrola účtu, je zajistit, aby byla stažená částka nižší než zůstatek účtu. Proto přepíšeme IAccount.Withdraw metodu CheckingAccount v pomocí metody , která kontroluje tuto podmínku. Metoda může vypadat asi takhle:
public void Withdraw(double amount)
{
if(m_balance >= amount)
{
m_balance -= amount;
}
else
{
throw new ArgumentException(nameof(amount), "Withdrawal exceeds balance!");
}
}
Teď, když máme nějaký kód, je čas na testování.
Vytváření projektů a testovacích metod testů jednotek (C#)
V jazyce C# je často rychlejší vygenerovat projekt testování částí a zástupné procedury testu jednotek z kódu. Nebo se můžete rozhodnout vytvořit projekt testování částí a testovat ho ručně v závislosti na vašich požadavcích. Pokud chcete vytvořit testy jednotek z kódu s rozhraním třetí strany, budete potřebovat nainstalované jedno z těchto rozšíření: NUnit nebo xUnit. Pokud jazyk C# používáte, přeskočte tuto část a přejděte k části Vytvoření projektu testování částí a testy jednotek ručně.
Generování zástupných procedur projektu testu jednotek a testu jednotek
V okně editoru kódu klikněte pravým tlačítkem a v místní nabídce zvolte Vytvořit testy jednotek.

Poznámka
Příkaz nabídky Vytvořit testy jednotek je dostupný jenom pro spravovaný kód, který cílí na .NET Framework (ale ne pro .NET Core).

Poznámka
Příkaz nabídky Create Unit Tests (Vytvořit testy jednotek) je dostupný jenom pro kód C#. Pokud chcete tuto metodu použít s .NET Core nebo .NET Standard, Visual Studio 2019.
Kliknutím na OK přijměte výchozí hodnoty pro vytvoření testů jednotek nebo změňte hodnoty použité k vytvoření a názvu projektu testování částí a testů jednotek. Můžete vybrat kód, který se ve výchozím nastavení přidá do testovacích metod jednotek.

Zástupné procedury testu jednotek jsou vytvořeny v novém projektu testování částí pro všechny metody ve třídě .


Teď se učte psát testy, aby byl test jednotek smysluplný, a jakékoli další testy jednotek, které byste mohli chtít přidat k důkladnému otestování kódu.
Ruční vytvoření projektu testování částí a testů jednotek
Projekt testování částí obvykle zrcadlí strukturu jednoho projektu kódu. V příkladu MyBank přidáte do řešení dva projekty testů jednotek s názvem AccountsTests BankDbTests a MyBanks . Názvy testovacích projektů jsou libovolné, ale je vhodné přijmout standardní zásady vytváření názvů.
Přidání projektu testování částí do řešení:
- V Průzkumník řešení klikněte pravým tlačítkem na řešení a zvolte Přidat > nový Project.
V dialogovém Project Nový projekt rozbalte uzel Nainstalováno, zvolte jazyk, který chcete použít pro svůj testovací projekt, a pak zvolte Test.
Pokud chcete použít jednu z rozhraní microsoftu pro testování částí, v Project seznamu šablon projektů zvolte Unit Test (Testovací verze jednotek). V opačném případě zvolte šablonu projektu architektury testování částí, kterou chcete použít. Projekt v
Accountsnašem příkladu otestujte tak, že projekt pojmeteAccountsTests.Poznámka
Ne všechny architektury testování jednotek třetích open source testování jednotek poskytují Visual Studio šablony projektu. Informace o vytvoření projektu najdete v dokumentu architektury.
Do vyhledávacího pole šablony projektu zadejte test, abyste našli šablonu projektu testování částí pro testovací rozhraní, které chcete použít. (V příkladech v tomto tématu používáme MSTest.)
Na další stránce zadejte název projektu. Pokud chcete
Accountsprojekt v našem příkladu otestovat, můžete projekt pojmnovatAccountsTests.
V projektu testování částí přidejte odkaz na projekt kódu v testech, v našem příkladu do projektu Accounts.
Vytvoření odkazu na projekt kódu:
V projektu testování částí v Průzkumník řešení klikněte pravým tlačítkem na uzel Odkazy nebo Závislosti a pak zvolte Přidat odkaz na Project nebo Přidat odkaz podle toho, která možnost je k dispozici.
V dialogovém okně Správce odkazů otevřete uzel Řešení a zvolte Projekty. Vyberte název projektu kódu a zavřete dialogové okno.
Každý projekt testu jednotek obsahuje třídy, které zrcadlí názvy tříd v projektu kódu. V našem příkladu AccountsTests by projekt obsahoval následující třídy:
AccountInfoTeststřída obsahuje metody testu jednotek proAccountInfotřídu vAccountsprojektu.CheckingAccountTeststřída obsahuje metody testu jednotek proCheckingAccounttřídu .
Psaní testů
Rozhraní pro testování částí, které používáte a Visual Studio IntelliSense vás provede psaním kódu pro testy jednotek pro projekt kódu. Pro spuštění v Průzkumníku testů většina architektur vyžaduje přidání konkrétních atributů pro identifikaci metod testování částí. Rozhraní také poskytují způsob, obvykle prostřednictvím příkazů assert nebo atributů metody, který označuje, zda byla testovací metoda úspěšně nebo neúspěšná. Jiné atributy identifikují volitelné metody instalace, které jsou při inicializaci třídy a před každou testovací metodou a metodami roztržení, které jsou spuštěny po každé testovací metodě a před zničením třídy.
Vzor AAA (Arrange, Act, Assert) je běžný způsob zápisu testů jednotek pro testované metody.
Oddíl Arrange metody testu jednotek inicializuje objekty a nastaví hodnotu dat, která se předá testovací metodě.
V části Act se testová metoda vyvolá s uspořádané parametry.
Oddíl Assert ověří, že akce testové metody se chová podle očekávání. V případě rozhraní .NET se metody ve Assert třídě často používají k ověření.
K otestování metody v našem příkladu můžeme napsat dva testy: jeden, který ověřuje standardní chování metody, a jeden, který ověřuje, že selže více než zůstatky (následující kód ukazuje test jednotek MSTest, který je podporován v CheckingAccount.Withdraw rozhraní .NET). Do CheckingAccountTests třídy přidáme následující metody:
[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
// arrange
double currentBalance = 10.0;
double withdrawal = 1.0;
double expected = 9.0;
var account = new CheckingAccount("JohnDoe", currentBalance);
// act
account.Withdraw(withdrawal);
// assert
Assert.AreEqual(expected, account.Balance);
}
[TestMethod]
public void Withdraw_AmountMoreThanBalance_Throws()
{
// arrange
var account = new CheckingAccount("John Doe", 10.0);
// act and assert
Assert.ThrowsException<System.ArgumentException>(() => account.Withdraw(20.0));
}
Další informace o rozhraních Microsoftu pro testování částí najdete v jednom z následujících témat:
Nastavení časových limitů pro testy jednotek
Pokud používáte rozhraní MSTest Framework, můžete použít TimeoutAttribute k nastavení časového limitu pro jednotlivé testovací metody:
[TestMethod]
[Timeout(2000)] // Milliseconds
public void My_Test()
{ ...
}
Nastavení časového limitu na povolené maximum:
[TestMethod]
[Timeout(TestTimeout.Infinite)] // Milliseconds
public void My_Test ()
{ ...
}
Spustit testy v Průzkumníku testů
Při sestavování testovacího projektu se testy zobrazí v Průzkumníku testů. pokud není průzkumník testů viditelný, zvolte možnost test v nabídce Visual Studio, zvolte položku Windows a zvolte možnost průzkumník testů (nebo stiskněte klávesovou zkratku Ctrl + E, T).


Když spouštíte, píšete a znovu spustíte testy, Průzkumník testů může zobrazit výsledky ve skupinách neúspěšných testů, Úspěšné testy, přeskočené testy a nespouštět testy. Na panelu nástrojů můžete vybrat jiné možnosti seskupení.
Můžete také filtrovat testy v jakémkoli zobrazení pomocí odpovídajícího textu ve vyhledávacím poli na globální úrovni nebo výběrem jednoho z předdefinovaných filtrů. Můžete kdykoli spustit libovolný výběr testů. Výsledky testovacího běhu jsou v horní části okna Průzkumníka okamžitě patrné na panelu předat/selhat. Podrobnosti o výsledku testovací metody se zobrazí, když vyberete test.
Spuštění a zobrazení testů
Panel nástrojů Průzkumník testů vám pomůže zjistit, uspořádat a spustit testy, které vás zajímají.


Výběrem možnosti Spustit vše můžete spustit všechny testy (nebo stisknout CTRL + r, V) nebo zvolit Spustit pro výběr podmnožiny testů, které chcete spustit (CTRL + r, T). Vyberte test, chcete-li zobrazit podrobnosti o testu v podokně podrobností testu. Zvolením možnosti Otevřít test z místní nabídky (klávesnice: F12) zobrazte zdrojový kód pro vybraný test.
Pokud jednotlivé testy neobsahují žádné závislosti, které jim brání v jejich spuštění v libovolném pořadí, zapněte paralelní provádění testů s
přepínací tlačítko na panelu nástrojů. To může výrazně zkrátit čas potřebný ke spuštění všech testů.
Pokud jednotlivé testy neobsahují žádné závislosti, které jim brání v jejich spuštění v libovolném pořadí, zapněte paralelní spuštění testů v nabídce nastavení na panelu nástrojů. To může výrazně zkrátit čas potřebný ke spuštění všech testů.
Spustit testy po každém sestavení
| Tlačítko | Description |
|---|---|
![]() |
Chcete-li spustit testy jednotek po každém místním sestavení, zvolte možnost test v nabídce Standard a pak zvolte možnost Spustit testy po sestavení na panelu nástrojů Průzkumníka testů . |
Poznámka
spuštění testů jednotek po každém sestavení vyžaduje Visual Studio 2017 Enterprise edition nebo Visual Studio 2019. v Visual Studio 2019 je funkce k dispozici v Community a Professional edition kromě edice Enterprise.
Chcete-li spustit testy jednotek po každém místním sestavení, otevřete ikonu nastavení na panelu nástrojů Průzkumníka testů a vyberte možnost Spustit testy po sestavení.
Filtrovat a seskupit seznam testů
Pokud máte velký počet testů, můžete zadat do vyhledávacího pole Průzkumníka testů , abyste seznam vyfiltroval podle zadaného řetězce. Událost filtru můžete omezit tak, že vyberete ze seznamu filtru.


| Tlačítko | Description |
|---|---|
![]() |
Chcete-li seskupit testy podle kategorie, klikněte na tlačítko Seskupit podle . |
Další informace naleznete v tématu spuštění testů jednotek pomocí Průzkumníka testů.
Otázky a odpovědi
Otázka: Návody ladit testy jednotek?
A: Pomocí Průzkumníka testů spusťte ladicí relaci pro vaše testy. procházení kódu pomocí ladicího programu Visual Studio plynule přebírá mezi testy jednotek a testovaným projektem. Spuštění ladění:
v editoru Visual Studio nastavte zarážku v jedné nebo více testovacích metodách, které chcete ladit.
Poznámka
Vzhledem k tomu, že testovací metody lze spustit v libovolném pořadí, nastavte zarážky ve všech testovacích metodách, které chcete ladit.
V Průzkumníku testů vyberte testovací metody a pak zvolte možnost ladit vybrané testy z místní nabídky.
Přečtěte si další informace o ladění testů jednotek.
Otázka: Pokud používám TDD, jak mohu generovat kód z mých testů?
A: Pomocí rychlých akcí vygenerujte třídy a metody v kódu projektu. Zapište příkaz v testovací metodě, která volá třídu nebo metodu, kterou chcete vygenerovat, a pak otevřete žárovky, který se zobrazí pod chybou. Pokud je volání konstruktoru nové třídy, v nabídce vyberte možnost generovat typ a postupujte podle pokynů průvodce a vložte třídu do projektu kódu. Pokud je volání metody, v nabídce technologie IntelliSense vyberte možnost generovat metodu .


Otázka: je možné vytvořit testy jednotek, které při spuštění testu přebírají více sad dat jako vstup?
Odpověď: Ano. Testovací metody řízené daty umožňují testovat rozsah hodnot pomocí jediné metody testování částí. Použijte DataSource atribut pro testovací metodu, která určuje zdroj dat a tabulku obsahující proměnné hodnoty, které chcete testovat. V těle metody přiřadíte hodnoty řádku k proměnným pomocí TestContext.DataRow[ ] indexeru ColumnName.
Poznámka
Tyto postupy se vztahují pouze na testovací metody, které zapisujete pomocí rozhraní Microsoft Unit Test Framework pro spravovaný kód. Pokud používáte jiné rozhraní, Projděte si dokumentaci k rozhraní pro ekvivalentní funkce.
Předpokládejme například, že přidáte nepotřebnou metodu do CheckingAccount třídy, která je pojmenována AddIntegerHelper . AddIntegerHelper přidá dvě celá čísla.
Chcete-li vytvořit test řízený daty pro AddIntegerHelper metodu, nejprve vytvoříme databázi Access s názvem AccountsTest. accdb a tabulku s názvem AddIntegerHelperData . AddIntegerHelperDataTabulka definuje sloupce pro zadání prvního a druhého operandu přidání a sloupce, které určují očekávaný výsledek. Vyplníme počet řádků odpovídajícími hodnotami.
[DataSource(
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Projects\MyBank\TestData\AccountsTest.accdb",
"AddIntegerHelperData"
)]
[TestMethod()]
public void AddIntegerHelper_DataDrivenValues_AllShouldPass()
{
var target = new CheckingAccount();
int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]);
int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
int actual = target.AddIntegerHelper(x, y);
Assert.AreEqual(expected, actual);
}
Metoda s atributem se spustí jednou pro každý řádek v tabulce. Průzkumník testů hlásí selhání testu pro metodu, pokud některá iterace selže. Podokno podrobností výsledků testu pro metodu ukazuje metodu stavu Pass/selhat pro každý řádek dat.
Přečtěte si další informace o testech jednotek řízených daty.
Otázka: mohu zobrazit, kolik z mých kódů je Testováno pomocí mých testů částí?
Odpověď: Ano. můžete určit množství kódu, který je skutečně testován pomocí testů jednotek pomocí nástroje Visual Studio pokrytí kódu v Visual Studio Enterprise. Jsou podporovány nativní a spravované jazyky a všechny architektury testování částí, které lze spustit v rámci testovacího rozhraní jednotky.
Můžete spustit pokrytí kódu pro vybrané testy nebo pro všechny testy v řešení. V okně výsledky pokrytí kódu se zobrazí procentuální podíl bloků kódu produktu, které byly uplatněny pomocí řádku, funkce, třídy, oboru názvů a modulu.
Chcete-li spustit pokrytí kódu pro testovací metody v řešení, vyberte možnost test > Analyzovat pokrytí kódu pro všechny testy.
Výsledky pokrytí se zobrazí v okně výsledky pokrytí kódu .

Přečtěte si další informace o pokrytí kódu .
Otázka: mohu testovat metody v mém kódu, které mají vnější závislosti?
Odpověď: Ano. pokud máte Visual Studio Enterprise, Microsoft Fakes lze použít s testovacími metodami, které zapisujete pomocí testovacích rozhraní jednotek pro spravovaný kód.
Microsoft Fakes používá dva přístupy k vytváření náhradních tříd pro externí závislosti:
Zástupné procedury generují náhradní třídy odvozené z nadřazeného rozhraní třídy Target závislosti. Metody zástupných procedur lze nahradit veřejnými virtuálními metodami cílové třídy.
Překrytí používají instrumentaci za běhu k přesměrování volání cílové metody do náhradní metody Shim pro jiné než virtuální metody.
V obou metodách použijete vygenerované delegáty volání metody závislosti k určení chování, které chcete v testovací metodě.
Přečtěte si další informace o izolaci metod testování částí pomocí Microsoft Fakes.
Otázka: je možné použít jiné architektury testování částí k vytvoření testů jednotek?
A: Ano, pomocí následujícího postupu můžete Najít a nainstalovat další architektury. po restartování Visual Studio znovu otevřete řešení a vytvořte testy jednotek a potom vyberte vaše nainstalovaná rozhraní zde:

Vaše zástupné procedury testu jednotek budou vytvořeny pomocí vybraného rozhraní.

