NUnit 3:禁止并行测试 运行

NUnit 3: Forbid tests to run in parallel

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

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

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

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


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

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


UPD2: 文档摘录:

The NUnit 3.0 framework can run tests in parallel within an assembly. This is a completely separate facility from Engine Parallel Test Execution, although it is possible to use both in the same test run.

By default, no parallel execution takes place. Attributes are used to indicate which tests may run in parallel and how they relate to other tests.

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


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

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

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

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

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

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

Update - 由于这是 web 和异步的常见用法,NUnit 团队决定提供一个属性,要求测试 运行线程作为夹具的 OneTimeSetup。这将出现在下一个版本 3.4 或修补程序 3.2.1 版本中。如果您想跟踪进度,请参阅 issue and the pull request.

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

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