多個數據源
當您尋找一或多個 DataSource 的組合擴充時,多個 DataSource 很有用(數據表型 DataSource、 PICT 型 DataSource 或 WMI 型 DataSource)。
製作測試設計,以有效率地使用這項功能是最重要的。 讓我們看看範例為何如此。 假設做為多個 DataSource 的一部分,您想要指定兩個數據表型數據源、一個以 WMI 為基礎的 DataSource 和一個 PICT 型 DataSource。 為了自變數,假設第一個數據表有 4 個數據列,第二個數據表有 5 個數據列,WMI 查詢會傳回 2 個結果,而 PICT DataSource 會產生 6 個成對的組合。 TAEF 會想出這些參數集的結合擴充。 這表示將叫用有問題的測試方法(4 X 5 X 2 X 6 =) 240 次! 使用不同參數組合來增加測試方法的調用數目,可能會降低測試涵蓋範圍的結果。 如此一來,請務必謹慎地使用多個 DataSource 來設計測試,並權衡其他替代方案。 以下是您可能想要考慮的一些要點:
- 請確定其增加值以擁有多個數據表。 如果您不需要將它們分開,您可以自行想出有效率的參數組合。
- 檢查您是否可以使用 PICT 模型檔案搭配條件約束,而不是多個數據表。
- 檢查將測試案例重構為多個測試,並將多個 DataSource 子集與每個新建立的子測試產生關聯時是否有值。
指定多個 DataSource
此處的主要層面是如何指定 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 規格的分號分隔清單。 規格在Managed程式代碼中看起來也非常類似。
管理
[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
[DataSource("Table:CSharpAdvancedDataDrivenTests.xml#FirstTable;WMI:SELECT ProcessId FROM Win32_Service WHERE Name='Themes'")]
只要重新逐一查看: 測試方法將會針對每個個別 DataSource 所產生的數據集,執行一次 n 向組合式擴充。 例如,針對上述 Managed 範例,安全地假設只有一個主題服務正在執行,而且知道提供數據表數據源中有 3 個數據列,就會叫用測試方法 3 次(1 X 3)。 在原生範例案例中,在 SecondTable 測試方法中,指定了兩個數據表 DataSource。 第一個數據表包含 3 個數據列,而第二個數據表包含 4 個數據列。 因此,系統會叫用測試方法 12 次(3 X 4)。
指定多個數據源時套用的條件約束
只有在您想要在多個 DataSource 規格中指定數據表型 DataSource 時,條件約束才適用。 Table DataSource 必須指定為 XML 檔案>#<TableId> 的 Table:<relative 路徑。 如果 TAEF 發現 「TableId」 是以個別元數據的形式提供,則會假設 DataSource 是單一數據表式 DataSource,然後繼續進行。