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

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

因为我想要 需要要测试各种不同的输入,有效地测试服务,我将CSV设置为一个1000行作为单元测试的数据源。

我可以运行这个单位测试,它将通过所有行旋转,顺序地使用不同的值调用Web服务。

然而,这不是我需要的。我需要每行对应于不同的线程上的不同的用户,使用负载测试配置包括思考时间,旋转载重用户,测试混合配置等。

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

...

所以,如何将数据源挂钩到负载测试,并且具有加载测试启动每个用户的单位测试实例,具有不同的值?

有帮助吗?

解决方案

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

而不是从控制台应用程序方法和负载测试创建单元测试单元测试,我创建了一个简单的ASP.NET Web表单,拍摄了输入并称为Web服务。

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


  1. 录制测试后,我将CSV添加为该测试的DataSource。

  2. 有2个'请求'录制:初始获取和后续帖子。 确保您留下它们!我删除了favicon.ico请求,因为它不存在。 (这些预防措施可以避免)

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

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

  5. 我然后创建了根据正在运行的UserID(int)手动移动光标的WebTestPlugin(从链接答案)。这将对应于用户实例根据步骤计划对负载测试旋转。创建此类后,构建项目,然后将其添加到您的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);                        
        }
    }
    
    .

其他提示

只是为了回答你的问题,我很确定这不能从一个mstest和nunit的框中完成(此方法不会粘在此方案中)。


但是,恕我直言,只是不要去那里......从我的经验中,模拟〜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);
}
.

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top