【问题标题】:TFS Fakes Build Unit test failureTFS Fakes 构建单元测试失败
【发布时间】:2017-08-31 13:15:06
【问题描述】:

我们有一个 VS2013 .net 5.0 解决方案(VS2013 高级版),所有单元测试在本地都通过了,但在 TFS 构建的 VS 测试加载器中运行时通过了几个测试失败了这个或类似的异常:System.TypeLoadException: Could not load type 'System.Diagnostics.Fakes.ShimEventLog' from assembly 'System.4.0.0.0.Fakes, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0ae41878053f6703'. 这是一个失败的测试示例:

    [TestMethod]
    public void WriteToEventLogTest_HappyPath()
    {
        EventLogEntryType eTypeInfo = EventLogEntryType.Information;
        bool sourceExistCalled = false;
        bool writeEntrycalled = false;

        using (ShimsContext.Create())
        {
            ShimEventLog.SourceExistsString = s =>
            {
                sourceExistCalled = true;
                return true;
            };

            ShimEventLog.AllInstances.WriteEntryStringEventLogEntryType = (@this, str, et) =>
            {
                writeEntrycalled = true;
            };

            Logging.WriteToEventLog(IpAddress, eTypeInfo);
            Assert.IsTrue(sourceExistCalled, "SourceExist() not called");
            Assert.IsTrue(writeEntrycalled, "WriteEntry() not called");
        }
    }`

我们使用在 Windows Server 2012 R2 上运行的 TFS 2013 更新 5。有什么可能导致这个问题吗?我们是否应该将 TFS 更新到目前的最新版本,即 Update 5?

【问题讨论】:

  • 程序集是否在 TFS 机器上,在本地工作区目录(我不熟悉 TFS)或 GAC 中?
  • 感谢您的回复。程序集在 Build Agent 机器上,但不转到 GAC
  • 尝试启用融合日志记录。不用说,但是您是否仔细检查了 DLL 是否位于预期/正确的位置,并且版本、文化和公钥标记都完全匹配?
  • 是的,程序集位于指定位置,版本匹配,但 TFS 在未通过测​​试时构建失败,因此没有输出。
  • 你创建了什么样的单元测试。automapper 测试或者别的什么

标签: c# tfsbuild


【解决方案1】:

通过在解决方案级别的测试项目之间共享伪造配置文件解决了问题

【讨论】:

  • 您能否提供更多信息,说明您将如何做到这一点?
  • @zaitsman 当然,我们创建了一个新项目,在其中整合了整个解决方案中的所有假货,然后将它们链接到各种测试项目中。这为我们解决了所有构建问题。
  • @Victor 链接或添加了参考,您能否提供更多详细信息?谢谢
【解决方案2】:

在我们的情况下,我们在 Jenkins 中通过 VSTest 运行多个单元测试 DLL。

调用示例:

"c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" 
"./TestDLL1.UnitTests/bin/Debug/TestDLL1.UnitTests.dll" 
"./TestDLL2.UnitTests/bin/Debug/TestDLL2.UnitTests.dll" 
"./TestDLL3.UnitTests/bin/Debug/TestDLL3.UnitTests.dll" 
/Enablecodecoverage /UseVsixExtensions:false /Logger:trx

一些测试项目对同一个 DLL 进行了伪造,大多数设置为伪造所有内容。一个测试项目只伪造一个类,如下面的 XML 所示,以防止出现“无法生成某些伪造品”的警告。

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
  <Assembly Name="Utilities"/>
  <StubGeneration>
    <Clear />
  </StubGeneration>
  <ShimGeneration>
    <Clear />
    <Add FullName="UIUtils.ExceptionDisplay"/>
  </ShimGeneration>
</Fakes>

出于某种原因,VSTest 将上述版本用于其他测试项目。修改一个测试项目以生成所有假货修复了 System.TypeLoadException 的问题。我们将来可能会整合我们的 Fakes,以便能够更轻松地限制哪些类是伪造的,但目前这是解决问题的更快方法。

如果只有更简单的方法来抑制“无法生成某些假货”警告..​​....

【讨论】:

    【解决方案3】:

    在多个单独的单元测试项目中使用 Shims 时也会遇到类似的问题。显然,生成的垫片可以覆盖每个或类似的东西。

    这是我修复它的说明:滚动到此页面的中间:https://msdn.microsoft.com/en-us/library/hh708916.aspx

    它在优化构建时间的标题下,但也可以用它来解决您的问题。

    由于此类程序集在您的机器上很少更改,因此您可以在其他项目中重复使用生成的 Fakes 程序集。从您的单元测试项目中,您可以简单地参考 放置在 FakesAssemblies 下的已编译 Fakes 程序集 在项目文件夹中。

    • 创建一个与 .NET 运行时版本匹配的新类库 你的测试项目。我们称之为 Fakes.Prebuild。去除 项目中的 class1.cs 文件,不需要。

      添加对您需要的所有系统和第三方程序集的引用 假货为。并生成假货,根据需要编辑 .fakes 文件, 并构建以生成假程序集。

      来自您的单元测试项目只需确保您有参考 到 Fakes 运行时 DLL:C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE\PublicAssemblies\Microsoft.QualityTools.Testing.Fakes.dll

      然后,对于您为其创建 Fakes 的每个程序集,添加一个 引用对应的DLL文件 项目的 Fakes.Prebuild\FakesAssemblies 文件夹。 (这个文件夹 编译时创建)

      要确认您需要通过浏览将参考添加到 生成假程序集..

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 1970-01-01
      • 2010-11-27
      • 2013-10-13
      • 2018-11-17
      • 2011-10-05
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多