0

在当前的 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  
{  
   ...  
}  

我怎样才能做到这一点?还是有更好的方法?

非常感谢您的帮助。

最好的问候,
爱德华

4

3 回答 3

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()方法中实例化类型并调用工厂方法 - 但我认为这可能有点过于复杂。

于 2010-01-07T07:37:10.267 回答
0

看看那里:

http://www.dotnetspider.com/resources/26499-Making-NUnit-test-cases-data-driven.aspx

[TestCaseSource] 和 TestCaseData 是您要查找的类

于 2011-09-26T15:17:08.580 回答
0

现在可以在 NUnit 3.x 中使用 TestFixtureSource 属性。创建一个使用您的值实现 IEnumerable 的类,然后像这样使用它:

[TestFixtureSource(typeof(Foo), Category = "Quux")]
public class BarTest
{    
     public BarTest(object baz)
     {
         _baz = baz;
     {
}

TestCaseSource 发生变化并适用于 TestFixtureSource 的一件事是,您必须给它一个实现 IEnumerable 的类型或给它一个静态方法。如果您依赖从构造函数生成数据的属性或方法,那么您需要以静态方式重构,或者只让类实现 IEnumerable 本身并将其作为源类型传入。

于 2016-03-08T18:01:05.477 回答