【问题标题】:Nunit parameterised TestFixtures with parameters set at runtime?Nunit参数化TestFixtures在运行时设置参数?
【发布时间】:2010-08-31 02:08:05
【问题描述】:

我对能够实例化多个测试夹具感兴趣,这些测试夹具在运行时通过静态方法或返回 IEnumerable 的属性传递给它的构造函数参数。

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

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


我的用例的一些背景:

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

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

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

【问题讨论】:

    标签: unit-testing nunit nunit-2.5


    【解决方案1】:

    我为此向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”所以 可能不起作用。 :-)

    查理

    【讨论】:

    • 不幸的是,代码确实不起作用。 env = new T(n, s); 产生错误:“'T': 在创建变量类型的实例时无法提供参数”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多