4

我正在尝试加载测试 Web 服务。

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

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

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

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

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

...

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

4

3 回答 3

4

我最终使用这个答案作为指导:https ://stackoverflow.com/a/7813465/237723

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

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


  1. 记录测试后,我将 CSV 作为数据源添加到该测试中。

  2. 记录了 2 个“请求”:初始 GET 和后续 POST。确保你离开他们两个!我删除了 favicon.ico 请求,因为它不存在。(这些预防措施可能是可以避免的)

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

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

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


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);                        
    }
}
于 2012-10-04T14:12:21.753 回答
3

只是为了回答你的问题,我很确定这不能开箱即用 MSTest 和 NUnit (这种方法不会在这种情况下坚持)。


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

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

我推荐的是自己编写一个工具,并在不同的机器上运行它。它不必由测试框架运行(我不能让自己称其为单元测试,因为它不是),控制台应用程序可以解决问题。这里有一些代码可以帮助您入门:

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);
}
于 2012-10-04T06:13:31.910 回答
0

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

在此处输入图像描述

于 2018-12-13T09:12:05.520 回答