Základní informace o testování částí

Zkontrolujte, jestli kód funguje podle očekávání, a to vytvořením a spuštěním testů jednotek. Nazývá se testování jednotek, protože rozdělíte funkce programu do samostatných testovatelných chování, které můžete testovat jako jednotlivé jednotky. Průzkumník testů sady Visual Studio nabízí flexibilní a efektivní způsob spouštění testů jednotek a zobrazení výsledků v sadě Visual Studio. Visual Studio nainstaluje architektury microsoftu pro testování jednotek pro spravovaný a nativní kód. Pomocí architektury testování jednotek můžete vytvářet testy jednotek, spouštět je a hlásit výsledky těchto testů. Znovu spusťte testy jednotek, když provedete změny a otestujete, že váš kód stále funguje správně. Visual Studio Enterprise to může provést automaticky pomocí funkce 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, když 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ěřují chování kódu v reakci na standardní, hraniční a nesprávné případy vstupních dat a kontrolují explicitní nebo implicitní předpoklady vytvořené kódem. Při vývoji řízeném testy testů vytvoříte testy jednotek před napsáním kódu, takže testy jednotek použijete jako návrhovou dokumentaci i funkční specifikace.

Průzkumník testů může také spouštět rozhraní pro testování částí třetích stran a open source, které implementovaly doplňková rozhraní Průzkumníka testů. Mnoho z těchto architektur můžete přidat prostřednictvím Správce rozšíření sady Visual Studio a galerie sady Visual Studio. Další informace naleznete v tématu Instalace rozhraní pro testování jednotek třetích stran.

Z kódu můžete rychle vygenerovat testovací projekty a testovací metody nebo je podle potřeby vytvořit ručně. Když k prozkoumání kódu .NET použijete IntelliTest, můžete vygenerovat testovací data a sadu testů jednotek. Pro každý příkaz v kódu se vygeneruje testovací vstup, který tento příkaz spustí. Zjistěte, jak generovat testy jednotek pro kód .NET.

Začínáme

Úvod do testování jednotek, který vás zavede přímo do kódování, najdete v jednom z těchto témat:

Příklad řešení banky

V tomto článku používáme vývoj fiktivní aplikace označované MyBank jako příklad. Ke sledování vysvětlení v tomto tématu nepotřebujete skutečný kód. Testovací metody jsou napsané v jazyce C# a prezentovány pomocí rozhraní Microsoft Unit Testing Framework pro spravovaný kód. Koncepty se ale snadno přenesou do jiných jazyků a architektur.

MyBank Solution 2019

MyBank Solution 2022

Náš první pokus o návrh MyBank aplikace zahrnuje komponentu účtů, která představuje jednotlivý účet a její transakce s bankou, a databázovou komponentu, která představuje funkce agregace a správy jednotlivých účtů.

Vytvoříme Bank řešení, které obsahuje dva projekty:

  • Accounts

  • BankDB

Náš první pokus o návrh Accounts projektu obsahuje třídu, která obsahuje základní informace o účtu, rozhraní, které určuje společné funkce jakéhokoli typu účtu, jako je vklad a stažení prostředků z účtu, a třída odvozená z rozhraní, která představuje kontrolní účet. Projekty Účty zahájíme vytvořením následujících zdrojových souborů:

  • AccountInfo.cs definuje základní informace pro účet.

  • IAccount.cs definuje standardní IAccount rozhraní pro účet, včetně metod pro uložení a stažení prostředků z účtu a načtení zůstatku účtu.

  • CheckingAccount.cs obsahuje CheckingAccount třídu, která implementuje IAccount rozhraní pro kontrolní účet.

Víme ze zkušenosti, že jedna věc, kterou musí provést výběr z kontrolního účtu, je zajistit, aby částka odebraná byla menší než zůstatek účtu. Proto přepíšeme metodu IAccount.WithdrawCheckingAccount metodou, která kontroluje tuto podmínku. Metoda může vypadat takto:

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ů testů jednotek a testovacích metod (C#)

V jazyce C# je často rychlejší vygenerovat projekt testování jednotek a zástupné procedury testování jednotek z kódu. Nebo se můžete rozhodnout vytvořit projekt testování jednotek a testy ručně v závislosti na vašich požadavcích. Pokud chcete vytvořit testy jednotek z kódu s architekturou třetí strany, budete potřebovat nainstalované jedno z těchto rozšíření: NUnit nebo xUnit. Pokud C# nepoužíváte, přeskočte tuto část a přejděte do části Vytvoření projektu testování jednotek a testů jednotek ručně.

Generování testovacích projektů jednotek a zástupné procedury testů jednotek

  1. V okně editoru kódu klikněte pravým tlačítkem myši a v nabídce, která se zobrazí po kliknutí pravým tlačítkem myši, zvolte Vytvořit testy jednotek.

    From the editor window, view the context menu

    Poznámka:

    Příkaz nabídky Vytvořit testy jednotek je k dispozici pouze pro kód jazyka C#. K použití této metody s .NET Core nebo .NET Standard se vyžaduje Visual Studio 2019 nebo novější.

    From the editor window, view the context menu

    Poznámka:

    Příkaz nabídky Vytvořit testy jednotek je k dispozici pouze pro kód jazyka C#. K použití této metody s .NET Core nebo .NET Standard se vyžaduje Visual Studio 2019 nebo novější.

  2. Kliknutím na tlačítko OK přijměte výchozí hodnoty pro vytvoření testů jednotek nebo změňte hodnoty použité k vytvoření a pojmenování projektu testu jednotek a testů jednotek. Můžete vybrat kód, který se ve výchozím nastavení přidá do metod testování jednotek.

    Create Unit Tests dialog box in Visual Studio

    Create Unit Tests dialog box in Visual Studio

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

    The unit tests are created

    The unit tests are created

  4. Teď se vyučte, jak napsat testy , aby byl test jednotek smysluplný, a všechny 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í jednotek a testů jednotek

Projekt testování jednotek obvykle zrcadlí strukturu jednoho projektu kódu. V příkladu MyBank přidáte dva projekty testů jednotek pojmenované AccountsTests a BankDbTests do Bank řešení. Názvy testovacích projektů jsou libovolné, ale přijetí standardní konvence pojmenování je dobrý nápad.

Přidání projektu testu jednotek do řešení:

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

  2. Zadáním testu do vyhledávacího pole šablony projektu vyhledejte šablonu projektu testu jednotek pro testovací architekturu, kterou chcete použít. (V příkladech v tomto tématu používáme MSTest.)

  3. Na další stránce pojmenujte projekt. Pokud chcete otestovat projekt našeho příkladu Accounts , můžete projekt AccountsTestspojmenovat .

  4. V projektu testování jednotek přidejte odkaz na projekt kódu, který je testem, v našem příkladu do projektu Účty.

    Vytvoření odkazu na projekt kódu:

    1. V projektu testování jednotek v Průzkumník řešení klikněte pravým tlačítkem myši na uzel Odkazy nebo Závislosti a potom zvolte Přidat odkaz projektu nebo Přidat odkaz podle toho, co je k dispozici.

    2. 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 testování 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:

  • AccountInfoTests třída obsahuje metody testování jednotek pro AccountInfo třídu v Accounts projektu

  • CheckingAccountTests třída obsahuje metody testování jednotek pro CheckingAccount třídu.

Psaní testů

Architektura testování jednotek, kterou používáte, a Visual Studio IntelliSense vás provede psaním kódu pro testy jednotek pro projekt kódu. Pokud chcete spustit v Průzkumníku testů, většina architektur vyžaduje přidání konkrétních atributů k identifikaci metod testování jednotek. Architektury také poskytují způsob , obvykle prostřednictvím příkazů assert nebo atributů metody, které označují, jestli testovací metoda prošla nebo selhala. Ostatní atributy identifikují volitelné metody nastavení, které jsou inicializace třídy a před každou testovací metodou a metody odtržené po každé testovací metodě a před zničením třídy.

Model AAA (Arrange, Act, Assert) je běžný způsob psaní testů jednotek pro metodu, která se testuje.

  • Oddíl Uspořádat metodu testu jednotek inicializuje objekty a nastaví hodnotu dat, která jsou předána metodě v rámci testu.

  • Oddíl Act vyvolá metodu v rámci testu s uspořádanými parametry.

  • Oddíl Assert ověřuje, že akce metody v rámci testu se chová podle očekávání. Pro .NET se metody ve Assert třídě často používají k ověření.

K otestování CheckingAccount.Withdraw metody našeho příkladu můžeme napsat dva testy: jeden, který ověřuje standardní chování metody, a druhý, který ověřuje, že výběr více než zůstatku selže (následující kód ukazuje test jednotek MSTest, který je podporován v .NET.). CheckingAccountTests Do 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 architekturu MSTest, 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 maximální povolenou hodnotu:

[TestMethod]
[Timeout(TestTimeout.Infinite)]  // Milliseconds
public void My_Test ()
{ ...
}

Spouštění testů v Průzkumníku testů

Když sestavíte testovací projekt, testy se zobrazí v Průzkumníku testů. Pokud Průzkumník testů není viditelný, zvolte Test v nabídce sady Visual Studio, zvolte Windows a pak zvolte Průzkumník testů (nebo stiskněte Ctrl + E, T).

Unit Test Explorer

Unit Test Explorer

Při spuštění, zápisu a opětovném spuštění testů může Průzkumník testů zobrazit výsledky ve skupinách neúspěšných testů, úspěšných testů, přeskočených testů a nespouštět testy. Na panelu nástrojů můžete vybrat různé skupiny podle možností.

Testy můžete také filtrovat v libovolném zobrazení podle odpovídajícího textu ve vyhledávacím poli na globální úrovni nebo výběrem některého z předdefinovaných filtrů. Kdykoli můžete spustit libovolný výběr testů. Výsledky testovacího spuštění se okamžitě projeví na panelu pass/fail v horní části okna průzkumníka. Po výběru testu se zobrazí podrobnosti o výsledku metody testu.

Spouštění a zobrazení testů

Panel nástrojů Průzkumníka testů vám pomůže zjišťovat, organizovat a spouštět testy, které vás zajímají.

Run tests from the Test Explorer toolbar

Run tests from the Test Explorer toolbar

Pokud chcete spustit všechny testy (nebo stisknout Ctrl + R, V), můžete zvolit možnost Spustit a vybrat podmnožinu testů, které chcete spustit (Ctrl + R, T). Výběrem testu zobrazíte podrobnosti testu v podokně podrobností testu. V nabídce zobrazené po kliknutí pravým tlačítkem myši zvolte Otevřít test (klávesnice: F12) a zobrazte zdrojový kód pro vybraný test.

Pokud jednotlivé testy nemají žádné závislosti, které brání jejich spuštění v libovolném pořadí, zapněte paralelní spuštění testu v nabídce nastavení panelu nástrojů. To může výrazně zkrátit dobu potřebnou ke spuštění všech testů.

Spouštění testů po každém sestavení

Pokud chcete testy jednotek spustit po každém místním sestavení, otevřete ikonu nastavení na panelu nástrojů Průzkumníka testů a vyberte Spustit testy po sestavení.

Filtrování a seskupení seznamu testů

Pokud máte velký počet testů, můžete do vyhledávacího pole Průzkumníka testů zadat filtrování seznamu podle zadaného řetězce. Událost filtru můžete omezit více výběrem ze seznamu filtrů.

Search filter categories

Search filter categories

Tlačítko Popis
Test Explorer group button Pokud chcete testy seskupit podle kategorií, zvolte tlačítko Seskupit podle .

Další informace najdete v tématu Spouštění testů jednotek pomocí Průzkumníka testů.

Otázky a odpovědi

Otázka: Návody ladění testů jednotek?

A: Pomocí Průzkumníka testů spusťte ladicí relaci pro vaše testy. Krokování kódu pomocí ladicího programu sady Visual Studio vás hladce přenese mezi testy jednotek a projektem, který je pod testem. Spuštění ladění:

  1. V editoru sady 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 mohou běžet v libovolném pořadí, nastavte zarážky ve všech testovacích metodách, které chcete ladit.

  2. V Průzkumníku testů vyberte testovací metody a v místní nabídce zvolte Ladit vybrané testy .

Přečtěte si další podrobnosti o ladění testů jednotek.

Otázka: Pokud používám TDD, jak můžu vygenerovat kód ze svých testů?

A: Pomocí rychlých akcí můžete vygenerovat třídy a metody v kódu projektu. Do testovací metody napište příkaz, který volá třídu nebo metodu, kterou chcete vygenerovat, a otevřete žárovku, která se zobrazí pod chybou. Pokud je volání konstruktoru nové třídy, zvolte v nabídce generovat typ a podle průvodce vložte třídu do projektu kódu. Pokud je volání metody, zvolte v nabídce IntelliSense možnost Generovat metodu .

Generate Method Stub Quick Action Menu

Generate Method Stub Quick Action Menu

Otázka: Můžu vytvořit testy jednotek, které jako vstup používají více sad dat ke spuštění testu?

Odpověď: Ano. Metody testů řízené daty umožňují testovat rozsah hodnot pomocí jedné metody testu jednotek. Pro testovací metodu DataRowDynamicData použijte hodnotu nebo DataSource atribut, který určuje zdroj dat obsahující hodnoty proměnných, které chcete testovat.

Atributovaná metoda se spustí jednou pro každý řádek ve zdroji dat. Průzkumník testů hlásí selhání testu pro metodu, pokud některá z iterací selže. Podokno podrobností výsledků testů pro metodu ukazuje metodu stavu pass/fail pro každý řádek dat.

Přečtěte si další informace o testech jednotek řízených daty.

Otázka: Můžu zobrazit, kolik kódu je testováno testy jednotek?

Odpověď: Ano. Množství kódu, který se ve skutečnosti testuje testy jednotek, můžete určit pomocí nástroje pokrytí editoru Visual Studio Code v sadě Visual Studio Enterprise. Podporují se nativní a spravované jazyky a všechny architektury testů jednotek, které lze spouštět rozhraním pro testování částí.

Pokrytí kódu můžete spouštět u vybraných testů nebo u všech testů v řešení. Okno Výsledky pokrytí kódu zobrazuje procento bloků kódu produktu, které byly uplatněny řádkem, funkcí, třídou, oborem názvů a modulem.

Pokud chcete spustit pokrytí kódu pro testovací metody v řešení, zvolte Test>Analyzovat pokrytí kódu pro všechny testy.

Výsledky pokrytí se zobrazí v okně Výsledky pokrytí kódu.

Code coverage results

Code coverage results

Přečtěte si další informace o pokrytí kódu.

Otázka: Můžu testovat metody v kódu, které mají externí závislosti?

Odpověď: Ano. Pokud máte Visual Studio Enterprise, můžete microsoft Fakes použít s testovacími metodami, které píšete pomocí architektur testování jednotek pro spravovaný kód.

Microsoft Fakes používá dva přístupy k vytvoření náhradních tříd pro externí závislosti:

  1. Zástupné procedury generují náhradní třídy odvozené z nadřazeného rozhraní cílové třídy závislostí. Metody zástupné procedury lze nahradit veřejnými virtuálními metodami cílové třídy.

  2. Shims používá instrumentaci modulu runtime k přesměrování volání na cílovou metodu na náhradní metodu shim pro jiné než virtuální metody.

V obou přístupech použijete vygenerované delegáty volání metody závislosti k určení chování, které chcete použít v testovací metodě.

Přečtěte si další informace o izolování metod testování jednotek pomocí Microsoft Fakes.

Otázka: Můžu k vytváření testů jednotek použít jiné architektury testů jednotek?

A: Ano, pomocí těchto kroků vyhledejte a nainstalujte další architektury. Po restartování sady Visual Studio znovu otevřete řešení, aby se vytvořily testy jednotek, a pak vyberte nainstalované architektury zde:

Select other installed unit test framework

Testovací procedury jednotek se vytvoří pomocí vybrané architektury.