0

我们将解决方案从 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 日起可用),但没有解决问题。

我用最少的代码创建了一个示例项目来生成问题。计算器实现是有状态的,不能在多线程环境中测试。

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

4

2 回答 2

2

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

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

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

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

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

于 2016-06-03T09:32:11.347 回答
0

您需要在升级后重新生成功能文件的代码隐藏文件。

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

于 2016-05-30T10:30:11.863 回答