首页 > 解决方案 > 是否可以在整个夹具上而不是在逐个测试的基础上更改 NUnit 测试名称约定?

问题描述

我想使用模板“{m}({1})”。现在我可以提供TestName = "{m}({1})"每一个TestCase属性。但是这样重复太多了。也有这个TestFixture参数,但是使用它似乎没有任何效果:

    [TestFixture(TestName = "{m}({1})")]
    public class Tests
    {
...
    }

我的问题 - 是否可以通过指定一次而不是在每个TestCase属性中指定给定夹具中所有测试的测试名称约定?

编辑 1

我想继续使用该TestCase属性,即使 usingTestCaseSource允许我只指定一次模板。

标签: nunit

解决方案


您可以避免在每个 TestCase 属性中设置名称,TestCaseSource方法TestCaseData如下:

[TestFixture]
public class UnitTest1 
{
    [TestCaseSource(typeof(MyDataClass), nameof(MyDataClass.TestCases))]
    public void DivideTest(int n, int d) 
    {
        Assert.AreEqual(3, n / d);
    }
}

public class MyDataClass 
{
    public static IEnumerable TestCases 
    {
        get 
        {
            yield return new MyTestCaseData(9, 3);
            yield return new MyTestCaseData(30, 10);
            yield return new MyTestCaseData(12, 4);
        }
    }
}

public class MyTestCaseData : TestCaseData 
{
    public MyTestCaseData(object arg1, object arg2) : base(arg1, arg2) 
    {
        SetName("{m}({1})");
    }
}

SetName方法TestCaseData允许设置单个测试用例的名称。因此,创建一个从 TestCaseData 派生的新类并在构造函数中设置名称将避免为每个 TestCase 属性设置名称,也使代码更清晰。

解决方案 2:(不使用 TestCaseSource 和 TestCases) 无法在本地使用TestFixture TestName属性和使用属性。TestCase但是可以通过创建和使用自定义属性来实现相同的结果,例如MyTestCaseAttr- 继承自TestCaseAttribute并在其构造函数中设置名称的类(避免每次都设置名称)

[TestFixture]
public class UnitTest1
{
    [MyTestCaseAttr(12, 4)]
    public void DivideTest(int n, int d)
    {
        Assert.AreEqual(3, n / d);
    }

    [MyTestCaseAttr(4, 5, 6)]
    public void AddTest(int a, int b, int c)
    {
        Assert.AreEqual(15, a + b + c);
    }
}

public class MyTestCaseAttr : TestCaseAttribute
{
    public MyTestCaseAttr(object arg1, object arg2) : base(arg1, arg2)
    {
        TestName = "{m}({1})";
    }

    public MyTestCaseAttr(object arg1, object arg2, object arg3) : base(arg1, arg2, arg3)
    {
        TestName = "{m}({1})";
    }
}

推荐阅读