Specflow - GenerateFeatureFileCodeBehindTask 意外失败

aj_*_*017 13 selenium nunit specflow azure-automation azure-devops

我对 SpecFlow 有问题。我们正在使用 Azure Devops,当我在本地机器上构建解决方案时,它运行良好,但在 Azure Devops 构建期间,我收到以下错误:

[error]C:\Windows\ServiceProfiles\NetworkService\.nuget\packages\specflow.tools.msbuild.generation\3.1.86\build\SpecFlow.Tools.MsBuild.Generation.targets(93,5): Error MSB4018: The "GenerateFeatureFileCodeBehindTask" task failed unexpectedly.
System.IO.FileNotFoundException: Could not load file or assembly 'TechTalk.SpecFlow, Version=3.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41'. The system cannot find the file specified.
File name: 'TechTalk.SpecFlow, Version=3.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41'
   at System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule module, Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext)
   at System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
   at System.Reflection.CustomAttribute.FilterCustomAttributeRecord(MetadataToken caCtorToken, MetadataImport& scope, RuntimeModule decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, ListBuilder`1& derivedAttributes, RuntimeType& attributeType, IRuntimeMethodInfo& ctor, Boolean& ctorHasParameters, Boolean& isVarArg)
   at System.Reflection.CustomAttribute.AddCustomAttributes(ListBuilder`1& attributes, RuntimeModule decoratedModule, Int32 decoratedMetadataToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, ListBuilder`1 derivedAttributes)
   at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType)
   at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeAssembly assembly, RuntimeType caType)
   at System.Reflection.RuntimeAssembly.GetCustomAttributes(Type attributeType, Boolean inherit)
   at System.Attribute.GetCustomAttributes(Assembly element, Type attributeType, Boolean inherit)
   at System.Attribute.GetCustomAttribute(Assembly element, Type attributeType, Boolean inherit)
   at System.Attribute.GetCustomAttribute(Assembly element, Type attributeType)
   at TechTalk.SpecFlow.Generator.Plugins.GeneratorPluginLoader.LoadPlugin(PluginDescriptor pluginDescriptor)
   at TechTalk.SpecFlow.Generator.GeneratorContainerBuilder.LoadPlugins(ObjectContainer container, GeneratorPluginEvents generatorPluginEvents, UnitTestProviderConfiguration unitTestProviderConfiguration, IEnumerable`1 generatorPlugins)
   at TechTalk.SpecFlow.Generator.GeneratorContainerBuilder.CreateContainer(SpecFlowConfigurationHolder configurationHolder, ProjectSettings projectSettings, IEnumerable`1 generatorPluginInfos, IObjectContainer parentObjectContainer)
   at SpecFlow.Tools.MsBuild.Generation.WrappedGeneratorContainerBuilder.BuildGeneratorContainer(SpecFlowConfigurationHolder specFlowConfigurationHolder, ProjectSettings projectSettings, IReadOnlyCollection`1 generatorPluginInfos, IObjectContainer rootObjectContainer)
   at SpecFlow.Tools.MsBuild.Generation.GenerateFeatureFileCodeBehindTaskExecutor.Execute()
   at SpecFlow.Tools.MsBuild.Generation.GenerateFeatureFileCodeBehindTask.Execute()
   at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask)
Run Code Online (Sandbox Code Playgroud)
        <PackageReference Include="FluentAssertions" Version="5.10.2" />
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
        <PackageReference Include="MSTest.TestAdapter" Version="2.1.0" />
        <PackageReference Include="MSTest.TestFramework" Version="2.1.0" />
        <PackageReference Include="NUnit" Version="3.12.0" />
        <PackageReference Include="Selenium.Support" Version="3.141.0" />
        <PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
        <PackageReference Include="SpecFlow" Version="3.1.86" />
        <PackageReference Include="SpecFlow.MsTest" Version="3.1.86" />
        <PackageReference Include="SpecFlow.Tools.MsBuild.Generation" Version="3.1.86" />
Run Code Online (Sandbox Code Playgroud)

我一直在使用它与尝试nUnitMsTestxUnit并送花儿给人失败。目标框架:.NET Core 3.1。构建代理:vs2019-win2019

小智 13

我们遇到了同样的问题,经过更长时间的挖掘,我发现在他们的 git repo https://github.com/SpecFlowOSS/SpecFlow/issues/1912 中为此创建了一个问题。引用 git 问题:

MSBuild 16.5 为可能有副作用的任务提供了一种新的程序集加载方法。(多年来一直在问,但在加载依赖项时它的行为有点不同)您可以尝试设置 MSBUILDSINGLELOADCONTEXT=1 (env var) 以获得旧的行为。

尝试在您的构建管道中将其设置为:

 variables:
    ...
    MSBUILDSINGLELOADCONTEXT: '1'
    ...
Run Code Online (Sandbox Code Playgroud)

这对我们的案例有帮助。


编辑:这个问题似乎在较新版本的 SpecFlow (3.3.15+) 中得到解决。


小智 5

从 SpecFlow 2 迁移后,SpecFlow 3.4.8 也出现同样的问题。

\n

自从After version SpecFlow 3.3.30 don\xe2\x80\x99t need to add the SpecFlow.Tools.MSBuild.Generation package anymore

\n

所以我已经删除了SpecFlow.Tools.MSBuild.Generation软件包,但问题仍然存在。

\n

之后我添加specflow.json到测试项目并且问题消失了

\n


Gre*_*rdt 0

错误消息显示:

无法加载文件或程序集“TechTalk.SpecFlow,版本=3.1.0.0,文化=中性,PublicKeyToken=0778194805d6db41”。该系统找不到指定的文件。文件名:'TechTalk.SpecFlow,版本=3.1.0.0

您已安装 SpecFlow v3.1.86。我希望它加载 TechTalk.SpecFlow 3.1.86,它与 NuGet 包版本匹配。

任何一个:

  • 使用程序包管理器控制台卸载并重新安装 SpecFlow 程序包:

    uninstall-package SpecFlow -force -project NameOfYourTestProject
    install-package SpecFlow -version 3.1.86 -project NameOfYourTestProject
    
    Run Code Online (Sandbox Code Playgroud)
  • 编辑测试项目的 .csproj 文件,并确保<Reference>导入 DLL 文件的元素指向正确的文件

    <Reference Include="TechTalk.SpecFlow, Version=3.0.0.0, Culture=neutral, PublicKeyToken=..., processorArchitecture=MSIL">
      <HintPath>..\packages\SpecFlow.3.1.86\lib\FRAMEWORK_VERSION\TechTalk.SpecFlow.dll</HintPath>
    </Reference>
    
    Run Code Online (Sandbox Code Playgroud)

    注意:FRAMEWORK_VERSION根据测试项目的 .NET Framework 版本替换为 net45、netstandard2.0 等。

您始终可以打开 Windows 文件资源管理器并浏览到 DLL 文件以找到正确的路径。

最后努力,尝试从命令行手动恢复 NuGet 包,假设您的系统中有 NuGet.exe 可用%PATH%(有关更多信息,请参阅https://learn.microsoft.com/en-us/nuget/install-nuget-client-tools信息)

nuget restore Path/To/YourSolution.sln
Run Code Online (Sandbox Code Playgroud)