共用方式為


數位支援資料驅動測試範例

本節涵蓋以範例方式進行數據驅動測試的一些進階功能。 如果您仍然涵蓋基本概念,建議您從 簡單數據驅動範例開始。

參考的範例:

  • 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 屬性。 首先,您必須明確指定 SizeColor 參數的類型,並藉由將 Array 屬性設定為 true 來指定這些參數為數位。 然後,您可以在 <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。 練習中,請嘗試自行撰寫和執行此查詢。