首页 文章

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

提问于
浏览
3

我们有一个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 回答

  • 1

    对此的简短回答是,“这是bug” .

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

  • 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包(在下拉列表中选择的项目)添加到特定版本,只需确保所有项目在这个意义上都是对齐的 .

相关问题