すべてのテスト ケースを Excel ファイルに保存する予定です。列には、テスト メソッド名、パラメーター、および期待される結果が示されています。ただし、TestCaseSource はすべてのテスト ケースをすべてのテスト メソッドに割り当てるだけであることがわかりました。スプレッドシートに入力したメソッド名に基づいて、NUnit にメソッドのテスト ケースを選択させる方法はあるのでしょうか?
ありがとう。
すべてのテスト ケースを Excel ファイルに保存する予定です。列には、テスト メソッド名、パラメーター、および期待される結果が示されています。ただし、TestCaseSource はすべてのテスト ケースをすべてのテスト メソッドに割り当てるだけであることがわかりました。スプレッドシートに入力したメソッド名に基づいて、NUnit にメソッドのテスト ケースを選択させる方法はあるのでしょうか?
ありがとう。
これを行う方法があります。たとえば、あなたが言及したように、カスタム属性を作成できます。
アイデアは、テストの名前をに渡すことTestCaseSource
です。別のクラスとして
作成することでそれを行うことができます。TestCaseSource
まず、TestCaseSource
クラス:
public class SpreadSheetTestCaseSource
{
[ThreadStatic]
public static string TestName = String.Empty;
public static IEnumerable TestCases
{
get
{
SpreadSheetTestCaseProvider.GetTestCases()
.Where(testCase => testCase.TestName == TestName);
}
}
}
次に属性:
public class MyTestCaseSourceAttribute : TestCaseSourceAttribute
{
public MyTestCaseSourceAttribute(Type sourceType, string sourceName,
[CallerMemberName] string name = null)
: base(sourceType, sourceName)
{
SpreadSheetTestCaseSource.TestName = name;
}
//Another two members impl.
}
そしてテスト:
[TestFixture]
public class TestClass
{
[MyTestCaseSource(typeof(SpreadSheetTestCaseSource), "TestCases")]
public void TestMethod()
{
//Test logic
}
}
SpeadSheetTestCaseSource.TestName
スレッド静的です。したがって、テストを並行して実行できます。
これは、NUnit が直接サポートする機能ではありません。さまざまな TestCaseSource タイプの属性には、入力に基づいてテスト メソッドをフィードする機能がありません。
オプションは、テスト メソッドごとに TestCaseSource を作成することです。これらはそれぞれ、メソッド名を単一の内部メソッドに渡す単純なラッパーになります。その内部メソッドは Excel ファイルを読み取り、指定されたメソッド名の行のみを返します。
疑似コード;
[TestCaseSource(nameof(TestMethodOneSource))]
public void TestMethodOne(int x, int y, int expected)
{
Assert.That(x + y, Is.EqualTo(expected));
}
public static IEnumerable<object[]> TestMethodOneSource() =>
ReadExcel(nameof(TestMethodOne));
private static IEnumerable<object[]> ReadExcel(string method)
{
// Open and start reading Excel
for(var row in rows)
{
if(row[0] == method)
{
// Return objects minus the method
yield return new [] {row[1], ..., row[n]};
}
}
}