C# SpecFlow和NCrunch:在单线程中执行时出现多线程错误
我们将解决方案从SpecFlow1.9更新为2.0,从NUnit2.6.4更新为3.2.1。在调整了一些属性和项目设置之后,所有测试都可以在NUnit中正常运行。但是,当使用NCrunch执行SpecFlow测试时,我们会得到一个SpecFlow异常:C# SpecFlow和NCrunch:在单线程中执行时出现多线程错误,c#,multithreading,nunit,specflow,ncrunch,C#,Multithreading,Nunit,Specflow,Ncrunch,我们将解决方案从SpecFlow1.9更新为2.0,从NUnit2.6.4更新为3.2.1。在调整了一些属性和项目设置之后,所有测试都可以在NUnit中正常运行。但是,当使用NCrunch执行SpecFlow测试时,我们会得到一个SpecFlow异常: TechTalk.SpecFlow.SpecFlowException : The ScenarioContext.Current static accessor cannot be used in multi-threaded executi
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认为它处于多线程环境中,但它不是,也不应该是这样。升级后需要重新生成功能文件的代码隐藏文件
请参见此处的升级步骤:升级后,您需要重新生成功能文件的代码隐藏文件
请参阅此处的升级步骤:在调查中,这似乎是Nrunch、SpecFlow和NUnit3之间的三方兼容性问题 作为其行为的一部分,NCrunch将通过多次调用测试流程(即处理队列中的每批测试一次)来重用测试流程。因为NUnit3为每个测试会话启动了一个新线程,所以它最终为SpecFlow的每个调用使用不同的线程 SpecFlow通过跟踪线程ID来识别多线程执行,并且由于每个会话都有一个新线程,它错误地认为代码是并行运行的,而实际上只是同步使用不同的线程 将“测试进程内存限制”全局NCrunch配置设置设置设置为“1”将允许您解决此问题,因为这将导致NCrunch在每个批处理后丢弃一个测试进程,而不是重新使用它。不幸的是,这将对性能产生重大影响
我已将此问题报告给SpecFlow。由于它的性质,最明智的做法是将其固定在SpecFlow本身中-根据调查,这似乎是NCrunch、SpecFlow和NUnit3之间的三方兼容性问题 作为其行为的一部分,NCrunch将通过多次调用测试流程(即处理队列中的每批测试一次)来重用测试流程。因为NUnit3为每个测试会话启动了一个新线程,所以它最终为SpecFlow的每个调用使用不同的线程 SpecFlow通过跟踪线程ID来识别多线程执行,并且由于每个会话都有一个新线程,它错误地认为代码是并行运行的,而实际上只是同步使用不同的线程 将“测试进程内存限制”全局NCrunch配置设置设置设置为“1”将允许您解决此问题,因为这将导致NCrunch在每个批处理后丢弃一个测试进程,而不是重新使用它。不幸的是,这将对性能产生重大影响
我已将此问题报告给SpecFlow。由于它的性质,最明智的做法是将其固定在SpecFlow中-谢谢Andreas。已经这么做了。所有生成的SpecFlow codebehind文件都包含“SpecFlow版本:2.0.0.0”,如前所述,测试使用nunit VS plugin和nunit-console.exe运行,但不使用NCrunch。谢谢Andreas。已经这么做了。所有生成的SpecFlow codebehind文件都包含“SpecFlow版本:2.0.0.0”,如前所述,测试使用nunit VS plugin和nunit-console.exe运行,但不使用NCrunch.remco在github上的SpecFlow问题页面上显示的。请按照问题页面遵循2016-08-01号问题,这已在github的specflow问题页面上AppVeyorremco提供的预发布版本中修复。请按照问题页面遵循2016-08-01号问题,这已在AppVeyor提供的预发布版本中修复