繁体   English   中英

TFS伪造构建单元测试失败

[英]TFS Fakes Build Unit test failure

我们有一个VS2013 .net 5.0解决方案(VS2013 Premium),所有单元测试都在本地传递正常,但是在使用此类似或类似异常的TFS Build在VS Test Loader中运行时未通过多次测试: 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更新为最新的更新5?

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

在我们的情况下,我们通过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有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的问题。 我们可能会在未来巩固我们的假货,以便能够更容易地限制伪造哪些类别,但是现在这是一个更快的解决方案。

如果只有一种更容易的方法来压制“一些假货无法生成”警告..​​....

在多个单独的单元测试项目中使用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文件的引用。 (编译时会创建此文件夹)

    确认您需要通过浏览添加引用到生成的假装配..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM