TFS伪造构建单元测试失败

我们有一个VS2013 .net 5.0解决方案(VS2013 Premium),所有单元测试在本地通过正常,但在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 Update 5。 有什么可能导致这个问题吗? 我们是否应该将TFS更新到目前为Update 5的最新版本?


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


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

示例呼叫:

"c:Program Files (x86)Microsoft Visual Studio 14.0Common7IDECommonExtensionsMicrosoftTestWindowvstest.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有Fakes,大部分设置都是假的。 一个测试项目只伪造一个类,如下面的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的问题。 我们可以在未来巩固我们的FIX,以便更容易地限制哪些类别是伪造的,但现在这是解决这个问题的更快的解决方案。

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


在多个单独的单元测试项目中使用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 for的每个程序集,请在项目的Fakes.Prebuild FakesAssemblies文件夹中添加对相应DLL文件的引用。 (这个文件夹是在你编译时创建的)

    确认您将需要通过浏览将参考添加到生成的假装配。

  • 链接地址: http://www.djcxy.com/p/29069.html

    上一篇: TFS Fakes Build Unit test failure

    下一篇: retain ripple effect during notifydatachanged in recyclerview