单元测试适配器在TeamCity 7.1.5中引发了没有堆栈跟踪的异常

时间:2013-09-18 21:03:51

标签: c# unit-testing teamcity mstest teamcity-7.1

我们有一个ASP.NET MVC 4.5项目。几个月来,它一直在编译和所有单元测试在我们的开发机器和TeamCity 7.1.5机器上本地传递。星期一我们更新了一些依赖项的更新版本(具体来说,为了让select-expand获得OData 5.0.0-rc1)。

该项目在我们的开发机器和构建机器上编译良好。它可以在我们的开发机器以及它部署到的两个QA环境中运行良好。所有单元测试都通过我们的开发机器。但是,当使用MSTest构建运行器从TeamCity运行时,大约一半(~300)的单元测试现在失败,所有这些都有相同的,无用的错误:

Unit Test Adapter threw exception: 
Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

我已经尝试了所有可以想到的东西。起初我认为存在合理的问题。由于无法从TeamCity中检索LoaderExceptions属性(为什么MSTest不显示更多信息!?!?),我登录到运行的TeamCity机器,打开控制台,更改为我们的工作目录build正在运行,并手动运行测试,以便我可以检索该属性。所有的测试都已通过!那就是理论......

经过一整天的谷歌搜索并在StackOverflow上阅读其他答案后,我尝试了以下几个步骤的二十几种不同组合:

  • 将构建从“Rebuild”更改为“Clean”,在没有测试的情况下运行它,以便它只是清理,更改它,然后再次运行它。
  • 将构建从“Debug”更改为“Release”,运行它,然后再将其更改回来。
  • 来自TeamCity管理页面的清洁代理来源。
  • 手动删除代理商的整个工作目录,跳过回收站并直接进入地狱世界。
  • 从构建计算机和代理程序中删除所有源代码管理(TFS)缓存。
  • 告知TeamCity在从源代码管理获取最新信息之前清理工作目录。

我的故障排除功能已经结束。由于显然没有任何理由,测试就不会再在构建机器上运行了。

我该怎么办?到底是怎么回事?

2 个答案:

答案 0 :(得分:1)

对此的简短回答是,“这是一个bug。”

reported the bug to JetBrains。看起来虽然我的项目可能存在一些潜在的问题,但是从Teamcity运行时只是一个问题,并且无法检索实际的错误消息,因此无法知道该问题是什么。运行器应该捕获异常并打印出LoaderExceptions属性,但事实并非如此。相反,它只是在异常上调用ToString()。必须更新运行器以查找此特定异常并打印LoaderExceptions属性。一旦发生这种情况,我们就可以看到潜在的问题,这可能会导致项目中的某些内容发生变化,或者可能导致在JetBrains中提交另一个错误。

答案 1 :(得分:1)

解决方法

在遇到此错误时,我花了很长时间调试持续集成构建失败。由于Jetbrains没有解决这个问题,我想我会在这里发布我的解决方法,以便其他人可以使用。

我的问题是在运行单元测试的步骤上构建失败了。巧合的是,失败的构建增加了一个单元测试项目。排除新添加的单元测试后,一切都成功运行。由于上述原因而Teamcity未正确处理异常,因此调试选项有限。

我从来没有找到一个不会弄脏手的解决方案,但你可以做的是以下几点。它基本上是手动运行MSTest而不是构建代理上的测试程序集,并且需要远程桌面访问它。在我的例子中,Teamcity从以下目录运行单元测试:

  

C:\ BuildAgent \ temp \ buildTmp [NAME TIMESTAMP] \ Out。

运行以下命令以在包含失败测试的程序集上启动MSTest运行程序:

  

C:\ BuildAgent \ temp \ buildTmp \ Out>“C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ MSTest.exe”/ testcontainer:“C:\ BuildAgent \ temp \ buildTmp [ NAME TIMESTAMP] \ Assembly.With.Failed.Tests.dll“

输出应该给你实际上使测试失败的问题。在我的例子中,事实证明新项目引用了Ploeh.AutoFixture,其版本与其他单元测试项目中使用的版本不同。

  

无法加载测试容器'C:\ BuildAgent \ temp \ buildTmp \ Out [NAME TIMESTAMP] \ Assembly.With.Failed.Tests.dll'或其依赖项之一。错误详细信息:System.IO.FileLoadException:无法加载文件或程序集'Ploeh.AutoFixture,Version = 3.18.10.0,Culture = neutral,PublicKeyToken = b24654c590009d4f'或其依赖项之一。定位的程序集的清单定义与程序集引用不匹配。 (来自HRESULT的异常:0x80131040)。

具体问题解决方案

如果您想知道如何解决类似问题,可以执行以下操作。打开包管理器控制台(View - > Other windows - > NuGet Package Manager)并执行以下命令。

  

Install-Package Ploeh.AutoFixture -Version 3.18.10.0

这会将NuGet包(在下拉列表中选择的项目)添加到特定版本,只需确保所有项目在这个意义上都是对齐的。