3

我们有一个 ASP.NET MVC 4.5 项目。几个月来,它一直在编译,所有单元测试都在我们的开发机器和 TeamCity 7.1.5 机器上本地通过。周一,我们更新了一些依赖项的较新版本(特别是为选择扩展获取 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 上的其他答案后,我尝试了大约两打以下步骤的不同组合:

  • 将构建从“重建”更改为“清理”,在没有测试的情况下运行它,以便它只是清理,将其更改回来,然后再次运行。
  • 将构建从“调试”更改为“发布”,运行它,然后再次将其更改回来。
  • 来自 TeamCity 管理页面的清洁剂来源。
  • 手动从代理中删除整个工作目录,跳过回收站并直接进入下界。
  • 从构建机器和代理中删除所有源代码控制 (TFS) 缓存。
  • 告诉 TeamCity 在从源代码管理中获取最新信息之前清理工作目录。

我的故障排除能力已经到了尽头。测试将不再在构建机器上运行,显然完全没有理由。

我能做些什么?到底他妈发生了什么?

4

2 回答 2

1

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

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

于 2013-10-01T20:58:55.777 回答
1

解决方法

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

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

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

C:\BuildAgent\temp\buildTmp[名称时间戳]\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,版本=3.18.10.0,Culture=neutral,PublicKeyToken=b24654c590009d4f”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)。

具体问题解决

如果您想知道如何解决类似问题,您可以执行以下操作。打开包管理器控制台(查看 -> 其他窗口 -> NuGet 包管理器)并执行以下命令。

安装包 Ploeh.AutoFixture -版本 3.18.10.0

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

于 2014-08-25T12:42:00.847 回答