我们有一个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 回答
对此的简短回答是,“这是bug” .
我是reported the bug to JetBrains . 看来,尽管我的项目可能存在一些潜在的问题,但它无法检索实际的错误消息,因此无法知道该问题是什么 . 运行器应该捕获异常并打印出
LoaderExceptions
属性,但是在异常上调用ToString()
并不是't. Instead, it' . 必须更新运行器以查找此特定异常并打印LoaderExceptions
属性 . 一旦发生这种情况,我们就可以看到潜在的问题,这可能会导致项目中的某些内容发生变化,或者可能导致与JetBrains一起提交另一个错误 .解决方法
在遇到这个错误时,我花了很多时间调试我们的持续集成构建失败 . 由于Jetbrains没有解决这个问题,我想我会在这里发布我的解决方法,以便其他人可以使用 .
我的问题是在运行单元测试的步骤上构建失败了 . 巧合的是,失败的构建增加了一个单元测试项目 . 排除新添加的单元测试后,一切都成功运行 . 由于上述原因而Teamcity未正确处理异常,因此调试选项有限 .
我从来没有找到一个不会弄脏手的解决方案,但你可以做的是以下几点 . 它基本上是手动运行MSTest而不是构建代理上的测试程序集,并且需要远程桌面访问它 . 在我的例子中,Teamcity从以下目录运行单元测试:
运行以下命令以在包含失败测试的程序集上启动MSTest运行程序:
输出应该给你实际使测试失败的问题 . 在我的例子中,事实证明新项目引用了Ploeh.AutoFixture,其版本与其他单元测试项目中使用的版本不同 .
具体问题解决方案
如果您想知道如何解决类似问题,可以执行以下操作 . 打开包管理器控制台(View - > Other windows - > NuGet Package Manager)并执行以下命令 .
这会将NuGet包(在下拉列表中选择的项目)添加到特定版本,只需确保所有项目在这个意义上都是对齐的 .