问题描述
我安装了最新的NUnit(3.2.0),并且所有测试都是并行运行的。这可能看起来像是令人满意的行为,但我并没有要求这样做,实际上它通过了我的一些测试。我在[OneTimeSetUp]
中有一些依赖于线程的初始化,似乎无法强制NUnit按顺序运行测试。我已经阅读了documentation,它说明默认情况下测试不并行运行,但实际上它们是并行运行的!
此外,我还尝试添加以下属性:[assembly: Parallelizable(ParallelScope.None)]
-运气不佳。
有人知道如何更改此行为吗?
附注:我使用ReSharper运行它,但也尝试使用MSVS加载项。
更新:我正在使用MVVM LightDispatcherHelper.Initialize()
(在[OneTimeSetUp]
内部)存储Dispatcher对象,该对象稍后将被两个测试使用。如果线程不同(在测试方法和设置方法之间),则测试中的操作将异步执行,并且我的测试将失败。
我在不同的测试中检查了线程ID,它们都是不同的。
更新2:文档摘录:
NUnit 3.0框架可以在 程序集。这是一个与发动机完全分开的设施。 并行测试执行,尽管可以在 相同的测试运行。如果这并不意味着在显式指定之前,程序集中的测试不应该并行运行,那么这意味着什么呢?为什么默认情况下,不进行并行执行。属性用于指示哪些测试可以并行运行,以及它们与 其他测试。
[assembly: Parallelizable(ParallelScope.None)]
对测试并行执行没有影响?
更新3:
问题的答案可能在下面找到,但是如果您(就像我一样)使用DispatcherHelper.Initialize()
,您只需要从OneTimeSetUp
中删除此初始化,并在每个使用调度程序的测试中放入以下行:
DispatcherHelper.Reset();
DispatcherHelper.Initialize();
推荐答案
nUnit不保证所有测试都将在同一线程上运行,因此观察到测试在不同线程上运行并不意味着它们是并行运行的。
文档仅说明测试将按顺序或并行运行。您可能会认为这意味着它们在同一线程上运行,但是内部实现可能需要测试在不同的线程上运行的原因有很多。Timeout就是一个示例,我们会在测试超时时派生一个线程并终止它,但还有很多其他线程。并行测试运行是NUnit 3的新增功能,因此内部实现已从NUnit 2更改。强制线程内的所有测试在同一线程上运行的属性可能很有用,因此可以随时提交enhancement request。
很抱歉,我不熟悉MVVM Light,因此我无法建议如何封送回OneTimeSetup线程。
更新-由于这是Web和异步的常见用法,NUnit团队决定提供一个属性,该属性将要求测试在与fixture的OneTimeSetup
相同的线程上运行。这将在下一个版本(3.4)或热修复3.2.1版本中提供。如果要跟踪进度,请参阅issue和pull request。
更新2-您现在可以将SingleThreadedAttribute
添加到TestFixture,以向运行者指示OneTimeSetUp
、OneTimeTearDown
和所有子测试必须在同一线程上运行。
这篇关于nUnit 3:禁止测试并行运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!