C# Visual Studio 2013测试运行程序(VSTest)大大降低了测试的执行速度
我有一个使用VisualStudio单元测试框架的测试套件。它最初是在VS2010的.NET4.0上开发的C# Visual Studio 2013测试运行程序(VSTest)大大降低了测试的执行速度,c#,performance,visual-studio-2010,unit-testing,visual-studio-2012,C#,Performance,Visual Studio 2010,Unit Testing,Visual Studio 2012,我有一个使用VisualStudio单元测试框架的测试套件。它最初是在VS2010的.NET4.0上开发的 升级到.NET 4.5/VS2013后(没有逻辑更改,只是在csproj文件中碰撞.NET版本),相同的测试运行速度慢2倍。在IDE内执行或从控制台(vsconsole/vstest)执行时都会发生这种情况 在我移植了一些升级的测试以使用NUnit之后,执行时间恢复正常@4.5/2013。我完全不知道根本原因是什么以及如何解决这个问题。主要嫌疑犯是VSTest的InIsolation参数,
升级到.NET 4.5/VS2013后(没有逻辑更改,只是在csproj文件中碰撞.NET版本),相同的测试运行速度慢2倍。在IDE内执行或从控制台(vsconsole/vstest)执行时都会发生这种情况
在我移植了一些升级的测试以使用NUnit之后,执行时间恢复正常@4.5/2013。我完全不知道根本原因是什么以及如何解决这个问题。主要嫌疑犯是VSTest的InIsolation参数,但它似乎对执行时间没有任何影响。对以上所有方面有什么想法吗?我不能移植所有的测试,因为有很多测试,而且这种方法需要在更改构建脚本时付出更多的努力。事实证明,当生成大量类时,基础结构会产生很大的性能开销。我们通过为不使用垫片的方法创建显式的“无垫片”上下文并仅标记生成垫片所需的类来解决问题:
/// <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();
}
}
//
///在不创建ShimsContext的情况下执行方法。
///
///要执行的操作。
///用法:ExecuteWithoutShimsContext(()=>TestMethod());
public static void ExecuteWithoutShimsContext(FakesDelegates.Action)
{
if(action==null)
{
抛出新的异常(“操作”);
}
使用(UnitTestIsolationRuntime.AcquireProtectionThreadContext())
{
动作();
}
}
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>