我有一个使用Visual Studio Unit Test框架的测试套件。它最初是在VS2010的.NET 4.0上开发的。
升级到.NET 4.5 / VS2013后(没有逻辑更改,只是在csproj文件中碰撞.NET版本)相同的测试运行速度慢了x2倍。它在IDE或控制台(vsconsole / vstest)中执行时都会发生。
在我将几个升级的测试移植到使用NUnit后,执行时间恢复正常@ 4.5 / 2013。我完全不知道根本原因是什么以及如何解决这个问题。主要嫌疑人是VSTest的InIsolation参数,但它似乎对执行时间没有任何影响。关于以上所有的想法?我无法移植所有测试,因为它们有很多,这种方法需要在更改构建脚本方面做出更多的努力。
答案 0 :(得分:1)
事实证明,当生成许多类时,Shims基础结构会产生很大的性能开销。我们通过创建明确的"无垫片来解决问题。不使用它们的方法的上下文,只标记生成填充程序所需的类:
/// <summary>
/// Executing method without ShimsContext being created.
/// </summary>
/// <param name="action">Action to execute.</param>
/// <remarks>Usage: ExecuteWithoutShimsContext(()=> TestMethod()); </remarks>
public static void ExecuteWithoutShimsContext(FakesDelegates.Action action)
{
if (action == null)
{
throw new ArgumentNullException("action");
}
using (UnitTestIsolationRuntime.AcquireProtectingThreadContext())
{
action();
}
}
System.fakes配置文件示例:
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
<Assembly Name="System" Version="4.0.0.0"/>
<ShimGeneration>
<Clear/>
<Add FullName="System.Diagnostics.Process"/>
<Add FullName="System.Net.Sockets.TcpClient"/>
<Add FullName="System.Net.Sockets.NetworkStream"/>
<Add FullName="System.ComponentModel.BackgroundWorker"/>
<Add FullName="System.ComponentModel.Component"/>
<Add FullName="System.Timers.Timer"/>
</ShimGeneration>
</Fakes>