Visual studio 2013 web性能测试将表单post参数数组绑定到数据源

Visual studio 2013 web性能测试将表单post参数数组绑定到数据源,visual-studio-2013,performance-testing,load-testing,Visual Studio 2013,Performance Testing,Load Testing,在一个web性能测试中,我有一个POST请求,它接收一组用户及其详细信息。用户数不能是1到100+之间的任何值 通过web测试记录器,我捕获了一个包含3个用户的POST请求 发布请求 {{WebServer1}}/test/mypage/users |- Form Post Parameters |- Users[0].Id=90001 |- Users[0].FirstName=Rice |- Users[0].LastName=Bran

在一个web性能测试中,我有一个POST请求,它接收一组用户及其详细信息。用户数不能是1到100+之间的任何值

通过web测试记录器,我捕获了一个包含3个用户的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
{{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
我需要发送100个用户的请求。一种方法是在请求中手动添加表单post参数,但以后的维护将很困难

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

CSV(测试用户)

我试着把它们绑定成如下的post参数,但是没有用。[只需要一个数据行]

表单post参数与csv数据绑定

{{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
{{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
有人知道从数据源创建form post参数数组的正确方法吗。我需要为此创建编码的web测试或一些插件吗?(我会尝试一下,但简单的绑定就好了)


编辑:2015年9月10日

我找不到任何解决办法。最终创建了一个编码的web测试,该测试将为每个数据行添加一个请求

在编码的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);
        }

        ....
     }
}
[DeploymentItem(“Project\\Data\\users.csv”)]
公共类HellocodeWebTest:WebTest
{
公共HellocodeWebTest()
{       
.....              
.....
//new Users().GetUsers()读取csv并返回一个用户对象列表,该列表已存储在上下文中
添加(“用户”,新用户().GetUsers());
}
公共重写IEnumerator GetRequestEnumerator()
{
......
......
//对于这个请求,我从存储在上下文中的用户列表中创建了表单post body。
var myUsers=(List)this.Context[“Users”];
foreach(myUsers中的VarU)
{
request2Body.FormPostParameters.Add(“Users[”+myUsers.IndexOf(recipient)+“].Id”,u.Id);
request2Body.FormPostParameters.Add(“Users[”+myUsers.IndexOf(recipient)+“].FirstName”,u.FirstName);
request2Body.FormPostParameters.Add(“用户[”+myUsers.IndexOf(收件人)+“].LastName”,u.LastName);
}
....
}
}

到目前为止,这一切都很好,但我更喜欢一个带有插件的普通web测试,而不是一个web测试。

基于一个更新的问题,即如何使用插件,基于以下内容的测试应该会起作用。请注意,代码尚未编译或测试

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

public class WriteTestStatus : WebTestPlugin
{
    public virtual void PreWebTest(object sender, PreWebTestEventArgs e)
    {
        e.WebTest.Context.Add("Users", new Users().GetUsers());
    }
}
要利用数据并构建正确的表单post参数,请使用请求所附的以下
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);
        }
    }
}
公共类AddUserDetails:WebTestRequestPlugin { 公共覆盖无效预请求(对象发送方,预请求事件参数) { FormPostHttpBody formBody=e.Request.Body作为FormPostHttpBody; if(formBody==null) { e、 WebTest.addCommentResult(“formBody为空”); 返回; } var myUsers=(List)e.WebTest.Context[“Users”]; foreach(myUsers中的VarU) { formBody.FormPostParameters.Add(“用户[”+myUsers.IndexOf(收件人)+“].Id”,u.Id); formBody.FormPostParameters.Add(“Users[”+myUsers.IndexOf(recipient)+“].FirstName”,u.FirstName); formBody.FormPostParameters.Add(“用户[”+myUsers.IndexOf(收件人)+“].LastName”,u.LastName); } } }
上面使用了两个插件来匹配问题中显示的两种方法。如果一个请求只需要CSV中的用户数据,则可以避免将其保存到上下文变量中,并且放置在
var myUsers=…
PreRequest
插件的分配中。

您希望使用问题中显示的两行加页眉CSV文件生成什么请求?数据源字段是从测试上下文访问的,它们的值是用双大括号括起来访问的。因此,上面的一行应该显示为
|-Users.FirstName={{{Users.Users#csv.FirstName}}
。通常,短语“它不起作用”应该伴随一条错误消息或对发生的情况的描述。您的问题有什么更新吗?如果你已经解决了这个问题,那么你可以写一个答案来指导其他有类似问题的人。如果你还没有解决这个问题,那么你可以将问题添加到更多细节中,以允许其他人帮助你。现在看起来很简单。谢谢我要试一试。