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

时间:2011-04-18 12:47:51

标签: visual-studio testing

我一直在使用Visual Studio负载测试框架来加载测试Web服务。

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

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

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

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

//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();
    }
}

可以向我解释为什么我会看到这种行为吗?

提前致谢。 凯文

2 个答案:

答案 0 :(得分:0)

在Visual Studio中处理负载测试时会想到一些事项。

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

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

所有这些开箱即用的东西,以及我们认为“免费”的东西确实会影响上述测试的性能。

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

答案 1 :(得分:0)

使用控制台应用程序,不会限制请求 - 您只是从客户端全力以赴。使用VS负载测试时,还有其他因素会限制请求数(例如迭代总数)。

例如,如果启用了测试迭代,则会在负载测试期间传播它们。通常,这会降低您的测试频率。如果您设置了100个测试迭代,并且您运行了一个小时的测试,并且每个测试需要30秒,那么您将减少20个测试(在整个小时内均匀分布)。

这里还有一个回调模型。负载测试支持负载测试插件模型和请求插件模型,因此单元测试将产生负载测试运行器,其可以交换到新的虚拟用户;即使为1个虚拟用户设置了测试,在整个测试过程中它也可能不是同一个虚拟用户。您将进行报告和记录,此外,您可能正在为您的单元测试和其他一些活动启动新的应用程序主机“容器”。即使情况并非如此,您也不会将所有时间都花在单元测试的上下文中。

即使在单元测试中,也有其他方法在运行,如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行数据,它也可能不会像您编写的循环那样快速运行,但它可以轻松配置额外的工作并同时运行多个单元测试。 / p>

您可能需要仔细阅读http://vsptqrg.codeplex.com/的效果测试快速参考指南。

现在,将常量负载设置为1个用户不会利用装载工具的任何好处 - 您已经在不运行多个用户的情况下承担了线程池的开销。如果增加用户数并让VS负载测试为您管理上下文切换,您可能会开始看到好处。另一个好处是创建一个你可以轻松改变的测试组合,加上收集perfmon统计数据,应用阈值规则等等。你真的没有在控制台应用程序中做任何这些。