Sdílet prostřednictvím


Vytvoření testu jednotek řízeného daty

Pro spravovaný kód můžete nastavit metodu testování jednotek pro načtení hodnot ze zdroje dat pomocí architektury Microsoft Unit Test Framework (MSTest). Metoda se spouští postupně pro každý řádek ve zdroji dat, což usnadňuje testování různých vstupů pomocí jedné metody.

Test jednotek řízený daty může použít libovolný z následujících typů:

  • vložená data pomocí atributu DataRow
  • data členů pomocí atributu DynamicData
  • od některého dobře známého poskytovatele zdroje pomocí atributu DataSource

Metoda pod testem

Předpokládejme například, že máte:

  1. Řešení označované jako MyBank přijímá a zpracovává transakce pro různé typy účtů.

  2. Projekt volaný MyBankBankDb , který spravuje transakce pro účty.

  3. Třída volaná Maths v BankDb projektu, která provádí matematické funkce k zajištění, že jakákoli transakce je výhodné pro banku.

  4. Projekt testu jednotek volaný BankDbTests k otestování chování BankDb komponenty.

  5. Třída testu jednotek volána MathsTests k ověření chování Maths třídy.

Otestujeme metodu, která Maths přidá dvě celá čísla pomocí smyčky:

public int AddIntegers(int first, int second)
{
    int sum = first;
    for (int i = 0; i < second; i++)
    {
        sum += 1;
    }

    return sum;
}

Testovací metoda

Vložený test řízený daty

U vložených testů msTest používá DataRow k určení hodnot používaných testem řízeným daty. Test v tomto příkladu se postupně spustí pro každý řádek dat.

[TestMethod]
[DataRow(1, 1, 2)]
[DataRow(2, 2, 4)]
[DataRow(3, 3, 6)]
[DataRow(0, 0, 1)] // The test run with this row fails
public void AddIntegers_FromDataRowTest(int x, int y, int expected)
{
    var target = new Maths();
    int actual = target.AddIntegers(x, y);
    Assert.AreEqual(expected, actual,
        "x:<{0}> y:<{1}>",
        new object[] {x, y});
}

Test řízený daty členů

MSTest používá DynamicData atribut k určení názvu, typu (vlastnosti, výchozí nebo metody) a definování typu (ve výchozím nastavení aktuální typ) člena, který poskytne data používaná testem řízeným daty.

public static IEnumerable<object[]> AdditionData
{
    get
    {
        return new[]
        { 
            new object[] { 1, 1, 2 },
            new object[] { 2, 2, 4 },
            new object[] { 3, 3, 6 },
            new object[] { 0, 0, 1 }, // The test run with this row fails
        };
    }
}

[TestMethod]
[DynamicData(nameof(AdditionData))]
public void AddIntegers_FromDynamicDataTest(int x, int y, int expected)
{
    var target = new Maths();
    int actual = target.AddIntegers(x, y);
    Assert.AreEqual(expected, actual,
        "x:<{0}> y:<{1}>",
        new object[] {x, y});
}

Pomocí vlastnosti DynamicData atributu je také možné přepsat výchozí vygenerovaný zobrazovaný názevDynamicDataDisplayName. Podpis metody zobrazovaného názvu musí být public static string a musí přijímat dva parametry, první typ MethodInfo a druhý typ object[].

public static string GetCustomDynamicDataDisplayName(MethodInfo methodInfo, object[] data)
{
    return string.Format("DynamicDataTestMethod {0} with {1} parameters", methodInfo.Name, data.Length);
}

[DynamicData(nameof(AdditionData), DynamicDataDisplayName = nameof(GetCustomDynamicDataDisplayName))]

Test řízený daty poskytovatele zdroje

Vytvoření testu jednotek řízeného zdrojem dat zahrnuje následující kroky:

  1. Vytvořte zdroj dat obsahující hodnoty, které používáte v testovací metodě. Zdrojem dat může být libovolný typ zaregistrovaný na počítači, který test spouští.

  2. Přidejte veřejnou TestContext vlastnost typu TestContext do testovací třídy.

  3. Vytvoření metody testování jednotek

  4. DataSourceAttribute Přidejte do něj atribut.

  5. Pomocí vlastnosti indexeru DataRow načtěte hodnoty, které používáte v testu.

Vytvoření zdroje dat

Pokud chcete metodu AddIntegers otestovat, vytvořte zdroj dat, který určuje rozsah hodnot parametrů a součet, který očekáváte, že se vrátí. V tomto příkladu vytvoříme databázi Sql Compact s názvem MathsData a tabulkou s názvem AddIntegersData , která obsahuje následující názvy a hodnoty sloupců.

FirstNumber Druhé číslo Sum
0 1 1
1 0 2
2 -3 -1

Přidání testContextu do testovací třídy

Architektura testování jednotek vytvoří TestContext objekt pro uložení informací o zdroji dat pro test řízený daty. Architektura pak nastaví tento objekt jako hodnotu TestContext vlastnosti, kterou vytvoříte.

public TestContext TestContext { get; set; }

V testovací metodě přistupujete k datům prostřednictvím DataRow vlastnosti indexeru objektu TestContext.

Poznámka:

.NET Core nepodporuje atribut DataSource . Pokud se pokusíte získat přístup k testovacím datům tímto způsobem v projektu testování jednotek .NET Core, UPW nebo WinUI, zobrazí se chyba podobná " TestContext" neobsahuje definici pro DataRow a nebyla nalezena žádná přístupná metoda rozšíření DataRow, která přijímá první argument typu TestContext (chybí direktiva using nebo odkaz na sestavení?)".

Napsání testovací metody

Testovací metoda je AddIntegers poměrně jednoduchá. Pro každý řádek ve zdroji dat volejte hodnoty sloupce FirstNumber a SecondNumber jako parametry a ověřte návratovou hodnotu pro hodnotu sloupce Sum:AddIntegers

[TestMethod]
[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0; Data Source=C:\Data\MathsData.sdf;", "Numbers")]
public void AddIntegers_FromDataSourceTest()
{
    var target = new Maths();

    // Access the data
    int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
    int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]);
    int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
    int actual = target.AddIntegers(x, y);
    Assert.AreEqual(expected, actual,
        "x:<{0}> y:<{1}>",
        new object[] {x, y});
}

Zadání atributu DataSourceAttribute

Atribut DataSource určuje připojovací řetězec pro zdroj dat a název tabulky, kterou používáte v testovací metodě. Přesné informace v připojovací řetězec se liší podle toho, jaký druh zdroje dat používáte. V tomto příkladu jsme použili databázi SqlServerCe.

[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0;Data Source=C:\Data\MathsData.sdf", "AddIntegersData")]

Atribut DataSource má tři konstruktory.

[DataSource(dataSourceSettingName)]

Konstruktor s jedním parametrem používá informace o připojení uložené v souboru app.config pro řešení. DataSource Nastavení Name je název elementu Xml v konfiguračním souboru, který určuje informace o připojení.

Pomocí souboru app.config můžete změnit umístění zdroje dat, aniž byste museli provádět změny samotného testu jednotek. Informace o tom, jak vytvořit a použít soubor app.config , naleznete v tématu Návod: Použití konfiguračního souboru k definování zdroje dat

[DataSource(connectionString, tableName)]

Konstruktor DataSource se dvěma parametry určuje připojovací řetězec pro zdroj dat a název tabulky, která obsahuje data pro testovací metodu.

Připojovací řetězec závisí na typu typu zdroje dat, ale měl by obsahovat prvek Provider, který určuje invariantní název zprostředkovatele dat.

[DataSource(
    dataProvider,
    connectionString,
    tableName,
    dataAccessMethod
    )]

Použití TestContext.DataRow pro přístup k datům

Pokud chcete získat přístup k datům v AddIntegersData tabulce, použijte TestContext.DataRow indexer. DataRowDataRow je objekt, takže načtěte hodnoty sloupců podle názvů indexů nebo sloupců. Vzhledem k tomu, že se hodnoty vrátí jako objekty, převeďte je na odpovídající typ:

int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);

Spuštění testu a zobrazení výsledků

Po dokončení psaní testovací metody sestavte testovací projekt. Testovací metoda se zobrazí v Průzkumníkutestů ve skupině Nespouštět testy . Při spuštění, zápisu a opětovném spuštění testů zobrazí Průzkumník testů výsledky ve skupinách neúspěšných testů, úspěšných testů a neúspěšných testů. Pokud chcete spustit všechny testy, můžete zvolit možnost Spustit vše , nebo můžete zvolit podmnožinu testů, které se mají spustit.

Panel výsledků testů v horní části Průzkumníka testů je animovaný při spuštění testu. Na konci testovacího spuštění bude pruh zelený, pokud byly všechny testy úspěšné nebo červené, pokud některý z testů selhal. Souhrn testovacího spuštění se zobrazí v podokně podrobností v dolní části okna Průzkumníka testů. Výběrem testu zobrazíte podrobnosti testu v dolním podokně.

Poznámka:

Pro každý řádek dat existuje výsledek a také jeden souhrnný výsledek. Pokud test prošel na každém řádku dat, zobrazí se souhrnné spuštění jako Úspěšné. Pokud test selhal na libovolném řádku dat, zobrazí se souhrnné spuštění jako neúspěšné.

Pokud jste spustili některou AddIntegers_FromDataRowTestAddIntegers_FromDynamicDataTest z metod nebo v AddIntegers_FromDataSourceTest našem příkladu, panel výsledků se změní na červenou a testovací metoda se přesune do neúspěšných testů. Test řízený daty selže, pokud některý z iterated metod ze zdroje dat selže. Když v okně Průzkumníka testů zvolíte neúspěšný test řízený daty, zobrazí se v podokně podrobností výsledky každé iterace, která je identifikována indexem datového řádku. V našem příkladu se zdá, že AddIntegers algoritmus nezpracuje správně záporné hodnoty.

Při opravě metody pod testem a opětovné spuštění testu se panel výsledků změní na zelenou a testovací metoda se přesune do skupiny Úspěšné testy .