在当前的NUnit版本中,我可以参数化TestFixture并多次实例化它。例如:
[TestFixture("var1")]
[TestFixture("var2")]
[TestFixture("var3")]
public class MyTestFixture
{
private string var;
public MyTestFixture(string var)
{
this.var = var;
}
...
}
这将使用参数参数实例化MyTestFixture 3次。我的问题是当前的NUnit没有TextFixture属性的数据源功能(只有TestCaseSource)。我需要根据数据输入实例化TestFixture,每个TestFixture都有一组不同的测试用例数据输入。由于TestCaseSource,测试用例数据驱动没问题。但是我如何为TestFixture属性执行此操作?
我的想法是动态生成TestFixture属性,然后将其更改为代码字符串并插入到测试代码中,例如:类似这样的内容:
ConvertToCode(GenerateTestFixture());
public class MyTestFixture
{
...
}
我该怎么做?或者有更好的方法吗?
非常感谢你的帮助。
最好的问候,
爱德华
答案 0 :(得分:3)
可以动态地为您的方法创建属性,但很难。你最好找另一种方法。
当您的代码被编译并自动插入代码时,编译器会读取您所拥有类型的属性(例如[TestFixture]
)。
要为类生成自己的属性,您需要使用Reflection.Emit之类的东西来修改生成的程序集作为项目的构建后步骤。这就像直接编写汇编语言(你将创建MSIL),这可能很有趣但不容易,并且会使你的代码很难维护!
另一种方法可能是让枚举控制测试用例,并有一个方法来检查枚举并返回适当的数据:
public enum TestController
{
Value1,
Value2,
Value3
}
[TestFixture(TestController.Value1)]
[TestFixture(TestController.Value2)]
[TestFixture(TestController.Value3)]
public class MyTestFixture
{
public MyTestFixture(TestController testController)
{
var dataForTest = GetDataForTest(testController);
}
...
}
然后方法GetDataForTest()
会有某种switch语句来生成数据。
另一种方法可能是使用类型而不是枚举,然后在GetDataForTest()
方法中实例化类型并调用工厂方法 - 但我认为这可能有点过于复杂。
答案 1 :(得分:0)
看看那里:
http://www.dotnetspider.com/resources/26499-Making-NUnit-test-cases-data-driven.aspx
[TestCaseSource]和TestCaseData是您正在寻找的类
答案 2 :(得分:0)
现在可以在NUnit 3.x中使用TestFixtureSource属性。创建一个使用您的值实现IEnumerable的类,然后像这样使用它:
[TestFixtureSource(typeof(Foo), Category = "Quux")]
public class BarTest
{
public BarTest(object baz)
{
_baz = baz;
{
}
使用TestCaseSource改变并适用于TestFixtureSource的一件事是,你必须给它一个实现IEnumerable的类型或给它一个静态方法。如果您依赖于从构造函数生成数据的属性或方法,那么您需要以静态方式重构,或者让类实现IEnumerable本身并将其自身作为源类型传递。