複数のデータソース
複数のデータソースは、1 つ以上のデータソース (テーブル ベースのデータソース、PICT ベースのデータソース、または WMI ベースのデータソース) の組み合わせ拡張を探す場合に便利です。
この機能を効率的に使用するためのテスト設計を作成することが、最も重要です。 例の助けを借りて、その理由を考えてみましょう。 たとえば、複数のデータソースの一部として、2 つのテーブル ベースのデータソース、1 つの WMI ベースのデータソース、1 つの PICT ベースのデータソースを指定するとします。 仮定の話として、最初のテーブルに 4 行、2 番目のテーブルに 5 行があり、WMI クエリから 2 つの結果が返され、PICT データソースによって 6 つのペアの組み合わせが生成されたとします。 TAEF では、これらのパラメーター セットの組み合わせ拡張を導き出します。 つまり、問題のテスト メソッドは (4 x 5 x 2 x 6 =) 240 回呼び出されることになります。 パラメーターの組み合わせを変えながらテスト メソッドの呼び出し回数を増やすと、テスト カバレッジの範囲で、結果が減少する可能性があります。 このため、複数のデータソースを使用するテストは、他の選択肢を考慮しながら慎重に設計することが重要です。 考慮が必要な点を以下に示します。
- 複数のテーブルがある方が価値が高まることを確認します。 別々にする必要がなければ、自分で効率的なパラメーターの組み合わせを考えることができます。
- 複数のテーブルの代わりに、制約付きの PICT モデル ファイルを使用できるかどうかを確認します。
- テスト ケースを複数のテストにリファクタリングし、複数のデータソースのサブセットを新しく作成された各サブテストに関連付けることに価値があるかどうかを確認します。
複数のデータソースを指定する
ここで重要なのは、データソースを指定する方法です。 ネイティブとマネージドの例のコード スニペットを見てみましょう。
ネイティブ
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 行目を見てください。 一般に、データソースを指定する際に従うパターンは、各データソース仕様をセミコロンで区切ったリストです。 マネージド コードでも仕様は非常によく似ています。
マネージド
[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);
}
この例は、複数の行で複数のデータソースを指定する方法も示しています。 もちろん、(次に示すように) 1 行でデータソースを指定することもできますが、上記のコンストラクトを使用することで読みやすさを大幅に向上させることができます。
1 行でのデータソースの指定
[DataSource("Table:CSharpAdvancedDataDrivenTests.xml#FirstTable;WMI:SELECT ProcessId FROM Win32_Service WHERE Name='Themes'")]
繰り返しになりますが、テスト メソッドは、個々のデータソースによって生成されたデータ セットの n 通りの組み合わせ拡張ごとに 1 回実行されます。 たとえば、上記のマネージドの例では、実行中のテーマ サービスが 1 つだけであり、提供されたテーブル データ ソースに 3 つの行があると仮定すると、テスト メソッドは 3 (1 x 3) 回呼び出されます。 ネイティブの例の SecondTable テスト メソッドでは、2 つのテーブルのデータソースが指定されています。 最初のテーブルには 3 行、2 番目のテーブルには 4 行が含まれています。 そのため、テスト メソッドは 12 (3 X 4) 回呼び出されます。
複数のデータソースを指定する際に適用される制約
制約は、複数のデータソース仕様でテーブル ベースのデータソースを指定する場合にのみ適用されます。 Table DataSource は、XML ファイル>#<TableId> への Table:<relative パスとして指定する必要があります。 TAEF は、"TableId" が別のメタデータとして提供されていることを検出すると、データソースが単一のテーブル ベースのデータソースであると想定し、処理を続行します。