數位支援資料驅動測試範例
本節涵蓋以範例方式進行數據驅動測試的一些進階功能。 如果您仍在涵蓋基本概念,您可能想要從簡單數據驅動範例開始。
參考的範例:
ArraySupportDataDrivenExample
CSharpDataDrivenArraySupportExample
上一節已涵蓋數據驅動測試撰寫和執行的基本概念。 下列清單討論 TAEF 資料驅動測試感知中陣列的意義:
- 陣列是可變長度、同質型別集合,被視為單一參數。
- 若要指定數位類型,您必須在ParameterTypes區塊中明確指定參數的類型,並新增Array=“true” 屬性。
支援的參數類型會列在數據表數據源的參數類型中。
如果指定任何其他數據類型,測試會擲回警告,並將它視為 String。 在陣列的情況下,數據類型會被視為 String[] 類型。
下列範例示範如何指定 參數是其中一個基本型別的陣列。 請務必注意,陣列案例中不允許默認類型 - 您必須明確指定類型,並將參數的 Array 屬性設定為 true。
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>
檢查上述範例中的 Value 標記和 Array 屬性。 首先,您必須將 Array 屬性設定為 true,明確指定 Size 和 Color 參數的類型,並指定這些參數是數位。 然後,您會在 Value>... 中<指定值...</Value> 標記。 您可以有任意數目 <的 Value> 標籤,因為您需要為指定的 Row 參數指定數位中任意數目的值。
請注意上述 XML 範例中的行 9、10、30 和 33。 這些專案是單一值陣列元素。 換句話說,您可以直接在Parameter>標記中<指定單一值陣列元素,而不需要額外的 <Value> 標記。此外,即使數據列中的參數只有一個值,它仍會被視為一個元素的陣列,否則無法擷取。
現在,請查看擷取 API。
原生擷
您可以使用 WEX::TestExecution::TestDataArray<> 範本類別,在機器碼中擷取數位元素。 如需詳細資訊,請參閱已發佈的標頭TestData.h。 TestDataArray 類別會管理數位元素的存留期,並提供實用的 API 來擷取數位的特定值:
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 */
您可以藉由呼叫 GetSize 來取得數位的長度,而且可以使用 運算子 []來取得特定元素。
下一個範例示範如何在程式碼中使用這些函式。 請考慮原生範例中的 cpp 檔案:
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 }
首先,您會定義數位類型的本機 TestDataArray。 在此情況下,大小是int類型的數位,色彩是WEX::Common::String 類型的陣列。 要擷取數位的 API 類似於擷取任何變數的 API。 您可以呼叫 TestData::TryGetValue、要求其擷取參數 大小,並將值放入局部變數 大小中。
請注意,嘗試將非陣列指定的參數擷取至陣列會導致錯誤並失敗測試。 同樣地,嘗試將陣列擷取到非數位變數,即使陣列只有一個專案,也會導致錯誤。
如果未在 XML 數據列中指定數位參數,則嘗試擷取參數會失敗。 例如,如果 Row 看起來像這樣:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
請注意 ,Row 中未指定參數 Size,也就是陣列。 如果您嘗試從程式代碼擷取 Size,API 呼叫會傳回失敗的傳回碼。 您可以使用此選項來定義預設數位值。
另一方面,您可以指定 Size 的空白參數標記,以指定空陣列,如下所示:
<Row>
<Parameter Name="Size"></Parameter>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
在此情況下,嘗試擷取 大小 會成功,但陣列大小會是0。
Managed 擷
Managed 擷取幾乎與之前相同, 只有您必須確定將值擷取到適當數位類型的局部變數中。 請考慮下列 Managed 範例:
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 }
與原生擷取類似,如果在 XML 數據列中完全未指定數位參數,則嘗試擷取參數會傳回 System.DBNull 類型的物件。 例如,如果 Row 看起來像這樣:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
請注意 ,Row 中未指定參數 Size,也就是陣列。 如果您嘗試從程式代碼擷取 Size,API 呼叫會傳回 DBNull 類型的物件。 如果您的數據表中有任何這類值,您可能想要先從內容擷取這些值到物件,並在比較對象的類型與 typeof(System.DBNull) 或執行物件類型之後採取適當的步驟。
另一方面,您可以藉由指定 Size 的空白參數標記來指定空陣列,如下所示:
<Row>
<Parameter Name="Size"></Parameter>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
在此情況下,嘗試擷取大小會傳回 System.Int32[] 類型的空陣列。
執行
執行支援數位的數據驅動測試與執行任何其他資料驅動測試並無不同。 唯一的主要差異 點是,在數位數據參數的案例中,選取準則的 sematics 會變更為表示 「contains」 而不是 「equals」。。
若要查看這是什麼意思,假設您想要選取 Color 陣列包含 White 值的所有資料驅動測試。 若要這樣做,請執行:
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'"
此命令會在上述兩種情況下,以索引 #0 和 #3 執行數據驅動測試。
您可以建立更複雜的查詢,例如,只選取色彩數位包含白色的測試,而色彩數位包含黑色,這隻會選取具有索引的數據驅動測試 #3。 練習中,請嘗試自行撰寫和執行此查詢。