NUnit:TestCaseSource将测试分配给特定的测试方法

时间:2016-02-02 14:51:49

标签: c# unit-testing nunit testcasesource

我计划将所有测试用例存储在excel文件中,其中列表示测试方法名称,参数和预期结果;但是,我发现TestCaseSource只是将所有测试用例分配给每个测试方法。我想知道有什么方法可以根据我在电子表格中放入的方法名称为方法选择NUnit选择测试用例吗?

感谢。

2 个答案:

答案 0 :(得分: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是线程静态的。所以你可以并行运行测试。

答案 1 :(得分: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]};
        }
    }
 }