我有一个关于使用NUnit 3.8.0.0,.NET 4.0和C#的参数化装置和方法进行测试并行化的问题。
我目前正在开发一个测试套件,它使用一组资源中的每个资源运行测试。由于初始化这些资源非常耗时,并且资源不保留状态,因此我希望在我的测试用例之间共享它们,以便提高性能。这些资源不能通过多次测试同时同时使用。
为了做到这一点,我用一个带有一个参数的构造器创建了一个基础夹具,这使得夹具指向正确的资源。来自此灯具的实际测试夹具子类。
我有一个使用constuctor参数(传递给基类)和测试用例参数的测试工具。基于该参数,基类初始化一些资源。这些资源不能同时使用。
现在,我尝试以这样的方式并行化这些测试用例,即在MyParameterizedTestFixture(V1)
,MyParameterizedTestFixture(V2)
类生成的不同装置中进行测试。可以同时运行,但在同一夹具中的测试不能(因为资源不能同时使用)。此外,不同的夹具类可能不并行运行。
我的代码看起来像这样(详细摘录了):
[TestFixture]
[TestFixtureSource(typeof(TestData), "FixtureParams")]
public class MyParameterizedTestFixture : BaseFixture
{
public MyParameterizedTestFixture(Resource resource) : base (resource) { }
[Test]
public void Test1() { /* run test using Resource */ }
[TestCaseSource("Params")]
public void TestParameterized(object param) { /* run test using Resource and param */ }
}
我尝试将Parallelizable(ParallelScope.Self)]
添加到我的派生灯具中,但这导致使用相同资源(即具有相同version
)灯具参数的不同灯具进行测试,同时运行(当只选择一个灯具。
使用[Parallelizable(ParallelScope.Fixture)]
肯定不正确,因为它会导致不同的灯具一起运行。使用[Parallelizable(ParallelScope.Children)]
也是不正确的,因为它会导致灯具中的不同测试用例一起运行,而不是同一类中的不同灯具。
现在我想知道我想要的东西是否可以通过使用'分层'方法存档(标记灯具可以某种方式并行化,以另一种方式标注方法),还是可以定义自定义并行范围?
答案 0 :(得分:1)
NUnit允许您并行运行任何灯具。当夹具并行运行时,它可以与任何其他并联夹具同时运行。对可以一起运行但不与其他灯具一起运行的灯具进行分组的一些方法将是一个很好的功能,但它不是我们现在拥有的那个
如果您有相同灯具的多个实例 - 即通用或参数化灯具 - NUnit会将这些实例与处理任何灯具的方式完全相同。也就是说,如果灯具是可并行化的,则实例可以与任何其他实例同时运行,也可以与不同灯具的实例同时运行。
同样,您可以并行运行测试用例(方法)。如果并联壳体包含在非平行夹具中,则它仅与该夹具的其他方法并行运行。如果它包含在并行夹具中,那么它可以与任何其他并行方法同时运行。
换句话说,凭借我们目前拥有的功能,并行性基本上是每个测试的全部或全部,无论是套件,夹具还是测试用例。这可能会随着未来版本的增强而改变。