在参数化测试中无法访问NUnit测试属性

时间:2017-11-22 12:19:17

标签: c# nunit nunit-3.0

使用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将有" SomeProperty":" foo"在RegularTest之后拆除时,但在ParametrizedTest之后它们将是空的。为什么会这样,除了使用反射之外,我该如何处理呢?

1 个答案:

答案 0 :(得分:3)

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

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

如果您使用lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000 , 0, (LocationListener) this); //get Location Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); la = String.valueOf(location.getLatitude()); searchla.setText("Latitude: "+ la); lo = String.valueOf(location.getLongitude()); searchlo.setText("Longitude: "+lo); 指定测试用例,则无法添加新属性,尽管您可以指定一些众所周知的属性,例如description。解决方法是使用TestCaseAttribute指定案例,并为每个案例提供TestCaseSourceAttribute的单个实例。 TestCaseData类允许您为每个案例设置属性。

不可否认,这不是很方便,但它是一种解决方法。