C# 使用Xunit运行Specflow,但给出错误nunit.framework

C# 使用Xunit运行Specflow,但给出错误nunit.framework,c#,selenium,specflow,xunit,C#,Selenium,Specflow,Xunit,我有一个奇怪的问题,谷歌搜索了所有地方,它指出了我已经做了什么 我有一个简单的specflow来测试登录,但是在浏览器打开后,我得到了这个错误 Test Name: Check if Login is working Test FullName: SpecFlow.GeneratedTests.UITest.Smoke.Features.LoginFeature.CheckIfLoginIsWorking Test Source: C:\**\Login.feature : line

我有一个奇怪的问题,谷歌搜索了所有地方,它指出了我已经做了什么

我有一个简单的specflow来测试登录,但是在浏览器打开后,我得到了这个错误

Test Name:  Check if Login is working
Test FullName:  SpecFlow.GeneratedTests.UITest.Smoke.Features.LoginFeature.CheckIfLoginIsWorking
Test Source:    C:\**\Login.feature : line 7
Test Outcome:   Failed
Test Duration:  0:00:02,676

Result StackTrace:  
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)
   at TechTalk.SpecFlow.UnitTestProvider.UnitTestRuntimeProviderHelper.GetAssertMethodWithFormattedMessage(String assemblyName, String typeName, String methodName)
   at TechTalk.SpecFlow.UnitTestProvider.NUnitRuntimeProvider.TestInconclusive(String message)
   at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep()
   at SpecFlow.GeneratedTests.UITest.Smoke.Features.LoginFeature.ScenarioCleanup()
   at SpecFlow.GeneratedTests.UITest.Smoke.Features.LoginFeature.CheckIfLoginIsWorking() in C:\**\Login.feature:line 17
Result Message: Could not load file or assembly 'nunit.framework' or one of its dependencies. The system cannot find the file specified.
我还将
app.config
文件更改为

<?xml version="1.0" encoding="utf-8"?>
<configuration>,
  <appSettings>
    <add key="xunit.diagnosticMessages" value="true"/>
  </appSettings>
  <configSections>
    <section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" />
  </configSections>
  <specFlow>
    <unitTestProvider name="xUnit"/>
    <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config -->
    <stepAssemblies>
      <stepAssembly assembly="SpecFlow.Assist.Dynamic" />
    </stepAssemblies>
  </specFlow>
</configuration>

,
奇怪的是,如果我运行一个普通的selenium测试(不是specflow),它会直接工作

这也是生成的要素文件的一部分

 using TechTalk.SpecFlow;


    [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "2.1.0.0")]
    [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    public partial class LoginFeature : Xunit.IClassFixture<LoginFeature.FixtureData>, System.IDisposable
    {

        private static TechTalk.SpecFlow.ITestRunner testRunner;

#line 1 "Login.feature"
#line hidden

        public LoginFeature()
        {
            this.TestInitialize();
        }

        public static void FeatureSetup()
        {
            testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner();
            TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "Login", "Check if Login functionality is working\r\nas expected and see if correct username " +
                    "is poping up", ProgrammingLanguage.CSharp, ((string[])(null)));
            testRunner.OnFeatureStart(featureInfo);
        }

        public static void FeatureTearDown()
        {
            testRunner.OnFeatureEnd();
            testRunner = null;
        }

        public virtual void TestInitialize()
        {
        }

        public virtual void ScenarioTearDown()
        {
            testRunner.OnScenarioEnd();
        }

        public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo)
        {
            testRunner.OnScenarioStart(scenarioInfo);
        }

        public virtual void ScenarioCleanup()
        {
            testRunner.CollectScenarioErrors();
        }

        public virtual void SetFixture(LoginFeature.FixtureData fixtureData)
        {
        }

        void System.IDisposable.Dispose()
        {
            this.ScenarioTearDown();
        }
使用TechTalk.SpecFlow;
[System.CodeDom.Compiler.GeneratedCodeAttribute(“TechTalk.SpecFlow”,“2.1.0.0”)]
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
公共部分类登录功能:Xunit.IClassFixture,System.IDisposable
{
私有静态TechTalk.SpecFlow.ITestRunner testRunner;
#第1行“Login.feature”
#隐藏线
公共登录功能()
{
这个。TestInitialize();
}
公共静态无效功能设置()
{
testRunner=TechTalk.SpecFlow.TestRunnerManager.GetTestRunner();
TechTalk.SpecFlow.FeatureInfo FeatureInfo=新TechTalk.SpecFlow.FeatureInfo(新系统.全球化.文化信息(“en-US”),“登录”,“检查登录功能是否正常\r\n并查看用户名是否正确”+
“正在弹出”,ProgrammingLanguage.CSharp,((字符串[])(空));
testRunner.OnFeatureStart(featureInfo);
}
公共静态无效功能拆卸()
{
testRunner.OnFeatureEnd();
testRunner=null;
}
公共虚拟无效测试初始化()
{
}
公共虚拟空场景拆卸()
{
testRunner.OnScenarioEnd();
}
公共虚拟void场景设置(TechTalk.SpecFlow.ScenarioInfo ScenarioInfo)
{
testRunner.OnScenarioStart(场景信息);
}
公共虚拟void ScenarioCleanup()
{
testRunner.CollectScenarioErrors();
}
公共虚拟void SetFixture(LoginFeature.FixtureData FixtureData)
{
}
void System.IDisposable.Dispose()
{
this.ScenarioTearDown();
}
你知道我会错过什么吗


提前感谢。

这是一种正常行为,因为如果安装
Specflow
nuget包,它将基于nunit安装 因此,您必须
为specflow安装nuget xunit

Install-Package SpecFlow.xUnit -Version 2.1.0
更新
如果您已经这样做了,请尝试添加nunit软件包

我以前遇到过这个问题,但发现我的问题是功能文本与步骤中的签名不匹配,例如

专题文字:
假设我有一个小部件id“123”

步骤签名:
假设我有一个widgetid“123”

确保所有特征文本和步骤签名匹配为我解决了问题


我不知道为什么这个错误是关于缺少nunit依赖项的,因为我使用的是xunit。

所以,我遇到了这种情况。事实证明,这是我自己造成的伤害

问题是,在生成后事件中,我将被测应用程序中的配置文件复制为测试项目的配置文件。在应用程序的生成后事件中,我有一行,它将配置复制到Tests文件夹

复制“$(ProjectDir)”\App.config“$(SolutionDir)”\releaseMageswreckerstests\App.config

从测试中的应用程序复制的配置文件中没有告诉SpecFlow使用xUnit的行。复制发生在SpecFlow测试生成之前。 最终,我找到了答案,并为测试中的应用程序(程序集)在app.config中添加了以下行:

    <specFlow>
      <unitTestProvider name="xUnit" />
   </specFlow></configuration>


完成后,一切正常。被测试的应用程序成功构建,然后在测试程序集配置的顶部复制其配置(没有specFlow部分),该配置在复制之前具有正确的specFlow部分。

在配置中更改unitTestProvider后,您必须重新生成所有代码文件。它们可能仍然包含引用NUnit类的代码。您已经这样做了吗?