Web 性能测试将表单发布参数数组绑定到数据源

Posted

技术标签:

【中文标题】Web 性能测试将表单发布参数数组绑定到数据源【英文标题】:web performance test bind form post parameters array to a data source 【发布时间】:2015-08-06 06:07:43 【问题描述】:

在 Web 性能测试中,我有一个 POST 请求,它需要一组用户及其详细信息。没有用户可以是 1 到 100+。

通过网络测试记录器,我捕获了一个包含 3 个用户的 POST 请求。

POST 请求

WebServer1/test/mypage/users
  |-  Form Post Parameters
      |-  Users[0].Id=90001
      |-  Users[0].FirstName=Rice
      |-  Users[0].LastName=Bran
      |-  Users[1].Id=90002
      |-  Users[1].FirstName=Samantha
      |-  Users[1].LastName=Rock
      |-  Users[1].Id=90003
      |-  Users[1].FirstName=Jenny
      |-  Users[1].LastName=Bryan

我需要为 100 位用户发送请求。一种方法是在请求中手动添加表单发布参数,但是以后的维护会很困难。

我正在考虑使用像 csv 这样包含用户详细信息的数据源,并以某种方式将它们绑定到发布参数中。

CSV(测试用户)

Id,FirstName,LastName
90001,Rice,Bran
90002,Samantha,Rock

我尝试将它们绑定为如下所示的 post 参数,但它不起作用。 [只需要一个数据行]

表单帖子参数与 csv 数据绑定

WebServer1/test/mypage/users
  |-  Form Post Parameters
      |-  Users.Id=users.users#csv.Id
      |-  Users.FirstName=users.users#csv.FirstName
      |-  Users.LastName=users.users#csv.LastName

有谁知道从数据源创建表单发布参数数组的正确方法。我需要为此创建编码的网络测试或一些插件吗? (我会尝试,但简单的绑定会很棒)


编辑:2015 年 9 月 10 日

我找不到任何解决方案。最终创建了一个编码的网络测试,它将为每个数据行添加一个请求。

在编码的 web 测试中添加了这个部署项:

[DeploymentItem("Project\\Data\\users.csv")] 
public class HelloCodedWebtest : WebTest

    public HelloCodedWebtest()
           
        .....              
        .....

       // new Users().GetUsers() reads the csv and returns a list of user object, which i have stored in the context
       this.Context.Add("Users", new Users().GetUsers());           
    

     public override IEnumerator<WebTestRequest> GetRequestEnumerator()
     
        ......
        ......

        // Here for the request I have created the form post body from the list of users stored which was stored in the context.

        var myUsers = (List<User>) this.Context["Users"];

        foreach (var u in myUsers)
        
            request2Body.FormPostParameters.Add("Users["+ myUsers.IndexOf(recipient) +"].Id", u.Id);
            request2Body.FormPostParameters.Add("Users["+ myUsers.IndexOf(recipient) +"].FirstName", u.FirstName);
            request2Body.FormPostParameters.Add("Users["+ myUsers.IndexOf(recipient) +"].LastName", u.LastName);
        

        ....
     

到目前为止,这工作得很好,但我更喜欢带有一些插件的普通网络测试,而不是编码网络测试。

【问题讨论】:

您希望使用问题中显示的两行加标头 CSV 文件生成什么请求?数据源字段是从测试上下文访问的,它们的值通过用双花括号括起来来访问。因此,您上面的一行应显示为|- Users.FirstName=users.users#csv.FirstName。通常,短语“它不起作用”应附有错误消息或对所发生情况的描述。 您的问题有更新吗?如果您已经解决了问题,那么您可能会写一个答案来指导其他有类似问题的人。如果您还没有解决问题,那么您可以edit该问题以添加更多详细信息,以便其他人帮助您。 【参考方案1】:

根据更新后的问题,询问如何使用插件进行工作,基于以下内容的东西应该可以工作。请注意,代码尚未编译或测试。

在 web 测试的 PreWebTest 插件中,您可以像在问题中一样读取 CSV。下面的插件会将用户数据保存到上下文中。

public class WriteTestStatus : WebTestPlugin

    public virtual void PreWebTest(object sender, PreWebTestEventArgs e)
    
        e.WebTest.Context.Add("Users", new Users().GetUsers());
    

要利用数据并构建正确的表单发布参数,请使用附加到请求的PreRequest 插件。

public class AddUserDetails : WebTestRequestPlugin

    public override void PreRequest(object sender, PreRequestEventArgs e)
    
        FormPostHttpBody formBody = e.Request.Body as FormPostHttpBody;

        if (formBody == null)
        
            e.WebTest.AddCommentToResult("formBody is null");
            return;
        

        var myUsers = (List<User>) e.WebTest.Context["Users"];

        foreach (var u in myUsers)
        
            formBody.FormPostParameters.Add("Users["+ myUsers.IndexOf(recipient) +"].Id", u.Id);
            formBody.FormPostParameters.Add("Users["+ myUsers.IndexOf(recipient) +"].FirstName", u.FirstName);
            formBody.FormPostParameters.Add("Users["+ myUsers.IndexOf(recipient) +"].LastName", u.LastName);
        
    

上面使用了两个插件来匹配问题中显示的两种方法。如果 CSV 中的用户数据仅在一个请求中需要,则可能会避免将其保存到上下文变量中,并将 new Users().GetUsers() 放置在 PreRequest 插件中对 var myUsers = ... 的赋值中。

【讨论】:

现在看起来很简单。谢谢。我会试一试的。

以上是关于Web 性能测试将表单发布参数数组绑定到数据源的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给 symfony 5.4 表单测试不起作用

web性能测试要注意的事

Web性能测试参数

使用python对oracle进行简单性能测试

性能测试后要收集哪些参数[关闭]

Microsoft Visual Studio Web 性能测试记录器可以将文件从 Internet Explorer 保存到本地磁盘吗?