5

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

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

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


我的用例的一些背景:

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

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

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

4

1 回答 1

5

我通过电子邮件发送了有关此问题的Nunit-Discuss 列表,并从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”,因此可能不起作用。:-)

查理

于 2010-09-02T02:25:11.407 回答