NUnit 测试属性在参数化测试中不可访问

NUnit test properties not accessible in parametrized tests

最初在使用 TestCaseSource 和自定义派生的 属性 属性时遇到。这是一个精炼的例子:

[TestFixture]
public class SomeTestFixture
{
    [Test, Property("SomeProperty", "foo")]
    public void RegularTest()
    {
    }

    [Test, Property("SomeProperty", "foo"), TestCase(0)]
    public void ParametrizedTest(int x)
    {
    }

    [TearDown]
    public void TearDown()
    {
        var properties = TestContext.CurrentContext.Test.Properties;
    }
}

properties 在 RegularTest 后拆卸时将有 "SomeProperty": "foo",但在 ParametrizedTest 后它们将是空的。为什么会这样?除了使用反射之外,我该如何解决?

NUnit 的一项功能是,参数化 测试上设置的属性适用于包含各个测试用例的套件。因此,您不应该以这种方式应用属性,除非您希望它们成为套件的属性,而不是测试用例。

当然,这可能是设计缺陷。至少,它会让用户感到困惑。

如果您使用 TestCaseAttribute 指定测试用例,则无法添加新的 属性,但您可以指定一些众所周知的属性,例如描述。解决方法是使用 TestCaseSourceAttribute 来指定案例并为每个案例提供单独的 TestCaseData 实例。 TestCaseData class 确实允许您在每种情况下设置 属性。

诚然,这不是很方便,但它是一种解决方法。