Visual Studio Load Test以数据驱动方式模拟许多用户?

时间:2012-10-03 14:34:24

标签: visual-studio-2010 visual-studio unit-testing load-testing data-driven-tests

我正在尝试加载测试网络服务。

我有一个简单的方法,它将2个参数发送到Web服务并返回响应,然后我从这个方法创建了一个单元测试。

因为我希望 需要来测试各种不同的输入以有效地测试服务,所以我设置了一个包含~1000行的CSV作为单元测试的数据源。

我可以运行这个单元测试,它将遍历所有行,依次调用具有不同值的Web服务。

然而,这不是我需要的。我需要每一行对应不同线程上的不同用户,使用负载测试配置包括思考时间,增加用户步进负载,测试组合配置等。

我可以通过从单元测试中删除我的数据源并硬编码值来实现这一点。 但这是一个根本上有缺陷的测试: 为了真的测试网络服务,我需要每个用户发送不同的值并获得不同的结果。

...

那么,如何将数据源挂钩到负载测试并让负载测试以不同的值启动每个用户的单元测试实例?

3 个答案:

答案 0 :(得分:4)

我最终将此答案作为指南:https://stackoverflow.com/a/7813465/237723

我没有从控制台应用程序方法和负载测试 单元测试创​​建单元测试,而是创建了一个简单的ASP.NET Web表单,它接受了输入并调用了Web服务。

我使用这个新表单录制了一个Web性能测试,并创建了一个负载测试来运行该WPTest。


  1. 记录测试后,我将CSV作为DataSource添加到此测试中。

  2. 记录了2个“请求”:最初的GET&随后的POST。 确保将它们都保留!我删除了favicon.ico请求,因为它不存在。 (这些预防措施可以避免)

  3. 通过扩展POST请求,我修改了与我的2个Web服务输入相对应的TextBox参数的属性,以从CSV中的相应列获取它们的值。

  4. 我将DataSource Access方法更改为“不自动移动光标”(您必须将DataSource扩展到表并通过右键单击/ F4编辑其属性。)

  5. 然后我创建了WebTestPlugin(来自链接的答案),它根据正在运行的UserID(一个int)手动移动光标。这将根据步骤计划对应于负载测试旋转的用户实例。创建此类后,构建项目,然后将其添加到Web性能测试中。


  6. public class webtestplugin : WebTestPlugin
    {
        public override void PreWebTest(object sender, PreWebTestEventArgs e)
        {
            base.PreWebTest(sender, e);
            e.WebTest.MoveDataTableCursor("DataSource1", "addresses#csv", e.WebTest.Context.WebTestUserId);                        
        }
    }
    

答案 1 :(得分:2)

只是回答你的问题,我很确定这不能在MSTest和NUnit的框中完成(this approach不会在这种情况下坚持下去。)


但是,恕我直言,只是不去那里...根据我的经验,模拟单个机器中的〜1000个用户将产生结果,因为测试会遇到各种各样的客户端限制 - 线程池问题,传出和传入流量问题等。我不是说这是无法克服的,但它足够扭曲以考虑不同的方法。

在这种情况下,我实际上不建议使用负载测试工具(其中有很多),因为它很简单,可以编写自己的小工具并跳过配置问题和第3版的学习曲线派对。

我的建议是,编写自己的工具,并从单独的机器运行它。它不必由测试框架运行(我无法将自己称为单元测试,因为它不是),控制台应用程序将完成这一操作。这里有一些代码可以帮助您入门:

private ConcurrentBag<string> logs = new ConcurrentBag<string>();

public void GetLoad(int numberOfUsers, List<string> myParams)
{
    var users = new string[numberOfUsers];
    for (int i = 0; i < numberOfUsers; i++)
    {
        users[i] = string.Format("LoadTest{0}", i + 1);
    }

    var userThreads = new List<Thread>();
    for (int i = 0; i < numberOfUsers; i++)
    {
        int index = i;
        userThreads.Add(new Thread(()=> CallWebService(users[index], myParams[index])));
    }

    Parallel.ForEach(userThreads, thread=>thread.Start());
    foreach (var userThread in userThreads)
    {
        userThread.Join();
    }
    var outputFilename = string.Format("LoadTest.{0}Users.txt", numberOfUsers);
    File.AppendAllLines(outputFilename, logs);
}

答案 2 :(得分:0)

图像显示了在哪里进行修改。

Brucke