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
并且所有子测试必须在同一线程上运行.