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文件的引用。 (这个文件夹是在你编译时创建的)
确认您将需要通过浏览将参考添加到生成的假装配。
上一篇: TFS Fakes Build Unit test failure
下一篇: retain ripple effect during notifydatachanged in recyclerview