Unit Test Адаптер сбросил исключение: не удалось загрузить один или несколько запрошенных типов

Я пытаюсь запустить тесты SpecFlow из командной строки Visual Studio 2010, и я получаю довольно тупое сообщение об ошибке:

Unit Test Адаптер сбросил исключение: Невозможно загрузить один или несколько запрошенных типов. Получите свойство LoaderExceptions для получения дополнительной информации.

Некоторая информация о моей настройке проекта VS2010:

  • Windows 7 Enterprise, 64 бит (версия 6.1.7601 с пакетом обновления 1 (SP1) для сборки 7601)
  • Visual Studio 2010 Premium (v10.0.40219.1 SP1Rel)
  • Использование кодированных пользовательских интерфейсов
  • Использование SpecFlow 1.9.0, который делегирует API-интерфейсу CodedUI
  • MSTest
  • .NET v4.0.30319
  • Всего решение компилируется в 32-битный код (у меня есть сотрудники, использующие XP)

У меня есть событие post-build, которое копирует несколько DLL файлов из каталога пакетов NuGet в целевой каталог:

copy $(SolutionDir)packages\SpecBind.1.2.1.71\lib\net45\SpecBind.dll $(TargetDir)
copy $(SolutionDir)packages\SpecBind.CodedUI.1.2.1.71\lib\net45\SpecBind.CodedUI.dll $(TargetDir)

Без этого mstest каким-то образом не смог загрузить несколько сборок SpecFlow.

Соответствующие части тестового проекта App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" />
    <section name="specBind" type="SpecBind.Configuration.ConfigurationSectionHandler, SpecBind" />
  </configSections>

  <connectionStrings>
    ...
  </connectionStrings>

  <specFlow>
    <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config -->
    <unitTestProvider name="MsTest" generatorProvider="Specflow.CodedUI.MsTestCodedUiGeneratorProvider, Specflow.CodedUI" runtimeProvider="TechTalk.SpecFlow.UnitTestProvider.MsTest2010RuntimeProvider, TechTalk.SpecFlow" />
    <stepAssemblies>
      <!-- This attribute is required in order to use StepArgument Transformation as described here; 
           https://github.com/marcusoftnet/SpecFlow.Assist.Dynamic/wiki/Step-argument-transformations  -->
      <stepAssembly assembly="SpecFlow.Assist.Dynamic" />
      <stepAssembly assembly="SpecBind" />
    </stepAssemblies>
  </specFlow>
  <specBind>
    <browserFactory provider="SpecBind.CodedUI.CodedUIBrowserFactory, SpecBind.CodedUI" browserType="IE" />
    <!-- For additional details on SpecBind configuration options see the project site. -->
  </specBind>
</configuration>

Команда, которую я использовал для запуска тестов:

C:\path\to\bin\Debug> mstest /testcontainer:MyTests.dll /test:SpecFlowFeatureName

Loading MyTests.dll
Starting Execution...

Results         Top Level Tests
--------        ------------------
Failed          ...
Failed          ...
Failed          ...

...

Я искал высоко и низко для решения, и все, что я продолжаю искать, это ссылки на VS2008 и отключить Code Coverage. У меня есть VS2010, а в моих локальных тестовых настройках не включено Code Coverage.

Средство просмотра событий Windows

После укорачивания в моем средстве просмотра журнала событий Windows я, наконец, набрал больше информации (я слышал, что люди жалуются, что не могут найти трассировку стека с этой ошибкой - посмотрите в своем средстве просмотра событий)

The description for Event ID 0 from source VSTTExecution cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.

If the event originated on another computer, the display information had to be saved with the event.

The following information was included with the event: 

(QTAgent32.exe, PID 6920, Thread 213) Unit Test Adapter threw exception: System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
   at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.RuntimeModule.GetTypes()
   at System.Reflection.Assembly.GetTypes()
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.GetAssemblyInfo(Assembly assembly)
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.GetTypeInfo(Type type, Boolean checkAlreadyExaminedType)
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.ResolveMethods()
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.Initialize(UnitTestResult result, UnitTestRunner runner, ConsoleOutputRedirector redirector)
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestRunner.Run(UnitTestElement test, ITestContext testContext, Boolean isLoadTest, Boolean useMultipleCpus)

the message resource is present but the message is not found in the string/message table

Я не знаю, как решить эту ошибку. Тестирование SpecFlow выполняется изнутри Visual Studio, когда я щелкнул правой кнопкой мыши в файле .feature, загруженном в редактор, и выберите "Запустить сценарии сценариев...", но я не могу запустить их из командной строки.

Любые идеи или дополнительную информацию, которую я мог бы опубликовать?

В качестве побочной заметки это было связано с моим предыдущим вопросом: Как запустить сценарии SpecFlow из командной строки с помощью MSTest?

Обновление # 1

Я немного пошутил и нашел это сообщение в блоге: MSTest и 64bit. Я проверил свои локальные настройки теста, и он заставляет тесты работать в 32 бит.

Теперь, используя эту команду:

mstest /testcontainer:MyTests.dll /testsettings:"..\..\..\Local.testsettings"

Сообщение об ошибке:

Test method Blah.Dee.Blah threw exception: 
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.VisualStudio.TestTools.UITest.Extension, Version=11.0.0.0, Culture=neutral, PublicKeyToken=...' or one of its dependencies. The system cannot find the file specified.WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

TestCleanup method Blah.Dee.Blah.ScenarioTearDown threw exception. BoDi.ObjectContainerException: BoDi.ObjectContainerException: Interface cannot be resolved: SpecBind.BrowserSupport.IBrowser.

Обновление # 2

Я удалил ссылку на Microsoft.VisualStudio.TestTools.UITest.Extension и добавил ее обратно. Убирали. Перестроен. Повторите ту же команду снова. По-прежнему возникают те же ошибки.

По какой-то причине он пытается загрузить сборку Microsoft.VisualStudio.TestTools.UITest.Extension как версию 11, и у меня установлена ​​версия 10 на моем компьютере. Я пытаюсь отслеживать, где указан этот вариант, поэтому я могу его изменить.

Ответ 1

С помощью комментария @jessehouwing выше, я исправил это. Я столкнулся с двумя проблемами.

Первоначально ошибка, на которую я ссылался, была вызвана попыткой mstest запустить тесты в 64-битном процессе (QTAgent.exe). Мне нужно было запустить его как 32-битный процесс, потому что проект был скомпилирован как 32-битный код на моем 64-битном компьютере с Windows 7.

В Visual Studio 2010:

  1. Нажмите меню "Тест" → "Изменить настройки теста" → "Локальные (local.testsettings)"
  2. Нажмите "Хосты" на левой панели
  3. Убедитесь, что в раскрывающемся списке "Запуск тестов в 32-битном или 64-битном процессе" выбран параметр "Принудительно выполнять тесты в 32-битном процессе". Для меня это было по умолчанию
  4. В командной строке Visual Studio запустите тесты, ссылаясь на файл local.testsettings, созданный Visual Studio:

    mstest /testcontainer:foo.dll /testsettings:"path/to/solution/local.testsettings" /test:SpecFlowFeatureName
    

Вторая проблема, с которой я столкнулся, была по моей вине. Ранее я играл с тестами Coded UI и SpecFlow и установил SpecBind, который бросил кучу настроек в App.config для моего тестового проекта. Этот пакет NuGet предназначен только для .NET 4.5, и мы используем .NET 4.0. Я удалил этот пакет NuGet и настройки из App.config, очистил и перестроил. Это решило эту проблему полностью.

Короче говоря, я:

  • Принудительно запустил mstest в 32-битном процессе и сослался на этот файл local.testsettings из командной строки
  • Удалил все ссылки на SpecBind, потому что раньше я был немного счастлив от NuGet и установил пакет, несовместимый с моей средой выполнения .NET.

Ответ 2

На всякий случай, если кто-то еще сталкивается с этим, для меня это было потому, что покрытие кода было включено. Отключив его, проблема:

http://blogs.msdn.com/b/danielvl/archive/2010/02/16/enable-code-coverage-in-visual-studio.aspx

  • Откройте файл .testsettings
  • В разделе "Параметры тестирования" нажмите "Данные и диагностика"
  • Снимите флажок "Охват кода"
  • Нажмите "Применить"

Ответ 3

Как вы можете видеть, просмотрев ссылки на сборку, требуемые этими пакетами (для этого я использую Reflector, но также будет работать DotPeek IlSpy или JetBrains), вы увидите, что они зависят от версии v11, которая версия, которая поставляется с Visual Studio 2012. Они не могут использоваться в Visual Studio 2010.

Specbind References

Удаление SpecBind, вероятно, поможет или найдет версию, которая зависит от более старой версии CodedUI (в этом случае вы, вероятно, ищете гораздо более старую версию SpecBind).

Что касается 32-разрядной проблемы, вероятно, вы должны установить конфигурацию процессора проекта AnyCPU, обычно нет необходимости исправлять ее на x86, если вы не зависите от собственных методов или если вы ссылаетесь на другие которые специально настроены на использование x86 в качестве целевой архитектуры.

Ответ 4

Это так тревожно.....

У меня был тестовый агент для Visual Studio 2015, установленный на моем тестовом компьютере, так как мы планировали его использовать - в то время как на моем локальном компьютере у меня был 2013 год. Тесты так хорошо выполнялись с MsBuild на локальном компьютере, что я не мог понять, что могло случилось, учитывая, что я всегда предполагал, что Microsoft всегда поддерживает обратную совместимость.

MsBuild на тестовом сервере не смог дать никакой информации о том, какие сборки отсутствовали (я добавил Newtonsoft.Json только потому, что изначально он жаловался, но после этого я никогда не видел имена чего-либо еще отсутствующего). Сообщение об ошибке было усечено, параметры трассировки стека и отладки никогда не работали...

После того, как я установил тестовый агент для Visual Studio 2013 на тестовом компьютере, он запустился как очаровательный.