23

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

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

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

PS 我使用 ReSharper 运行它,但也尝试使用 MSVS 插件。


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

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


UPD2:文档摘录:

NUnit 3.0 框架可以在程序集中并行运行测试。这是与引擎并行测试执行完全分开的工具,尽管可以在同一测试运行中使用两者。

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

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


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

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

2 回答 2

25

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

该文档仅说明测试将按顺序或并行运行。您可能会认为这意味着它们在同一个线程上运行,但内部实现可能需要在不同线程上运行测试的原因有很多。超时就是一个例子,如果测试超时,我们会生成一个线程并杀死它,但还有很多其他的。

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

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

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

更新 2 - 您现在可以添加到 TestFixture 以向运行器SingleThreadedAttribute指示和所有子测试必须在同一线程上运行。OneTimeSetUpOneTimeTearDown

于 2016-03-15T21:48:45.143 回答
19

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

于 2017-09-11T06:43:19.797 回答