单元测试适配器引发异常:无法加载一个或多个请求的类型

时间:2014-01-03 17:19:22

标签: visual-studio-2010 mstest specflow

我正在尝试从Visual Studio 2010命令提示符运行SpecFlow测试,我收到一条相当迟钝的错误消息:

  

单元测试适配器抛出异常:   无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息..

有关我的VS2010项目设置的一些信息:

  • Windows 7企业版,64位(版本6.1.7601 Service Pack 1 Build 7601)
  • Visual Studio 2010 Premium(v10.0.40219.1 SP1Rel)
  • 使用编码的UI测试
  • 使用SpecFlow 1.9.0,它委托CodedUI测试API
  • MSTest的
  • .NET v4.0.30319
  • 整个解决方案正在编译为32位代码(我还有使用XP的同事)

我有一个post-build事件,它将我的NuGet包目录中的一些DLL文件复制到目标目录:

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的引用并禁用代码覆盖率。我有VS2010,并且在我的本地测试设置中未启用代码覆盖率。

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

我不知道如何解决此错误。当我右键单击编辑器中加载的.feature文件并选择“运行SpecFlow场景...”但我无法从命令行运行它们时,SpecFlow测试在Visual Studio内运行正常。

我可以发布任何想法或其他信息吗?

作为旁注,这源于我之前的问题:How do you run SpecFlow scenarios from the command line using MSTest?

更新#1

我做了一些更多的讨论,并发现了这篇博文:MSTest and 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。我正在尝试追踪指定此版本的位置,以便我可以更改它。

4 个答案:

答案 0 :(得分:8)

以防万一其他人遇到此问题,对我而言是因为启用了代码覆盖率。禁用它解决了问题:

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

  • 打开.testsettings文件
  • 在“测试设置”下,单击“数据和诊断”
  • 取消选中“代码覆盖率”
  • 点击“应用”

答案 1 :(得分:4)

在@ jessehouwing上面的评论的帮助下,我已经解决了这个问题。我遇到了两个问题。

我最初引用的错误实际上是由mstest尝试在64位进程(QTAgent.exe)中运行测试引起的。我需要它以32位进程运行,因为该项目在我的64位Windows 7机器上被编译为32位代码。

在Visual Studio 2010中:

  1. 点击“测试”菜单 - &gt; “编辑测试设置” - &gt; “Local(local.testsettings)”
  2. 点击左侧面板中的“主机”
  3. 确保在“32位或64位进程中的运行测试”下拉列表中选择“强制测试以32位进程运行”。对我来说这是默认的
  4. 在Visual Studio命令提示符中,通过引用Visual Studio生成的local.testsettings文件来运行测试:

    mstest /testcontainer:foo.dll /testsettings:"path/to/solution/local.testsettings" /test:SpecFlowFeatureName
    
  5. 我遇到的第二个问题是我自己的错。之前我正在使用Coded UI测试和SpecFlow,并安装了SpecBind,它在App.config中为我的测试项目抛出了一堆设置。这个NuGet包仅适用于.NET 4.5,我们使用.NET 4.0。我从App.config中删除了NuGet包和设置,清理并重建。这完全解决了这个问题。

    简而言之,我:

    • 强制mstest在32位进程中运行,并从命令行引用此local.testsettings文件
    • 删除了对SpecBind的所有引用,因为我之前有点NuGet-happy并且安装了与我的.NET运行时不兼容的包。

答案 2 :(得分:3)

正如你可以看到这些包所需的程序集引用(我使用Reflector,但是IlSpy或JetBrains的DotPeek也可以工作),你会发现它们依赖于v11版本,这是Visual Studio 2012附带的版本。这些版本不能在Visual Studio 2010中使用。

Specbind References

删除SpecBind可能会有所帮助,或者找到一个依赖于旧版CodedUI的版本(在这种情况下,您可能正在寻找更旧版本的SpecBind)。

至于您的32位问题,您应该将项目的CPU配置设置为AnyCPU,通常无需将其修复为x86,除非您依赖于本机方法或者如果您是引用专门设置为使用x86作为其目标体系结构的其他程序集。

答案 3 :(得分:0)

这太麻烦了......

我在我的测试机器上安装了Test Agent for Visual Studio 2015,因为我们计划使用它 - 而在我的本地机器上我有2013年。测试与当地的MsBuild完美配合,我无法理解什么可以因为我一直认为微软总是保持向后兼容性。

测试服务器上的MsBuild未能提供有关哪些程序集丢失的任何信息(我添加了Newtonsoft.Json只是因为它最初抱怨,但之后我从未看到任何其他缺失的名称)。错误消息被截断,stacktrace和debugtrace选项从未起作用......

在测试计算机上安装了Visual Studio 2013测试代理后,它就像魅力一样。