9

环境

  • Visual Studio 2012 高级更新 3
  • 团队基础服务器 2012 更新 3
  • 编辑:.NET 框架 4
  • 默认模板 (DefaultTemplate.11.1.xaml)
    • Visual Studio 测试运行器
      • 目标平台:X86

问题

我有 2 个单元测试程序集:

  • 扩展测试
  • 用户测试

两者都使用Microsoft Fakes Framework(使用 StubsShims)。

在本地运行单元测试可以正常工作(在 4 台不同的机器上测试,甚至在构建服务器上安装的 Visual Studio 上测试),但是如果我们使用构建代理构建,一些单元测试会失败并出现异常,例如:

Unable to create instance of class UserTests.ClientUserTest. Error: System.TypeLoadException: Could not load type 'WorldDirect.CCM.Shared.Backend.SmartClassic.Fakes.StubClient' from assembly 'WorldDirect.Smart.Backend.Fakes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

或相同的垫片:

Test method ExtensionTests.ExtensionTests.UpdateExtensionValidate_NoGrnp_ChecksIpPbxDependencies threw exception: System.TypeLoadExceptio: Could not load type                'WorldDirect.CCM.Shared.Backend.SmartClassic.Fakes.ShimIpPbxRemoteDestination' from assembly 'WorldDirect.Smart.Backend.Fakes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

有趣的是,它们偶尔会失败,我试图编造一些统计数据:

 #     | Outcome          | Comment  
 19    |  64/64 passed    |  only 'UserTests'-UnitTests run, 'ExtensionTests' inactive  
 20    |  37/64 passed    |  same source code as #19  
 21    |  64/64 passed    |  same source code as #19  

 22    |  64/66 passed    |  all 'UserTests' run as well as 2 'ExtensionTests', others still inactive; the 2 ExtensionTests failed with ShimIpPbxRemoteDestination-TypeLoadException  
 23    |  38/65 passed    |  same source code as #22, notice NOTHING has changed, however 1 unit test was not even run in 'ExtensionTests'; however the second succeeds; all unit tests in 'UserTests' using MS Fakes fail with a StubClient-TypeLoadException   
 24    |  38/65 passed    |  same source code as #22  

new day - no more luck :-(

  1     |  37/64 passed    | uncommented the 2 'ExtensionTests', so same code as #19
  2     |  37/64 passed    | so same code as #1
  3     |  64/64 passed    | so same code as #1; suddenly they all work again  

请注意,除了提到的更改之外,没有人更改源代码。
所有构建都是使用详细的日志级别进行的;垫片诊断=“真”;
只有明确需要的垫片/存根包含在 .fakes 文件中(否则 MSBUILD 使用退出代码 1 失败)。

这对我来说似乎很神奇,可能有人已经遇到过同样的问题,或者有人有提示。

提前致谢

4

1 回答 1

10

我想我知道问题出在哪里,TypeNotFoundException是正确的,至少没有生成相应的类型(如Reflector所示),这让我思考。更确切地说,每个程序集只有一个生成的假文件位于 [buildName]\Binaries- 下,并且由于我的两个程序集伪造了相同的程序集(backend.dll) - 这很可能导致竞争条件 - 一个程序集建造时间晚于另一个生成最终的垫片/存根;但这并不能澄清所有问题。

无论如何,这不会出现在常规的 VS 构建中的原因是因为程序集是在它们各自的 [assembly]\FakeAssemblies 目录中生成的,不会影响任何其他单元测试(它应该是这样的)。

所以我规避这个问题的想法是将两个测试程序集使用的所有垫片/存根放入两个 .fakes-configuration-files; 反射器表明这次确实生成了所有需要的垫片/存根,但是构建失败了

Exception Message: MSBuild error 1 has ended this build. 

在任何(详细)日志中没有更多信息。这个问题是由于没有使用 .fakes-file 中指定的生成 shim/stub-object 引起的(当然这也是构建服务器刚刚显示的问题,否则会太无聊 ;-))。

所以我想出的最终解决方案是将所有使用 shims/stubs 的代码放入同一个程序集中,其中只有 1 个 .fakes-file 配置了 fake-Assembly。

现在它工作正常:-),但我认为 MS-Dev-Team 在这里还有一些事情要做,虽然还没有用 TFS2013 测试过;无论如何都会提交一个错误(因为我已经发现了2个)

希望这可以帮助遇到同样问题的人。

于 2013-07-19T05:18:43.593 回答