【问题标题】:NUnit: TestCaseSource assigns tests to specific test methodsNUnit:TestCaseSource 将测试分配给特定的测试方法
【发布时间】:2016-02-02 14:51:48
【问题描述】:

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

谢谢。

【问题讨论】:

  • 您想为不同的测试方法使用一个TestCaseSource,以便每个测试将根据其名称仅运行一组特殊的测试用例吗?
  • 是的!更准确地说,我会将 TestCaseSource 属性放在所有测试方法上。

标签: c# unit-testing nunit testcasesource


【解决方案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
  • 非常感谢您的回复。只是一个问题,我怎样才能实现 SpreadSheetTestCaseSource 类。 SpreadSheetTestCaseProvider 是继承自 TestCaseProvider 对吧?
  • @LiuGarry,在这种情况下,SpreadSheetTestCaseSource 只是一个虚构的类。您可以通过多种方式实现它。我只是假设它将excel文档解析为IEnumerable<TestCaseData>
  • @LiuGarry 值得注意的是,excel并不是最简单的格式。 Excel 文档解析比 JSON 或 xml 解析更复杂。 (这只是一个例子。我不鼓励你使用这种格式)。
  • 我使用 excel 数据作为数据库,然后解析成 IEnumerable。非常感谢你。我自己试试看。
【解决方案2】:

这不是 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]};
        }
    }
 }

【讨论】:

  • 非常感谢。我已经考虑过了。问题是我会有很多测试方法,所以我需要为每个测试方法创建包装器。我想知道是否有办法创建自定义属性来实现这一点。
猜你喜欢
  • 2011-07-11
  • 2022-11-22
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多