visual-studio-2012 - Microsoft Fakes & TFS 2012 Visual Studio Test Runner - 单元测试偶尔失败

标签 visual-studio-2012 build-process microsoft-fakes

环境

  • Visual Studio 2012 高级更新 3
  • Team Foundation Server 2012 更新 3
  • 编辑:.NET Framework 4
  • DefaultTemplate (DefaultTemplate.11.1.xaml)
  • Visual Studio 测试运行器
  • 目标平台:X86

  • 问题

    我有 2 个单元测试程序集:
  • 扩展测试
  • 用户测试

  • 两者都使用 微软假冒框架 (使用 stub 和垫片)。

    在本地运行单元测试有效 很好 (在 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-file 中只包含明确需要的垫片/ stub (否则 MSBUILD 使用退出代码 1 失败)。

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

    提前致谢

    最佳答案

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

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

    所以我绕过这个问题的想法是将两个测试组件使用的所有垫片/ stub 放入两个 .fakes-configuration-files;反射器显示这次确实生成了所有需要的垫片/ stub ,但是构建失败了

    Exception Message: MSBuild error 1 has ended this build. 
    

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

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

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

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

    关于visual-studio-2012 - Microsoft Fakes & TFS 2012 Visual Studio Test Runner - 单元测试偶尔失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717026/

    相关文章:

    visual-studio-2012 - 无法在 Visual Studio 2012 RC 上安装 "Web Developer Tools"

    c# - 如何加载ascx文件中的资源 key ?

    Xcode:如何将构建的产品从一个项目添加到同一工作区中的另一个项目?

    c# - 如何使用 Microsoft Fakes 获取基类的垫片?

    visual-studio - 微软假货 "Assembly not supported"

    c++ - for循环c++中的结构

    visual-studio - Visual Studio 11 "Target Framework"一直恢复到 4

    c++ - 构建输出与项目构建顺序不匹配

    java - Maven - 在构建时包含不同的文件

    .net - 安装 Visual Studio 2015 后 Fakes 停止工作