2

すべてのテスト ケースを Excel ファイルに保存する予定です。列には、テスト メソッド名、パラメーター、および期待される結果が示されています。ただし、TestCaseSource はすべてのテスト ケースをすべてのテスト メソッドに割り当てるだけであることがわかりました。スプレッドシートに入力したメソッド名に基づいて、NUnit にメソッドのテスト ケースを選択させる方法はあるのでしょうか?

ありがとう。

4

2 に答える 2

1

これを行う方法があります。たとえば、あなたが言及したように、カスタム属性を作成できます。
アイデアは、テストの名前をに渡すこと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スレッド静的です。したがって、テストを並行して実行できます。

于 2016-02-02T18:41:50.770 に答える
0

これは、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]};
        }
    }
 }
于 2016-02-02T16:01:09.663 に答える