Nunit参数化TestFixtures参数在运行时设置?

时间:2010-08-31 02:08:06

标签: unit-testing nunit nunit-2.5

我感兴趣的是能够通过静态方法或返回IEnumerable的属性在运行时传递给它的构造函数参数来实例化多个testfixtures。

在Nunit 2.5中,他们引入了参数化测试和测试夹具。这些允许您编写单个测试并使用TestCase属性提供的几个输入运行它,并编写单个测试类并分别使用不同的构造函数参数实例化它的多个实例。

除此之外,还可以使用TestCaseSource属性基于属性或方法的输出创建多个测试用例。这将使用实现IEnumerable的方法/属性的输出来创建一组测试用例,列表中每个对象一个。这是我希望能够做到的,但是在夹具层面而不是测试层面。


我的用例的一些背景知识:

我正在测试模拟软件,以及必须在任何模拟运行之前加载(来自序列化对象)的“模拟环境”。大约有5种不同类型的sim,所以我的测试类有5种测试方法(每种类型的sim都有一种)。我目前正在使用继承(而不是参数化的装置)来运行几个(大约六个)仿真环境下的测试用例,这些仿真环境来自生产数据。

我的麻烦源于这样一个事实:在最近尝试增加代码覆盖率时,我们自动生成了所有可能的仿真组件组合,从而产生了100多个sim环境。我不想为每个这些创建继承类,所以我使用TestCaseSource,其属性返回文件夹中的所有工作空间,并修改测试,以便他们(重新)加载测试本身的sim环境每个测试用例。

理想情况下,我希望每个模拟环境都有一个夹具,并确定它们在运行时的数量/数量。我知道我可以通过将sim环境路径硬编码为100多个TestFixture属性来做前者,我可以做后者吗?

1 个答案:

答案 0 :(得分:5)

我通过电子邮件向Nunit-Discuss list发送了关于此问题的电子邮件,并从Charlie Poole收到了以下回复。简而言之,这还不可能,但正在考虑Nunit的未来版本。

  

您好,

     

简单地说,你想要的是什么   来了,但它还没到。   参数化的灯具(就像你一样   已发现)受事实限制   你只能使用那些参数   在属性中是允许的。我们想要   有一种允许使用的方式   测试的属性和方法   案件,但固定装置更多一点   复杂,因为类型可能   通用的。

     

您是否考虑过使用通用名称?   夹具作为解决方法?你可以   作为一个类型传递在环境中(或   类型)和任何构造函数参数   作为非类型参数。我不知道   你的应用程序,所以带上一粒   盐,但是如何... ...

[TestFixture(typeof(Environment1), 42, "string")]
public class TestClass<T>
{
    IEnvironment env;

    public TestClass(int n, string s)
    {
       env = new T( n, s);
    }
    ...

}
     

请注意,这是“maillistcode”所以   可能行不通。 : - )

     

查理