複数のデータソースは、1 つ以上のデータソース (テーブル ベースのデータソース、 PICT ベースのデータソース、または WMI ベースのデータソース) の組み合わせ拡張を探している場合に便利です。
この機能を効率的に使用するためにテスト設計を作成することが最も重要です。 これがなぜそうなのか、例の助けを借りて見てみましょう。 たとえば、複数のデータソースの一部として、2 つのテーブル ベースのデータソース、1 つの WMI ベースのデータソース、1 つの PICT ベースのデータソースを指定するとします。 引数として、最初のテーブルに 4 行、2 番目のテーブルに 5 行、WMI クエリから 2 つの結果が返され、PICT DataSource によって 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 行目を参照してください。 一般に、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);
}
また、複数行で複数のデータソースを指定する方法も示しています。 もちろん、(次に示すように) 1 行で DataSource を指定することもできますが、上記のコンストラクトを使用することで読みやすさを大幅に向上させることができます。
1 行での DataSource の指定
[DataSource("Table:CSharpAdvancedDataDrivenTests.xml#FirstTable;WMI:SELECT ProcessId FROM Win32_Service WHERE Name='Themes'")]
繰り返し処理を行うためだけに、 テスト メソッドは、個々の DataSource によって生成されたデータ セットの n 方向の組み合わせ拡張ごとに 1 回実行されます。 たとえば、上記のマネージド例では、実行中の Themes サービスが 1 つだけであり、提供されたテーブル データ ソースに 3 つの行があることを認識すると、テスト メソッドは 3 回 (1 X 3) 呼び出されます。 ネイティブの例では、SecondTable テスト メソッドでは、2 つのテーブル DataSource が指定されています。 最初のテーブルには 3 行、2 番目のテーブルには 4 行が含まれています。 そのため、テスト メソッドは 12 回 (3 X 4) 呼び出されます。
複数のデータソースを指定するときに適用される制約
制約は、複数の DataSource 仕様でテーブル ベースのデータソースを指定する場合にのみ適用されます。 Table DataSource は、XML ファイルへの Table:<relative パスとして指定する必要があります>#<TableId>。 TAEF は、"TableId" が別のメタデータとして提供されていることを検出した場合、DataSource が単一のテーブル ベースの DataSource であると想定し、続行します。