[英]NUnit 3: Forbid tests to run in parallel
我安装了最新的 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();
NUnit 不保证您的所有测试都在同一线程上运行,因此观察到您的测试在不同线程上运行并不意味着它们是并行运行的。
该文档仅说明测试将按顺序或并行运行。 您可能会认为这意味着它们在同一个线程上运行,但是内部实现可能需要在不同线程上运行测试的原因有很多。 Timeout 是一个例子,如果测试超时,我们会生成一个线程并杀死它,但还有很多其他的。
并行测试运行是 NUnit 3 的新功能,因此内部实现从 NUnit 2 更改。强制一个线程内的所有测试在同一线程上运行的属性可能很有用,因此请随时提交增强请求。
抱歉,我不熟悉 MVVM Light,因此我无法建议将回送至 OneTimeSetup 线程的方法。
更新- 由于这是 web 和 async 的常见用法,NUnit 团队决定提供一个属性,该属性将要求在与夹具的OneTimeSetup
相同的线程上运行测试。 这将出现在下一个版本 3.4 或修补程序 3.2.1 版本中。 如果您想跟踪进度,请参阅问题和拉取请求。
更新 2 - 您现在可以将SingleThreadedAttribute
添加到 TestFixture 以向运行程序指示OneTimeSetUp
、 OneTimeTearDown
和所有子测试必须在同一线程上运行。
您可以通过添加[NonParallelizable]属性来阻止测试并行运行,该属性可以在测试、类和程序集级别添加。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.