當您尋找一或多個 DataSource 的組合擴充時,多個 DataSource 很有用 (資料表型 DataSource、 PICT 型 DataSource 或 WMI 型 DataSource)。
精心設計測試以有效利用此功能至關重要。 讓我們藉助一個例子來看看為什麼會這樣。 假設作為多個 DataSource 的一部分,您想要指定兩個資料表型 DataSource、一個 WMI 型 DataSource 和一個 PICT 型 DataSource。 為了進行論證,假設第一個資料表有 4 個資料列,第二個資料表有 5 個資料列,WMI 查詢傳回 2 個結果,而 PICT DataSource 會產生 6 個成對組合。 TAEF 會提出這些參數集的組合擴充。 這意味著相關測試方法將被調用 (4 X 5 X 2 X 6 =) 240 次! 就測試涵蓋範圍而言,使用不同的參數組合增加測試方法的調用次數可能會產生遞減的結果。 因此,使用多個資料來源來設計測試非常重要,並權衡其他替代方案。 以下是您可能需要考慮的一些要點:
- 確保擁有多個表能夠增加價值。 如果您不需要將它們分開,您可以自己想出一個有效的參數組合。
- 檢查您是否可以使用具有條件約束的 PICT 模型檔案,而不是多個表格。
- 檢查將測試案例重構為多個測試,並將多個資料來源中的子集與每一個新建立的子測試相關聯是否有價值。
指定多個資料來源
這裡的關鍵在於如何指定資料來源 (DataSource)。 讓我們來看看原生和託管範例中的程式碼片段。
土人
1 namespace WEX { namespace TestExecution { namespace Examples
2 {
3 class AdvancedDataDrivenTests
4 {
5 TEST_METHOD_SETUP(DataDrivenSetup);
6 TEST_METHOD_CLEANUP(DataDrivenCleanup);
7
8 TEST_CLASS(AdvancedDataDrivenTests)
9
10 BEGIN_TEST_METHOD(SecondTable)
11 TEST_METHOD_PROPERTY(L"DataSource", L"Table:AdvancedDataDrivenTests.xml#Table2;Table:CppTestLevelDataSource.xml#NestedTable")
12 END_TEST_METHOD()
13
14 BEGIN_TEST_METHOD(FirstTable)
15 TEST_METHOD_PROPERTY(L"DataSource", L"Table:AdvancedDataDrivenTests.xml#Table1;"
16 L"PICT:PictDataSource.txt;" L"WMI:SELECT Location FROM Win32_StartupCommand")
17 END_TEST_METHOD()
18 };
19 } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */
請參閱上述範例中的第 11、15 和 16 行。 一般來說,指定 DataSource 時應遵循的格式是一個以分號分隔的每個 DataSource 規格的清單。 該規格在託管代碼中看起來也非常相似。
管理
[TestMethod]
[DataSource(@"Table:CSharpAdvancedDataDrivenTests.xml#FirstTable;
WMI:SELECT ProcessId FROM Win32_Service WHERE Name='Themes'")]
public void First()
{
Log.Comment("In CSharpAdvancedDataDrivenTests.First");
String[] shapes = m_testContext.DataRow["Shape"] as String[];
foreach (String shape in shapes)
{
Console.WriteLine("The shape is " + shape);
}
Int32[] lengths = m_testContext.DataRow["Length"] as Int32[];
foreach (int length in lengths)
{
Console.WriteLine("The length is " + length.ToString());
}
String description = (String)m_testContext.DataRow["Description"];
Boolean desktopInteract = (Boolean)m_testContext.DataRow["DesktopInteract"];
UInt32 processId = (UInt32)m_testContext.DataRow["ProcessId"];
Log.Comment("Themes service is running on process " + processId.ToString());
Log.Comment("Themes service description: " + description);
}
這些範例也示範在多行中指定多個資料來源的方法。 當然,您可以在單行上指定 DataSource (如下所示),但您可以使用上述建構來大幅改善可讀性。
在一行中指定 DataSource
[DataSource("Table:CSharpAdvancedDataDrivenTests.xml#FirstTable;WMI:SELECT ProcessId FROM Win32_Service WHERE Name='Themes'")]
重申一下:對於 每個單獨的 DataSource 生成的數據集的每個 n 向組合擴展,測試方法將運行一次。 例如,對於上述託管範例,安全假設只有一個 Themes 服務在執行,並且知道提供的表格資料來源中有 3 個 Rows,則會叫用測試方法 3 次 (1 X 3)。 在本機範例案例中,在 SecondTable 測試方法中,指定了兩個資料表 DataSource。 第一個表格包含 3 個資料列,第二個資料表包含 4 個資料列。 因此,測試方法將被調用 12 次 (3 X 4)。
指定多個資料來源時套用的條件約束
只有在您想要在多個 DataSource 規格中指定表格型 DataSource 時,才適用限制。 表格資料來源 必須指定為 Table:<XML 檔案>的<相對路徑#TableId>。 如果 TAEF 發現「TableId」作為單獨的中繼資料提供,它會假設 DataSource 是基於單一資料表的 DataSource,並繼續進行。