Visual Studio负载测试框架vs控制台应用程序-奇怪的结果



我一直在使用Visual Studio Load Testing框架对web服务进行加载测试。

如果我保持我的测试简单,并使用恒定的本地机器1个用户的负载模式,我能够每秒生成'x'个请求。

或者,如果我使用控制台应用程序运行相同的测试,同步调用web服务,控制台应用程序生成的负载是使用Visual Studio load Testing框架的两倍。

如果我尝试扩展我的负载测试以使用多个测试代理(8核)也是如此- VS框架不会产生接近运行多个实例的控制台应用程序的负载量。

这是我用来生成load的两个不同单元测试:

//Unit test used for load testing
[TestMethod]
public void HappyReturnCase_Test()
{
    HttpWebRequest req = WebRequest.Create("http://myurl") as HttpWebRequest;
    req.Method = "GET";
    req.GetResponse().Close();
}
//Console app version  
private static void Main(string[] args)  
{  
    for (int i = 0; i < 200000; i++)  
    {
        HttpWebRequest req = WebRequest.Create("http://myurl") as HttpWebRequest;
        req.Method = "GET";
        req.GetResponse().Close();
    }
}
谁能给我解释一下为什么我可能会看到这种行为?

提前感谢。凯文

在Visual Studio中处理负载测试时,有几件事需要考虑。

  • 您使用的是哪种数据捕获?
  • 是否有代码覆盖率的检测?

您还需要记住,在Visual Studio中,您是在测试框架中调试代码,而测试框架不仅仅是简单地调用您的代码。它分析结果,检查异常,记录调用代码前后的所有数据,用捕获的数据生成报告…

所有这些现成的东西,我们认为是"免费的",确实对上述测试的性能产生了影响。

虽然每秒的请求数,正如你所说的,在VS中比在应用程序中要低,但你还需要权衡测试框架为你做的所有其他事情。

对于控制台应用程序,没有请求的限制—您只是从客户端进行全面的处理。对于VS负载测试,还有其他因素会限制请求的数量(比如迭代的总次数)。

例如,如果您启用了测试迭代,那么您将把它们分散到负载测试的整个过程中。一般来说,这会降低你的测试频率。如果您设置了100个测试迭代,并且您要运行测试一个小时,并且每个测试需要30秒,那么您将因此少运行20个测试(在整个小时内均匀分布)。

这里还有一个回调模型。负载测试支持负载测试插件模型和请求插件模型,因此单元测试将屈服于负载测试运行器,它可能会切换到一个新的虚拟用户;即使为一个虚拟用户设置了测试,在整个测试过程中也可能不是同一个虚拟用户。您将进行报告和日志记录,另外您可能要为单元测试启动一个新的应用程序主机"容器",以及一些其他活动。即使不是这样,您也没有把所有的时间都花在单元测试的上下文中。

即使在单元测试中,也有其他方法在运行,如ClassInitialize, TestInitialize,设置计时器等。另外,有一个线程池正在被使用,即使只用于一个用户。有关负载测试运行器如何运行单元测试的更多信息,请参阅http://blogs.msdn.com/b/billbar/archive/2007/10/12/features-and-behavior-of-load-tests-containing-unit-tests-in-vsts-2008.aspx。即使您将该单元测试绑定为运行100行数据,它也可能不会像您编写的循环那样运行得那么快,但是它可以轻松地配置额外的工作并同时运行多个单元测试。

您可能需要通读一下http://vsptqrg.codeplex.com/上的性能测试快速参考指南。

现在,将恒定负载设置为1个用户并没有利用负载模式的任何好处——您在没有运行多个用户的情况下承担了线程池的开销。如果你增加用户数量,并让VS负载测试为你管理上下文切换,你就会开始看到好处。另一个好处是创建一个可以轻松更改的测试组合,以及收集性能统计数据、应用阈值规则等。这些在控制台应用中都不会用到

相关内容