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

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

我们将解决方案从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 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提供的预发布版本中修复