Specflow - GenerateFeatureFileCodeBehindTask неожиданно завершился ошибкой - PullRequest
5 голосов
/ 19 марта 2020

У меня проблема с SpecFlow. Мы используем Azure Devops, и когда я собираю решение на своей локальной машине, оно работает отлично, но во время Azure Devops build я получаю следующую ошибку:

[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)
        <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" />

Я пытался использовать его с nUnit, MsTest, xUnit, и это всегда терпит неудачу. Целевая структура:. NET Core 3.1. Агент сборки: vs2019-win2019

Ответы [ 4 ]

7 голосов
/ 24 марта 2020

Мы столкнулись с той же проблемой, после продолжительного копания я обнаружил, что для этого существует проблема в их git репо [1]. Цитата из git проблемы:

MSBuild 16.5 предлагает новый подход к загрузке сборки для задач, которые могут иметь побочные эффекты. (который запрашивался годами, но при загрузке зависимостей он ведет себя немного иначе) Вы можете попробовать установить MSBUILDSINGLELOADCONTEXT = 1 (env var), чтобы получить старое поведение.

Попробуйте установить его в вашем конвейере сборки как:

 variables:
    ...
    MSBUILDSINGLELOADCONTEXT: '1'
    ...

Это помогло в нашем случае.

[https://github.com/SpecFlowOSS/SpecFlow/issues/1912] [1]

1 голос
/ 24 марта 2020

Была такая же проблема, оказалось, что это были проблемы с версией. net core SDK и Specflow. Мы понизили. net core sdk до 3.1.102, и это помогло

0 голосов
/ 08 апреля 2020

Удаление и повторная установка specflow и SpecFlow.Tools.MsBuild.Generation сработали для меня

0 голосов
/ 20 марта 2020

Сообщение об ошибке гласит:

Не удалось загрузить файл или сборку '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
    
  • Отредактируйте файл .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>
    

    Примечание: замените FRAMEWORK_VERSION на net45, netstandard2.0 и т. Д. c в зависимости от версии NET фреймворка вашего тестового проекта.

Вы всегда можете открыть Windows Проводник и перейдите к файлу DLL, чтобы найти правильный путь.

Последнее усилие, попробуйте восстановить пакеты NuGet вручную из командной строки, предполагая, что в вашем * 1031 есть NuGet.exe. * (Подробнее см. https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools)

nuget restore Path/To/YourSolution.sln
...