SpecFlow和NCrunch:在单线程中执行时出现多线程错误

时间:2016-05-30 08:22:20

标签: c# multithreading nunit specflow ncrunch

我们将解决方案从SpecFlow1.9更新为2.0,将NUnit2.6.4更新为3.2.1。在调整了一些属性和项目设置后,所有测试都在NUnit中正常运行。但是,当使用NCrunch执行SpecFlow测试时,我们得到一个SpecFlowException:

TechTalk.SpecFlow.SpecFlowException : The ScenarioContext.Current static accessor cannot
 be used in multi-threaded execution. Try injecting the scenario context to the binding
 class. See http://go.specflow.org/doc-multithreaded for details.
 at TechTalk.SpecFlow.ScenarioContext.get_Current()

我们有意为单线程环境设计了SpecFlow测试(以保持低成本),我们只想在一个线程中继续执行这些测试。因此,不是将场景上下文作为建议的解决方案注入(我们使用NInject而不是SpecFlow mini-IoC),我们正在寻找一些设置来说服SpecFlow它在单线程环境中运行。

以下是NCrunch 2.23.0.2设置:

我在所有SpecFlow测试的Assembly.cs文件中输入了以下属性:

[assembly: Parallelizable(ParallelScope.None)] 

没有成功;异常不断出现。

是否有人知道如何使用NUnit3.2.1在NCrunch2.23.0.2中强制使用SpecFlow2.0,以便它认为它在单线程环境中执行?

感谢您的努力!

2016-5-31:更新

我安装了SpecFlow的新版本2.1(自2016-5-25开始提供),但它没有解决问题。

我使用最少量的代码创建了example project来生成问题。计算器实现是statefull,无法在多线程环境中进行测试。

由于CustomContext中的(虚拟)静态引用“ScenarioContext.Current”,SpecFlow抛出异常。是的,如果您打算在多线程测试环境中运行,我知道您应该注入它。问题是,SpecFlow认为它处于多线程环境中,但它不是,它不应该。

2 个答案:

答案 0 :(得分:2)

经过调查,这似乎是NCrunch,SpecFlow和NUnit3之间的3向兼容性问题。

作为其行为的一部分,NCrunch将通过多次调用它们来重新使用测试过程(即,对于处理队列中的每批测试一次)。因为NUnit3为每个测试会话启动一个新线程,所以每次调用SpecFlow时都会使用不同的线程。

SpecFlow通过跟踪线程ID来识别多线程执行,并且因为每个会话都有一个新线程,所以它错误地认为代码是并行运行的,而实际上它只是同步使用不同的线程。

设置'测试进程内存限制'全局NCrunch配置设置为' 1'将允许您解决问题,因为这将导致NCrunch在每个批次之后丢弃测试过程,而不是重新使用它。不幸的是,这将对性能产生重大影响。

我已向SpecFlow报告此问题。由于它的性质,最明智的做法是将它固定在SpecFlow本身 - https://github.com/techtalk/SpecFlow/issues/638

答案 1 :(得分:0)

升级后需要重新生成Feature文件的代码隐藏文件。

请参阅此处的升级步骤:http://gasparnagy.com/2016/01/specflow-tips-how-to-upgrade-your-project-to-specflow-v2/