Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In deze sectie worden enkele geavanceerde functies van gegevensgestuurde tests beschreven. Als u nog steeds de basisbeginselen beslaat, wilt u misschien beginnen met een Simple Data Driven Example.
Voorbeelden waarnaar wordt verwezen:
ArraySupportDataDrivenExample
CSharpDataDrivenArraySupportExample
In eerdere secties zijn de basisbeginselen van het ontwerpen en uitvoeren van gegevensgestuurde tests al besproken. In de volgende lijst wordt de betekenis van matrices in de zin van taEF-gegevensgestuurd testen besproken:
- matrices een variabele lengte zijn, een homogene set elementen die als één parameter worden behandeld.
- Als u een matrixtype wilt opgeven, moet u expliciet het type van de parameter opgeven in het blok ParameterTypes en een kenmerk Array="true" toevoegen.
De parametertypen die worden ondersteund, worden vermeld in parametertypen in tabelgegevensbronnen.
Als er een ander gegevenstype is opgegeven, genereert de test een waarschuwing en beschouwt deze als een tekenreeks. In het geval van matrices wordt het gegevenstype beschouwd als van het type String[].
In het volgende voorbeeld ziet u hoe u kunt opgeven dat de parameter een matrix is van een van de basistypen. Het is belangrijk te weten dat er geen standaardtypen zijn toegestaan in het geval van matrices. U moet expliciet het type opgeven en het kenmerk matrix instellen om de parameter waar te laten zijn.
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="ArraySupportTable">
4 <ParameterTypes>
5 <ParameterType Name="Size" Array="true">int</ParameterType>
6 <ParameterType Name="Color" Array="true">String</ParameterType>
7 </ParameterTypes>
8 <Row>
9 <Parameter Name="Size">4</Parameter>
10 <Parameter Name="Color">White</Parameter>
11 </Row>
12 <Row>
13 <Parameter Name="Size">
14 <Value>4</Value>
15 <Value>6</Value>
16 <Value>8</Value>
17 </Parameter>
18 <Parameter Name="Color">
19 <Value>Red</Value>
20 <Value>Green</Value>
21 <Value>Blue</Value>
22 </Parameter>
23 </Row>
24 <Row>
25 <Parameter Name="Size">
26 <Value>9</Value>
27 <Value>12</Value>
28 <Value>16</Value>
29 </Parameter>
30 <Parameter Name="Color">Orange</Parameter>
31 </Row>
32 <Row>
33 <Parameter Name="Size">9</Parameter>
34 <Parameter Name="Color">
35 <Value>White</Value>
36 <Value>Black</Value>
37 </Parameter>
38 </Row>
39 </Table>
40 </Data>
Bekijk de waarde tags en de kenmerken Matrix in het bovenstaande voorbeeld. Eerst moet u expliciet het type opgeven voor de parameters Grootte en Color en opgeven dat deze parameters matrices zijn, door het kenmerk Matrix in te stellen op true. Vervolgens geeft u de waarden op in <Waarde>...</Value> tags. U kunt zoveel <waarde> tags hebben als u een willekeurig aantal waarden in de matrix moet opgeven voor de parameter van een bepaalde rij.
Let op regels 9, 10, 30 en 33 in de bovenstaande XML-voorbeelden. Deze vermeldingen zijn matrixelementen met één waarde. Met andere woorden, kunt u matrixelementen met één waarde rechtstreeks opgeven in de tag <Parameter> zonder een extra <waarde> tag. ook hoewel de parameter in de rij slechts één waarde heeft, wordt deze nog steeds behandeld als een matrix van één element en kan deze anders niet worden opgehaald.
Bekijk nu de ophaal-API's.
systeemeigen ophaal
Matrixelementen kunnen worden opgehaald in systeemeigen code met behulp van de sjabloonklasse WEX::TestExecution::TestDataArray<>. Zie de gepubliceerde header TestData.h voor meer informatie. De TestDataArray- klasse beheert de levensduur van de matrixelementen en biedt nuttige API's voor het ophalen van specifieke waarden in de matrix:
1 namespace WEX { namespace TestExecution
2 {
3 template <typename T>
4 class TECOMMON_API TestDataArray sealed
5 {
6 ...
7 public:
8 TestDataArray();
9 ~TestDataArray();
10 const size_t GetSize() const;
11 T& operator[](size_t index);
12
13 private:
14 ...
15 };
16 } /* namespace TestExecution */ } /* namespace WEX */
U kunt de lengte van de matrix verkrijgen door GetSize- aan te roepen en een specifiek element te verkrijgen met behulp van de operator [].
In het volgende voorbeeld ziet u hoe u deze functies in de code gebruikt. Bekijk het cpp-bestand in het systeemeigen voorbeeld:
1 TestDataArray<int> sizes;
2 if (SUCCEEDED(TestData::TryGetValue(L"size", sizes)))
3 {
4 size_t count = sizes.GetSize();
5 for (size_t i = 0; i < count; ++i)
6 {
7 Log::Comment(String().Format(L"Size[%d] retrieved was %d", i, sizes[i]));
8 }
9 }
10
11 TestDataArray<String> colors;
12 if (SUCCEEDED(TestData::TryGetValue(L"color", colors)))
13 {
14 size_t count = colors.GetSize();
15 for (size_t i = 0; i < count; ++i)
16 {
17 Log::Comment(String().Format(L"Color[%d] retrieved was ", i) + colors[i]);
18 }
19 }
Eerst definieert u een lokale TestDataArray van het matrixtype. In dit geval is grootten een matrix van het type int en kleuren een matrix van het type WEX::Common::String is. De API voor het ophalen van een matrix is vergelijkbaar met de API die een variabele ophaalt. U roept TestData::TryGetValueaan, vraag het om de parameter grootteop te halen en plaats de waarde in de lokale variabele grootten.
Houd er rekening mee dat een poging om een niet-matrix opgegeven parameter op te halen in een matrix een fout veroorzaakt en de test mislukt. Een poging om een matrix op te halen in een niet-matrixvariabele, zelfs als de matrix slechts één element heeft, veroorzaakt een fout.
Als een matrixparameter helemaal niet is opgegeven in de XML-rij, mislukt een poging om de parameter op te halen. Als een rij er bijvoorbeeld als volgt uitziet:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
U ziet dat de parameter Grootte, een matrix, niet is opgegeven in de rij. Als u probeert Grootte op te halen uit de code, retourneert de API-aanroep een mislukte retourcode. U kunt dit gebruiken om een standaardmatrixwaarde te definiëren.
Aan de andere kant kunt u een lege matrix opgeven door als volgt een lege parametertag op te geven voor Grootte:
<Row>
<Parameter Name="Size"></Parameter>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
In dit geval zou een poging om grootte op te halen slagen, maar de matrixgrootte zou 0 zijn.
beheerde ophaaltijd
Beheerde ophaalbewerking blijft bijna hetzelfde als voorheen. Alleen u moet ervoor zorgen dat u de waarden ophaalt in een lokale variabele van het juiste matrixtype. Bekijk het volgende beheerde voorbeeld:
1 Int32[] sizes = m_testContext.DataRow["Size"] as Int32[];
2 foreach (int size in sizes)
3 {
4 Verify.AreNotEqual(size, 0);
5 Console.WriteLine("Size is " + size.ToString());
6 }
7
8 String[] colors = m_testContext.DataRow["Color"] as String[];
9 foreach (String color in colors)
10 {
11 Console.WriteLine("Color is " + color);
12 }
Net als bij het systeemeigen ophalen, als een matrixparameter helemaal niet is opgegeven in de XML-rij, retourneert een poging om de parameter op te halen een object van het type System.DBNull. Als een rij er bijvoorbeeld als volgt uitziet:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
U ziet dat de parameter Grootte, een matrix, niet is opgegeven in de rij. Als u probeert Grootte op te halen uit de code, retourneert de API-aanroep een object van het type DBNull-. Als u dergelijke waarden in de tabel hebt, kunt u ze eerst ophalen uit de context in een object en de juiste stappen uitvoeren nadat u het type object hebt vergeleken met typeof(System.DBNull) of het type dat u ervan uitgaat.
Aan de andere kant kunt u een lege matrix opgeven door als volgt een lege parametertag op te geven voor Grootte:
<Row>
<Parameter Name="Size"></Parameter>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
In dit geval retourneert een poging om grootte op te halen een lege matrix van het type System.Int32[].
uitvoeren
Het uitvoeren van gegevensgestuurde tests die ondersteuning bieden voor matrices, verschilt niet van het uitvoeren van een andere gegevensgestuurde test. Het enige belangrijke verschilpunt is dat de sematics van de selectiecriteria verandert in het geval van matrixgegevensparameters om te betekenen dat 'contains' in plaats van 'is gelijk aan'.
Als u wilt zien wat dit betekent, gaat u ervan uit dat u alle gegevensgestuurde tests wilt selecteren waarbij de matrix Color de waarde Whitebevat. Voer hiervoor het volgende uit:
TE.exe Examples\CSharp.DataDriven.Example.dll /select:"@Name='*Array* And @Data:Color='White'"
TE.exe Examples\CPP.DataDriven.Example.dll /select:"@Name='*Array* And @Data:Color='White'"
Met deze opdracht worden de gegevensgestuurde tests uitgevoerd met index #0 en #3 in beide bovenstaande gevallen.
U kunt complexere query's maken die bijvoorbeeld alleen de test selecteren waarin de kleur matrix witte bevat en de kleur matrix zwartebevat, waarmee alleen gegevensgestuurde tests met index 3 worden geselecteerd. Probeer deze query zelf te schrijven en uit te voeren.