Sdílet prostřednictvím


Postupy: Vytváření a spouštění testování částí pro spravovaný kód

Tento průvodce bude kroku vás vytvoření, spuštění a přizpůsobení řadu testování částí pomocí rozhraní pro testování částí společnosti Microsoft pro spravovaný kód a Visual Studio Průzkumníka testů.Začít s projektu C#, který je ve vývoji, vytvořte testy, které vykonávat jeho kód, tyto testy a zkontrolujte výsledky.Poté můžete změnit svůj projekt kódu a znovu spustit testy.

Toto téma obsahuje následující oddíly:

Připravit návodu

Vytvořte projekt testování částí

Vytvořit třídu testu

Vytvoření první zkušební metody

Vytvoření a spuštění testu

Opravte váš kód a spusťte znovu testů

Testování částí použít ke zlepšení kódu

[!POZNÁMKA]

V tomto návodu používá rozhraní pro testování částí společnosti Microsoft pro spravovaný kód.Průzkumníka testů také můžete spouštět testy z třetích stran rozhraní pro testování částí, které mají adaptéry pro Průzkumníka testů.Další informace naleznete v tématu Postupy: Instalace systémů testování částí od nezávislých dodavatelů

[!POZNÁMKA]

Informace o tom, jak spouštět testy z příkazového řádku naleznete v tématu Průvodce: používání nástroje pro testování z příkazového řádku.

Požadavky

Připravit návodu

  1. Otevřít sadu Visual Studio.

  2. Na soubor nabídce přejděte na Nový a potom klikněte na tlačítko projektu.

    Nový projekt se zobrazí dialogové okno.

  3. V části Nainstalované šablony, klikněte na tlačítko Visual C#.

  4. V seznamu typů aplikací, klikněte na tlačítko knihovny tříd.

  5. V název zadejte Bank a potom klikněte na tlačítko OK.

    [!POZNÁMKA]

    Pokud název "Banka" je již používán, zvolte jiný název pro projekt.

    Nový projekt Bank je vytvořena a zobrazeny v Průzkumníku řešení se souborem Class1.cs otevřít v editoru kódu.

    [!POZNÁMKA]

    Pokud soubor Class1.cs není otevřen v editoru kódu, poklepejte na soubor Class1.cs v Průzkumníku řešení jej otevřete.

  6. Zkopírujte zdrojový kód z Ukázkový projekt testování částí.

  7. Nahradit původní obsah Class1.cs s kódem Ukázkový projekt testování částí.

  8. Uložte soubor jako BankAccount.cs

  9. V nabídce Sestavení klikněte na příkaz Sestavit řešení.

Nyní máte projekt s názvem banky.Obsahuje zdrojový kód a testovat a nástroje pro testování pomocí tlačítek.Obor názvů pro banku, BankAccountNS, obsahuje třídu veřejné Bankovní účet, jejíž metody budete testovat v následujících postupů.

V této Začínáme jsme zaměřit se na Debit metody.Debetní metoda je volána, když peníze stažena z účtu a obsahuje následující kód:

// method under test
public void Debit(double amount)
{
    if(amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount");
    }
    m_balance += amount;
}

Vytvořte projekt testování částí

Nezbytná: postupujte podle kroků v postupu připravit návodu.

Chcete-li vytvořit projekt testování částí

  1. Na soubor nabídce zvolte Přidat, a poté zvolte možnost Nový projekt....

  2. V dialogovém okně Nový projekt rozbalte nainstalované, rozbalte položku Visual C#, a poté zvolte možnost Test.

  3. V seznamu šablon vyberte projekt testování částí.

  4. V název zadejte BankTest a poté zvolte možnost OK.

    BankTests projekt je přidán do Bank řešení.

  5. V BankTests projektu, přidejte odkaz na Bank řešení.

    V Průzkumníku řešení vyberte odkazuje na v BankTests projektů a poté zvolte možnost Přidat odkaz z místní nabídky.

  6. V dialogovém okně Reference Manager rozbalte řešení a potom zkontrolujte Bank položky.

Vytvořit třídu testu

Potřebujeme třídu testování pro ověření BankAccount třídy.Používáme UnitTest1.cs, která byla vygenerována šablonou projektu, ale jsme by měl obsahovat odkazy na a třídy více popisné názvy.Můžeme to můžete provést v jednom kroku přejmenování souboru v Průzkumníku řešení.

Přejmenování souboru třídy

V Průzkumníku řešení vyberte soubor UnitTest1.cs v BankTests projektu.V místní nabídce vyberte možnost Přejmenovat, a pak přejmenujte soubor na BankAccountTests.cs.Zvolte Ano v dialogovém okně s dotazem, pokud chcete přejmenovat všechny odkazy v projektu na element kódu 'UnitTest1'.Tento krok změní název třídy pro BankAccountTests.

Soubor BankAccountTests.cs nyní obsahuje následující kód:

// unit test code
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BankTests
{
    [TestClass]
    public class BankAccountTests
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
}

Přidat do pomocí příkazu k projektu testovaný

Můžeme také přidat do pomocí příkazu pro třídu nám k volání do projektu testovaný bez využívající plně kvalifikované názvy.V horní části souboru třídy přidejte:

using BankAccountNS;

Požadavky třídy testování

Minimální požadavky pro třídu test jsou následující:

  • [TestClass] Je vyžadován atribut v jednotce Microsoft testování framework pro spravovaný kód pro jakákoliv třída, která obsahuje jednotka zkušební metody, které chcete spustit v Průzkumníka testů.

  • Musí mít každý testovací metodu, která chcete Průzkumníka testů pro spuštění [TestMethod]atributu.

Můžete mít další třídy v projektu testování částí, které nemají [TestClass] atribut který může mít jiné metody v testovací třídy, které nemají [TestMethod] atributu.Můžete tyto třídy a metody v zkušební metody.

Vytvoření první zkušební metody

V rámci tohoto postupu bude psaní jednotkové testování metody ověření chování Debit metodu BankAccount třídy.Metoda je uveden výše.

Analýzou metodu testovaný určíme, zda jsou alespoň tři chování, které je třeba zkontrolovat:

  1. Vyvolá metoda [ArgumentOutOfRangeException] Pokud debetní částka je větší než zůstatek.

  2. Také vyvolá ArgumentOutOfRangeException Pokud debetní velikost je menší než nula.

  3. If kontroly v 1.) a 2.) jsou splněny, metoda odečte množství od zůstatek účtu.

V testovacím první pomocí platnou částku (takovou, která je menší než zůstatek účtu, kterým je větší než nula) z účtu stáhne správnou velikost.

Chcete-li vytvořit testovací metody

  1. Přidat do pomocí BankAccountNS; prohlášení, abyste BankAccountTests.cs souboru.

  2. Přidejte následující metodu do BankAccountTests třídy:

    // unit test code
    [TestMethod]
    public void Debit_WithValidAmount_UpdatesBalance()
    {
        // arrange
        double beginningBalance = 11.99;
        double debitAmount = 4.55;
        double expected = 7.44;
        BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);
    
        // act
        account.Debit(debitAmount);
    
        // assert
        double actual = account.Balance;
        Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly");
    }
    

Tato metoda je spíše jednoduché.Společnost Microsoft nastavit nový BankAccount objekt s počáteční zůstatek a potom zrušit platnou částku.Používáme rozhraní pro testování částí společnosti Microsoft pro spravovaný kód AreEqual metodu k ověření, že konečný zůstatek je můžeme očekávat.

Požadavky metody testování

Zkušební metoda musí splňovat následující požadavky:

  • Metoda musí být vybaveny [TestMethod] atributu.

  • Metoda musí vrátit void.

  • Metoda nemůže mít parametry.

Vytvoření a spuštění testu

K vytvoření a spuštění testu

  1. Na sestavení nabídce zvolte Sestavit řešení.

    Pokud nedojde k žádným chybám, zobrazí se okno UnitTestExplorer Debit_WithValidAmount_UpdatesBalance uvedené v testy spustit skupiny.Pokud se nezobrazí Průzkumníka testů po úspěšném sestavení, zvolte Test v nabídce vyberte Windows, a poté zvolte možnost Průzkumníka testů.

  2. Zvolte Spustit všechny ke spuštění testu.Tento test je spuštěna stavový řádek v horní části okna je při animaci pohybovat.Na konci test spustil zapne panelu zelený, je-li předat zkušební metody nebo red Pokud některý z testů.

  3. V takovém případě test selhal.Metodu test je přesunuta do se nezdařilo testy.skupinu.Vyberte metodu v Průzkumníku testů můžete zobrazit podrobnosti v dolní části okna.

Opravte váš kód a spusťte znovu testů

Analyzovat výsledky testů

Výsledek testu obsahuje zprávu, která popisuje selhání.Pro AreEquals metodu, zobrazí se zpráva vám co byl očekáván ((**byl očekáván <XXX>**parametr) a skutečně přijaté ( Skutečná <YYY> parametr).Byl očekáván zůstatek tak, aby odmítal z počáteční zůstatek, ale místo toho se zvýšila o dobu, po kterou stažení.

Přezkoumání debetní kódu ukazuje, že při hledání chybu proběhl úspěšně testování částí.Stažení dobu, po kterou je přidán do zůstatek účtu, když je nutné odečíst.

Opravte této chyby

Chcete-li opravit chyby, jednoduše nahraďte řádku

m_balance += amount;

with

m_balance -= amount;

Spusťte test znovu

V Průzkumníku testovat zvolte Spustit všechny test spustit znovu.Na panelu červená/zelená změní zelená a test je přesunuta do předána testy skupiny.

Testování částí použít ke zlepšení kódu

Tato část popisuje, jak opakovaný proces analýzy, vývoj testování částí a refaktoring může vám pomůže zajistit produkčního kódu více robustní a efektivní.

Analyzovat problémy

Po vytvoření zkušební metoda, abyste se ujistili, že platnou částku je správně odečteny v Debit v případě metody jsme můžete otočit ostatních případech v naší původní analýze:

  1. Vyvolá metoda ArgumentOutOfRangeException Pokud debetní částka je větší než zůstatek.

  2. Také vyvolá ArgumentOutOfRangeException Pokud debetní velikost je menší než nula.

Vytvořit testovací metody

První pokus na vytváření zkušební metody, chcete-li tyto problémy vyřešit příslibů se jeví jako:

//unit test method
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = -100.00;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // act
    account.Debit(debitAmount);

    // assert is handled by ExpectedException
}

Používáme ExpectedExceptionAttribute atribut k vyhodnocení, že byla vyvolána výjimka vpravo.Atribut způsobí, že test selhání, pokud ArgumentOutOfRangeException je vyvolána.Spuštění testu oba kladné a záporné debitAmount hodnoty a poté dočasně měníte metodu testovaný má být vyvolána obecnou ApplicationException po dobu, po kterou je menší než nula ukazuje, že test se chová správně.K testování v případě, když je větší než zůstatek dobu, po kterou stažené, je třeba provést je:

  1. Vytvořit novou metodu test s názvem Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange.

  2. Kopírovat text metody z Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange nové metody.

  3. Nastavte debitAmount na číslo vyšší než zůstatek.

Spuštění testů

Spuštění tyto dvě metody s různými hodnotami debitAmount ukazuje, že testy dostatečně zpracovávat našich ostatních případech.Spuštění všech tří zkoušek potvrďte, že všech případech v naší původní analýze podléhají správně.

Pokračujte v analýze

Poslední dvě zkušební metody jsou však také poněkud troubling.Můžeme nesmí být určité které podmínka v testovaný kód vyvolá výjimku, když buď test běží.Některé způsob, jak rozdíl dvou podmínek by být užitečné.Jako jsme přemýšlení o tomto problému další, je zřejmé, že znalosti, která podmínka byla porušena zvýší našich spolehlivostí testy.Tyto informace by být také velmi pravděpodobně užitečné výrobní mechanismus, který zpracovává výjimku, pokud je vyvolána metoda testovaný.Generování Další informace, když metoda vyvolá by assist všechny příslušné, ale ExpectedException atribut nelze zadat tyto informace...

Metoda testovaný vidí znovu, můžeme naleznete v části obou podmíněných příkazů pomocí ArgumentOutOfRangeException konstruktor, který přebírá název argumentu jako parametr:

throw new ArgumentOutOfRangeException("amount");

Z hledání v knihovně MSDN zjistíme, zda existuje konstruktor sestav daleko rozsáhlejší informace.#ctor(String, Object, String) obsahuje název argumentu, hodnota argumentu a uživatelem definované zprávu.Společnost Microsoft může Refaktorovat metodu testovaný používat tento konstruktor.Členy veřejně dostupný typu i lepší, můžete použít k určení chyby.

Refaktorovat testovaný kód

Doporučujeme nejprve definovat dvě konstanty pro chybové zprávy v rozsahu třídy:

// class under test
public const string DebitAmountExceedsBalanceMessage = "Debit amount exceeds balance";
public const string DebitAmountLessThanZeroMessage = "Debit amount less than zero";

Společnost Microsoft poté změňte dvě podmíněných příkazů v Debit Metoda:

// method under test
// ...
    if (amount > m_balance)
    {
        throw new ArgumentOutOfRangeException("amount", amount, DebitAmountExceedsBalanceMessage);
    }

    if (amount < 0)
    {
        throw new ArgumentOutOfRangeException("amount", amount, DebitAmountLessThanZeroMessage);
    }
// ...

Refaktorovat zkušební metody

V našich zkušební metoda, doporučujeme nejprve odebrat ExpectedException atributu.Místo toho jsme catch výjimka, ke a ověřte, že byla vyvolána v příkazu správný podmínku.Však musí nyní rozhodneme mezi dvě možnosti, chcete-li ověřit našich zbývající podmínky.Například v Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange metodu, můžeme provést jednu z následujících akcí:

  • Vyhodnocení, který ActualValue vlastnost výjimky (druhý parametr ArgumentOutOfRangeException konstruktor) je větší než počáteční zůstatek.Tato možnost vyžaduje, aby testujeme ActualValue vlastnost výjimky proti beginningBalance proměnné zkušební metody a také vyžaduje, aby pak ověřte, zda ActualValue je větší než nula.

  • Vyhodnocení, zda zpráva (třetí parametr konstruktoru) obsahuje DebitAmountExceedsBalanceMessage definované v BankAccount třídy.

StringAssert.Contains Metodu v rozhraní pro testování částí Microsoft umožňuje nám chcete-li ověřit druhou možnost bez výpočtů, které jsou požadovány první možnosti.

Druhý pokus o na změnu Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange může vypadat například:

[TestMethod]
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // act
    try
    {
        account.Debit(debitAmount);
    }
    catch (ArgumentOutOfRangeException e)
    {
        // assert
        StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
    }
}

Vyzkoušejte, přepisování a opakovat analýzu

Při testujeme zkušební metody s více hodnotami, můžeme zobrazit následujících skutečností:

  1. Pokud jsme catch opravě chyby pomocí vyhodnocení kde debitAmount větší než zůstatek, Contains předá vyhodnocení, výjimka je ignorován a tak předá zkušební metody.Toto je chování, které chceme.

  2. Pokud jsou používány debitAmount je menší než 0, vyhodnocení se nezdaří, protože je vrácen špatné chybové zprávy.Vyhodnocení také nezdaří, pokud se seznámíme dočasnou ArgumentOutOfRange výjimky na jiné místo v metodu testovací kód cestě.To příliš je správná.

  3. Pokud debitAmount hodnota je platná (tj méně než zůstatek, ale větší než nula, žádná je zachycena výjimka, takže nikdy je zachycena vyhodnocení.Předá zkušební metody.Toto není funkční, protože chceme metodu test nezdaří, pokud nedojde k výjimce.

Třetí fakt je chyba v našich zkušební metody.Chcete-li pokus o vyřešení problému, můžeme přidat Fail vyhodnocení na konci zkušební metody pro zpracování v případě, kde nedojde k výjimce.

Ale opětovném testování ukazuje, že test nyní se nezdaří, pokud je správný výjimka zachycena.Příkaz catch resetuje výjimku a metoda nadále vykonat, selhání na nové vyhodnocení.Chcete-li nový problém vyřešit, můžeme přidat return prohlášení poté, co StringAssert.Opětovném testování potvrdí, že jsme pevným našich problémy.Naše konečnou verzi Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange vypadá podobně jako následující:

[TestMethod]
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
    // arrange
    double beginningBalance = 11.99;
    double debitAmount = 20.0;
    BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);

    // act
    try
    {
        account.Debit(debitAmount);    
    }
    catch (ArgumentOutOfRangeException e)
    {
        // assert
        StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
        return;
    }
    Assert.Fail("No exception was thrown.");
}

V této části finální v práci jsme jste provedli zlepšování našich testovací kód vedla k více robustní a informativní zkušební metody.Ale je důležité, k další analýze také vedla k lepší kód v naší projektu testovaný.