NUnit 3:禁止并行测试

ixS*_*Sci 11 c# nunit nunit-3.0

我安装了最新的NUnit(3.2.0),并且我的所有测试都是并行运行的.它可能看起来像是理想的行为,但我没有要求它,实际上它打破了我的一些测试.我有一些初始化,[OneTimeSetUp]其中依赖于线程,似乎我无法做任何事情迫使NUnit按顺序运行我的测试.我已经阅读了文档,并指出默认情况下测试不是并行运行,而实际上它们是!

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

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

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


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

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


UPD2:摘自文档:

NUnit 3.0框架可以在程序集中并行运行测试.这是与发动机并行测试执行完全独立的设施,尽管可以在同一测试运行中使用两者.

默认情况下,不会执行并行执行.属性用于指示哪些测试可以并行运行以及它们与其他测试的关系.

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


UPD3: 问题的答案可能在下面找到,但是如果你被卡住了(就像我一样),DispatcherHelper.Initialize()你只需要从OneTimeSetUp每个使用调度程序的测试中删除此初始化并放入以下行:

DispatcherHelper.Reset();
DispatcherHelper.Initialize();
Run Code Online (Sandbox Code Playgroud)

Rob*_*use 19

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

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

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

对不起,我不熟悉MVVM Light,所以我不能建议如何编组回OneTimeSetup线程.

更新 - 由于这是web和async的常见用法,因此NUnit团队决定提供一个属性,该属性要求测试在与fixture相同的线程上运行OneTimeSetup.这将在下一个版本中,3.4或在修补程序3.2.1版本中.如果要跟踪进度,请查看问题拉取请求.

更新2 -您现在可以添加SingleThreadedAttribute到的TestFixture以指示的亚军OneTimeSetUp,OneTimeTearDown并且所有子测试必须在同一线程上运行.

  • 谢谢你的回答。您不认为最好提及即使以非并行方式也可以在不同线程上运行测试吗?在一些显眼的地方,我想。这个答案也应该有所帮助,因为现在很容易用谷歌搜索这样的行为,但我也认为文档应该以某种方式提及它。 (3认同)
  • 我可以添加一个名为文档页"事情你不应该假设" :-)现在,这里是错误的假设一堆我多年来遇到:(1)不要认为你的构造函数,每次运行只调用一次作者:NUnit(2)不要假设你的测试是在一个独特的线程上运行 - 尽管你可以要求NUnit这样做(3)不要假设你的测试都在同一个线程上运行(4)不要假设你的测试都按照它们在源文件中出现的顺序或按字母顺序运行.说真的,请在github上发布这样一个页面的建议,https:github.com/nunit/docs (3认同)

Nir*_*Nir 7

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