NUnit 3:禁止并行测试

时间:2016-03-14 08:49:33

标签: c# nunit nunit-3.0

我安装了最新的NUnit(3.2.0),并且我的所有测试都是并行运行的。它可能看起来像是理想的行为,但我没有要求它,实际上它打破了我的一些测试。我在[OneTimeSetUp]中进行了一些与线程相关的初始化,似乎我无法强制NUnit按顺序运行我的测试。我已经阅读了documentation并且它声明默认情况下测试并非并行运行,但实际上它们是!

此外,我尝试添加以下属性:[assembly: Parallelizable(ParallelScope.None)] - 没有运气。

有人知道如何改变这种行为吗?

P.S。我使用ReSharper运行它,但也尝试使用MSVS加载项。

UPD:我正在使用MVVM Light DispatcherHelper.Initialize()(在[OneTimeSetUp]内)来存储调度程序对象,该对象稍后会被几个测试使用。如果线程不同(在测试和安装方法之间),则测试中的操作将异步执行,我的测试将失败。

我已经在不同的测试中检查了线程ID,它们都是不同的。

UPD2:摘自文档:

  

NUnit 3.0框架可以在一个内部并行运行测试   装配即可。这是一个与Engine完全独立的设施   并行测试执行,虽然可以同时使用   同样的试运行。

     

默认情况下,不会执行并行执行。属性用于指示哪些测试可以并行运行以及它们如何相关   其他测试。

如果它并不意味着组件中的测试不应该在明确指定之前并行运行那么它意味着什么?为什么[assembly: Parallelizable(ParallelScope.None)]对测试并行执行没有影响?

UPD3: 可能会在下面找到问题的答案,但是如果您遇到DispatcherHelper.Initialize(),我只需要从OneTimeSetUp中删除此初始化,并在每个使用a的测试中添加以下行调度器:

DispatcherHelper.Reset();
DispatcherHelper.Initialize();

2 个答案:

答案 0 :(得分:18)

NUnit不保证所有测试都在同一个线程上运行,因此观察到您的测试在不同的线程上运行并不意味着它们并行运行。

文档仅说明测试将按顺序或并行运行。您可能会解释这意味着它们在同一个线程上运行,但内部实现可能需要在不同线程上运行测试的原因有很多。超时是一个例子,我们生成一个线程并在测试超时的情况下终止它,但还有很多其他的。

并行测试运行是NUnit 3的新增功能,因此内部实现从NUnit 2更改。强制线程中的所有测试在同一线程上运行的属性可能很有用,因此可以随意提交{{3} }。

抱歉,我对MVVM Light不熟悉,所以我无法建议如何编组回OneTimeSetup线程。

更新 - 由于这是web和async的常见用法,因此NUnit团队已决定提供一个属性,该属性要求测试在与fixture {s {的同一个线程上运行{ {1}}。这将在下一个版本中,3.4或在修补程序3.2.1版本中。如果您想跟踪进度,请参阅enhancement requestissue

更新2 - 您现在可以将OneTimeSetup添加到TestFixture,以向跑步者表明SingleThreadedAttributeOneTimeSetUp和所有子测试必须运行在同一个线程上。

答案 1 :(得分:5)

您可以通过添加[NonParallelizable]属性来阻止测试并行运行,该属性可以在测试,类和程序集级别添加。