Sdílet prostřednictvím


Zdroj dat tabulky

Než budete pokračovat v této části, ujistěte se, že znáte základní provádění TAEF a víte, jak používat k vytváření testů.

Teď, když máte napsanou základní automatizaci testů a pracujete s taEF, se můžete soustředit na scénáře, ve kterých se dá stejný testovací kód použít k práci na různých sadách dat. Pro tento účel poskytuje TAEF přístup založený na tabulce k testům řízeným daty. Pojďme se podívat na jednoduchý příklad, abychom pochopili, jak vytvořit test řízený daty.

Představte si jednoduchý příklad bez dat, ve kterém tisknete velikost a motiv do konzoly. V tomto cvičení tento test převedete na test řízený daty.

1  namespace WEX { namespace TestExecution { namespace Examples
2  {
3     void DataDrivenTests::FirstTable()
4     {
5         int size = 12;
6         Log::Comment(String().Format(L"Size retrieved was %d", size));
7     }
8
9     void DataDrivenTests::SecondTable()
10    {
11        String theme = "Aero";
12        Log::Comment(L"Theme supplied as " + theme);
13    }
14 } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */

definování dat

Teď chcete, aby výše uvedená funkce fungovala pro sadu velikostí a motivů. Jinými slovy, chcete hodnoty variant dat, které naše funkce může využívat. Chcete-li to provést, definujte dvě tabulky v souboru XML DataDrivenTests.xml:

1  <?xml version="1.0"?>
2  <Data>
3  <Table Id ="Table1">
4          <ParameterTypes>
5                  <ParameterType Name="Size">Int32</ParameterType>
6                  <ParameterType Name="Color">String</ParameterType>
7                  <ParameterType Name="Transparency">Boolean</ParameterType>
8          </ParameterTypes>
9          <Row Priority="1" Owner="C2">
10                 <Parameter Name="Size">12</Parameter>
11                 <Parameter Name="Color">Blue</Parameter>
12                 <Parameter Name="Transparency">True</Parameter>
13         </Row>
14         <Row Priority="2" Owner="wex">
15                 <Parameter Name="Size">4</Parameter>
16                 <Parameter Name="Color">White</Parameter>
17                 <Parameter Name="Transparency">False</Parameter>
18         </Row>
19         <Row Owner="C2">
20                 <Parameter Name="Size">9</Parameter>
21                 <Parameter Name="Color">Black</Parameter>
22                 <Parameter Name="Transparency">True</Parameter>
23         </Row>
24 </Table>
25 <Table id ="Table2">
26         <Row Description="ButtonTest" Owner="C2" Priority="1">
27                 <Parameter Name="Control">Button</Parameter>
28                 <Parameter Name="Theme">Aero</Parameter>
29         </Row>
30         <Row Description="ComboBoxTest" Priority="2">
31                 <Parameter Name="Control">ComboBox</Parameter>
32                 <Parameter Name="Theme">Classic</Parameter>
33         </Row>
34         <Row Description="ListviewTest" Owner="wex">
35                 <Parameter Name="Control">Listview</Parameter>
36                 <Parameter Name="Theme">AeroBasic</Parameter>
37         </Row>
38 </Table>
39 </Data>

Teď jste definovali dvě tabulky, Table1 a Table2. Můžete definovat tabulky pro několik testovacích metod ve stejném souboru XML.

Všimněte si, že v tabulce Table1 jste předem definovali parametry ParameterTypes a jako celé číslo jste zvolili Velikost. Oddíl ParameterTypes je volitelný. Pokud nejsou zadané informace o typu parametru, uloží se ve výchozím nastavení jako řetězec. Toto je případ všech parametrů v tabulce 2.

Každý řádek definovaný v tabulce je sada hodnot dat (parametru), které chcete, aby testovací funkce přijímala. Řádky 9, 14 a 19 definují 3 sady dat, které by naše funkce FirstTable přijala. Podobně řádky 26, 30 a 34 definují datové sady pro SecondTable.

Všimněte si řádků 9, 14, 19, 26, 30 a 34 v příkladu výše – můžete definovat metadata specifická pro řádek. Teď existuje způsob, jak změnit informace o metadatech pomocí datových sad pro stejnou funkci. Priorita první sady dat (řádek 9) je 1, priorita druhé sady dat (řádek 14) je 2 a třetí sada dat (řádek 19) je výchozí prioritou funkce. Všechny řádky dědí metadata z funkce, ke které je tabulka přidružená. Pokud se stejná metadata znovu zadává na úrovni řádku, přepíše hodnoty metadat definované na úrovni funkce.

POZNÁMKA: Definice schématu souboru XML je stejná pro nativní i spravovaný kód s výjimkou podporovaných definic typů. Další příklad definování dat najdete níže v úvodní části "Managed Data Driven Test" (Spravovaný test řízený daty). Pokračujte v nativním testu řízeném daty a seznamte se s typy povolenými v nativním kódu.

nativní datově řízený test

S definovanými a připravenými sadami dat teď potřebujete způsob, jak kvalifikovat testovací funkci jako test řízený daty a přidružit ji k tabulce, která definuje datovou sadu. K tomu slouží další metadata při vytváření testu:

1  namespace WEX { namespace TestExecution { namespace Examples
2  {
3      class DataDrivenTests
4      {
5          TEST_CLASS(DataDrivenTests);
6
7          BEGIN_TEST_METHOD(SecondTable)
8              TEST_METHOD_PROPERTY(L"DataSource", L"Table:DataDrivenTests.xml#Table2")
9              TEST_METHOD_PROPERTY(L"Priority", L"3")
10         END_TEST_METHOD()
11
12         BEGIN_TEST_METHOD(FirstTable)
13             TEST_METHOD_PROPERTY(L"Priority", L"4")
14             TEST_METHOD_PROPERTY(L"DataSource", L"Table:DataDrivenTests.xml#Table1")
15         END_TEST_METHOD()
16     };
17 } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */

Chcete-li přidružit tabulku XML k testu, přidejte metadata "DataSource" do metody testu. Prostřednictvím tohoto přidružení TAEF použije daný Zdroj dat k řízení testu. Hodnota DataSource má tři části:

  1. Tabulka:" – identifikuje zdroj dat jako tabulku XML.
  2. 'DataDrivenTests.xml' - to je soubor, který obsahuje tabulku XML.
  3. '#Table2' - Po delimetru '#' hodnota 'Table2' identifikuje konkrétní tabulku v dokumentu XML, který se má použít. Jeden zdroj dat tabulky XML může obsahovat více tabulek. TAEF prohledá soubor XML pro element Table s atributem 'Id', který odpovídá zadané hodnotě.

V předchozím příkladu jste možná zaznamenali, že "SecondTable" je definován před "FirstTable". To znamená, že funkce "SecondTable" se spustí před funkcí "FirstTable", ale definovali jste "Table1", tabulku odpovídající "FirstTable", před "Table2", tabulku odpovídající "SecondTable". Je třeba zdůraznit, že pořadí, v jakém je tabulka definována, je irelevantní během zjišťování a provádění testů řízených daty.

Po dokončení mapování našeho zdroje dat na testovací metodu nyní můžete upravit příklad, abyste získali data ze zdroje. Než to uděláte, podívejte se na publikovaný soubor hlaviček TestData.h. Část, která nás zajímá, je:

1    class TestData
2    {
3    public:
4        template <typename T>
5        static HRESULT __stdcall TryGetValue(_In_z_ const wchar_t* pszString, T& result)
6        {
7            return Private::TestData<T>::TryGetValue(pszString, result);
8        }
9    };

Řádek 5 ukazuje rozhraní API pro volání, aby bylo možné načíst data ve funkci. Podívejte se na dostupné typy parametrů pro načtení.

Tak – vše je připraveno k přepisu našeho příkladu.

1  namespace WEX { namespace TestExecution { namespace Examples
2  {
3      void DataDrivenTests::FirstTable()
4      {
5          Log::Comment(L"I am in first table");
6          int size;
7          if (SUCCEEDED(TestData::TryGetValue(L"size", size)))
8          {
9              VERIFY_ARE_NOT_EQUAL(size, 0);
10             Log::Comment(String().Format(L"Size retrieved was %d", size));
11         }
12     }
13
14     void DataDrivenTests::SecondTable()
15     {
16         Log::Comment(L"I am in second table.");
17         String theme;
18         if (SUCCEEDED(TestData::TryGetValue(L"theme", theme)))
19         {
20             Log::Comment(L"Theme supplied as " + theme);
21         }
22     }
23 } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */

Řádky 7 a 18 jsou hlavní části, které se změnily, aby byl test řízen daty. Není to velká změna. Podívejte se na spouštění testů řízených daty, abyste pochopili, jak maximálně využít taEF při provádění testů řízených daty.

test řízený spravovanými daty

Představte si příklad, ve kterém chcete vytisknout souřadnice obdélníku na konzole. Začněte definováním těchto souřadnic jako datové sady v souboru XML.

1  <?xml version="1.0"?>
2  <Data>
3  <Table Id="FirstTable">
4          <ParameterTypes>
5                  <ParameterType Name="Left">Int32</ParameterType>
6                  <ParameterType Name="Right">String</ParameterType>
7                  <ParameterType Name="Top">Integer</ParameterType>
8                  <ParameterType Name="Bottom">Int32</ParameterType>
9          </ParameterTypes>
10         <Row Priority="1" Owner="C2" Description="Zero rect">
11                 <Parameter Name="Left">0</Parameter>
12                 <Parameter Name="Right">0</Parameter>
13                 <Parameter Name="Top">0</Parameter>
14                 <Parameter Name="Bottom">0</Parameter>
15         </Row>
16         <Row Priority="2" Owner="wex" Description="normal rect">
17                 <Parameter Name="Left">12</Parameter>
18                 <Parameter Name="Right">25</Parameter>
19                 <Parameter Name="Top">10</Parameter>
20                 <Parameter Name="Bottom">50</Parameter>
21         </Row>
22         <Row Owner="C2" Description="invalid rect">
23                 <Parameter Name="Left">30</Parameter>
24                 <Parameter Name="Right">15</Parameter>
25                 <Parameter Name="Top">40</Parameter>
26                 <Parameter Name="Bottom">10</Parameter>
27         </Row>
28 </Table>
29 </Data>

Definujte datovou sadu v oboru tabulky, v tomto případě FirstTable, která je definována na řádku 3 výše. Můžete definovat tabulky pro několik testovacích metod ve stejném souboru XML.

Všimněte si, že FirstTable definuje ParameterTypes předem a určuje, že "Left" je typu "Int32". Oddíl ParameterTypes je volitelný. Pokud nejsou zadány informace o typu parametru, uloží se ve výchozím nastavení jako řetězec.

Podívejte se na seznam podporovaných typů parametrů .

Pokud je zadán jakýkoli jiný datový typ, test vyvolá upozornění a považuje ho za řetězec.

POZNÁMKA: Řetězce typu nerozlišují velká a malá písmena, ale musí se psát přesně tak, jak je znázorněno výše.

Každý řádek definovaný v tabulce je sada hodnot dat (parametru), které chcete, aby testovací funkce přijímala. Řádky 10, 16 a 22 definují 3 sady dat, které naše funkce obsahuje.

Všimněte si řádků 10, 16 a 22 v příkladu výše – můžete definovat metadata specifická pro řádek. Teď máte způsob, jak změnit informace o metadatech pomocí datových sad pro stejnou funkci. Priorita první sady dat (řádek 10) je 1, priorita pro druhou sadu dat (řádek 16) je 2 a třetí sada dat (řádek 22) se ve výchozím nastavení nastaví na prioritu funkce. Všechny řádky dědí metadata z funkce, ke které je tabulka přidružená. Pokud se stejná metadata znovu zadává na úrovni řádku, přepíše hodnoty metadat definované na úrovni funkce.

POZNÁMKA: Definice schématu souboru XML je stejná pro nativní i spravovaný kód s výjimkou podporovaných definic typů. Podívejte se na část "Definování dat" v horní části této stránky, kde najdete další příklad toho, jak tuto možnost definovat.

Teď máte všechna definovaná data. Následující příklad ukazuje, jak k němu získat přístup.

1  namespace WEX.Examples
2  {
3      using Microsoft.VisualStudio.TestTools.UnitTesting;
4      using System;
5      using System.Collections;
6      using WEX.Logging.Interop;
7      using WEX.TestExecution;
8
9      [TestClass]
10     public class CSharpDataDrivenTests
11     {
12         [TestMethod]
15         [DataSource("Table:CSharpDataDrivenTests.xml#FirstTable")]
16         public void First()
17         {
18             Console.WriteLine("Left is " + m_testContext.DataRow["Left"].ToString());
19
20             Log.Comment("In CSharpDataDrivenTests.First");
21         }
22
23         [TestMethod]
24         public void Second()
25         {
26             Log.Comment("In CSharpDataDrivenTests.Second");
27             Verify.IsTrue(true);
28         }
29
30         public TestContext TestContext
31         {
32             get { return m_testContext; }
33             set { m_testContext = value; }
34         }
35
36         private TestContext m_testContext;
37     }
38 }

Přidružení tabulky XML k dané testovací metodě ve spravovaném kódu je velmi podobné nativnímu kódu; jednoduše použijte metadata "DataSource". Stejně jako předtím se skládá ze tří částí:

  1. Tabulka:" – k identifikaci zdroje dat jako tabulky XML.
  2. 'CSharpDataDrivenTests.xml' - soubor, který obsahuje tabulku XML.
  3. '#FirstTable' - Po delimetru '#' hodnota FirstTable identifikuje konkrétní tabulku v dokumentu XML, která se má použít. TAEF prohledá XML soubor pro element Table s atributem 'Id', který odpovídá zadané hodnotě.

Všimněte si, že druhá funkce není řízená daty. Můžete se rozhodnout, že budete mít jenom některé testy, které se mají řídit daty. Máte také možnost, že každý test má svou tabulku definovanou v jiném souboru XML.

V řádku 36 definujete soukromou vlastnost TestContext , jako je VSTS doporučuje TestContext třídy. Definujete také veřejné vyhodnocovače pro tuto vlastnost (řádky 30 až 34). Interně TAEF načte vlastnost slovníku TestContext s odpovídající sadou dat v fokusu.

TestContext je definován v Microsoft.VisualStudio.TestTools.UnitTesting. Viz řádek 3 v příkladu výše. Tuto referenci byste již měli začlenit do spravovaného vytváření příprav testů. Proto nejsou pro vytváření testů řízených daty vyžadovány žádné další odkazy.

Na řádku 18 výše uvedeného příkladu ukazujete, jak načíst data ve funkci. Všimněte si, že data jsou k dispozici v souboru m_testContext.DataRow.

název místo indexu k identifikaci objektu DataRow

TaEF umožňuje mít smysluplnější vlastnost Name místo indexu k identifikaci jakéhokoli objektu DataRow ve zdroji dat. Uděláte to jednoduše tak, že do zdroje dat přidáte metadata Name na úrovni řádku. První příklad na této stránce můžete upravit tak, aby používal tuto funkci následujícím způsobem:

1  <?xml version="1.0"?>
2  <Data>
3  <Table id ="Table1">
4          <ParameterTypes>
5                  <ParameterType Name="Size">Int32</ParameterType>
6                  <ParameterType Name="Color">String</ParameterType>
7                  <ParameterType Name="Transparency">Boolean</ParameterType>
8          </ParameterTypes>
9          <Row Name='BlueTransparent' Priority="1" Owner="C2">
10                 <Parameter Name="Size">12</Parameter>
11                 <Parameter Name="Color">Blue</Parameter>
12                 <Parameter Name="Transparency">True</Parameter>
13         </Row>
14         <Row Priority="2" Owner="wex">
15                 <Parameter Name="Size">4</Parameter>
16                 <Parameter Name="Color">White</Parameter>
17                 <Parameter Name="Transparency">False</Parameter>
18         </Row>
19         <Row Name='BlackTransparent' Owner="C2">
20                 <Parameter Name="Size">9</Parameter>
21                 <Parameter Name="Color">Black</Parameter>
22                 <Parameter Name="Transparency">True</Parameter>
23         </Row>
24 </Table>
25 ...
39 </Data>

V předchozím upraveném příkladu blueTransparent odpovídá indexu 0. Řádek s indexem 1 nemá žádný zvláštní název a řádek s indexem 2 má přiřazený název BlackTransparent. Stále můžete použít výběrový dotaz k vyhledání indexu 0 nebo 2 v tabulce Table1 a najde správný řádek. Ale při provádění nebo výpisu knihovny DLL místo zobrazení:

<qualified name of the test method>#<index>

místo toho uvidíte:

<qualified name of the test method>#<name property provided at Row level>

pro řádky, kde je atribut Name zadaný na úrovni řádku. Pokud vlastnost "Name" není zadána pro žádný řádek, například v případě indexu 1 výše, použije se jako výchozí #<index> v kvalifikovaném názvu metody.

Všimněte si, že zadáním atributu Name na úrovni řádku v podstatě měníte způsob, jakým taEF interpretuje název instance vyvolání metody s odpovídajícími daty řádků.

DataSource jako parametr modulu runtime

TAEF podporuje poskytování zdroje dat jako parametr modulu runtime. Syntaxe je následující:

te <test dll names> /p:<DataSource runtime name>=Table:<DataSoure XML file>#<Table Id>

Při vytváření testu, který je předmětem zájmu, musíte jako zdroj dat zadat "p:<název běhového času DataSource>". Nezapomeňte, že musíte zadat úplný řetězec – název souboru XML a ID tabulky společně – za běhu. Id tabulky se neočekává jako testovací metadata, pokud je zdroj dat poskytnut za běhu. Předpona Table:určuje, že hledáte zdroj dat tabulky.

Můžete to vyzkoušet s jedním z příkladů dostupných ve sdílené složce vydané verze:

te Examples\CPP.RuntimeDataSource.Example.dll /p:MyDataSource=Table:RuntimeDataSourceExample.xml#SimpleTable

Zdroj dat jako prostředek

TAEF vám umožňuje přidat zdroj dat jako součást testovacího modulu, pokud splňuje následující podmínky:

V případě nativních testovacích modulů to můžete provést zadáním zdroje dat jako ID prostředku nebo názvu prostředku. Tady je příklad kódu:

BEGIN_TEST_METHOD(ResourceNameDataSource)
    TEST_METHOD_PROPERTY(L"DataSource", L"Table:MyResourceName#SimpleTable")
END_TEST_METHOD()

MyResourceName je název prostředku, jak je definováno v souboru ResourceDataSource.rc v tomto případě:

MyResourceName DATASOURCE_XML "ResourceDataSource.xml"

V případě spravovaných testovacích modulů lze prostředek specifikovat pouze určitým způsobem, jak je uvedeno v úryvku souboru se zdroji níže:

LANGUAGE_NEUTRAL_MANAGED_RESOURCES = CSharpAdvancedDataDrivenTests.xml

Specifikace metadat Zdroje dat zůstane stejná jako v případě zadání souboru DATASource XML. Podobně jako u případu ve spravovaném kódu můžete nastavit název prostředku jako název souboru XML. Proto je důležité vědět, že taEF nejprve vyhledá přítomnost skutečného souboru s názvem Zdroje dat. Pokud takový soubor XML nebyl nalezen, bude pokračovat v hledání testovacího prostředku v testovacím modulu s daným názvem nebo ID prostředku. Vzhledem k tomu, že zadání Zdroje dat jako prostředku vyžaduje opětovné kompilaci, můžete tento návrh využít zkopírováním souboru DATASource XML do stejného umístění jako testovací dll při vývoji (a pojmenování názvu prostředku, který bude stejný jako název souboru XML). Jakmile dokončíte testování, zkopírujte XML zpět do adresáře kódu a znovu zkompilujte jako zdroj. Nezapomeňte odstranit soubor XML z adresáře spouštění! :)

příklady průchodů

Pokud chcete pochopit různé aspekty testování založeného na datech založených na tabulkách, přečtěte si několik dalších příkladů návodů: