我们有一个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上阅读其他答案后,我尝试了以下几个步骤的二十几种不同组合:
我的故障排除功能已经结束。由于显然没有任何理由,测试就不会再在构建机器上运行了。
我该怎么办?到底是怎么回事?
答案 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包(在下拉列表中选择的项目)添加到特定版本,只需确保所有项目在这个意义上都是对齐的。