Web 性能测试将表单 post 参数数组绑定到数据源
web performance test bind form post parameters array to a data source
在网络性能测试中,我有一个 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 位用户发送请求。一种方法是在请求中手动添加表单 post 参数,但以后的维护会很困难。
我正在考虑使用像 csv 这样包含用户详细信息的数据源,并以某种方式将它们绑定到 post 参数。
CSV(测试用户)
Id,FirstName,LastName
90001,Rice,Bran
90002,Samantha,Rock
我试图将它们绑定到形成 post 参数,如下所示,但它不起作用。 [只需要一个数据行]
form 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
有谁知道从数据源创建表单 post 参数数组的正确方法。我是否需要为此创建编码的网络测试或一些插件? (我打算尝试一下,但简单的绑定会很棒)
编辑: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);
}
....
}
}
到目前为止一切正常,但我更喜欢使用一些插件的普通网络测试,而不是编码的网络测试。
根据询问如何使用插件进行工作的更新问题,基于以下内容的内容应该可以工作。请注意,代码尚未经过编译或测试。
在网络测试的 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);
}
}
}
上面使用了两个插件来匹配问题中显示的两种方法。如果只有一个请求需要来自 CSV 的用户数据,则可以避免保存到上下文变量中,并且 new Users().GetUsers()
放置在 PreRequest
插件中对 var myUsers = ...
的赋值中。
在网络性能测试中,我有一个 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 位用户发送请求。一种方法是在请求中手动添加表单 post 参数,但以后的维护会很困难。
我正在考虑使用像 csv 这样包含用户详细信息的数据源,并以某种方式将它们绑定到 post 参数。
CSV(测试用户)
Id,FirstName,LastName
90001,Rice,Bran
90002,Samantha,Rock
我试图将它们绑定到形成 post 参数,如下所示,但它不起作用。 [只需要一个数据行]
form 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
有谁知道从数据源创建表单 post 参数数组的正确方法。我是否需要为此创建编码的网络测试或一些插件? (我打算尝试一下,但简单的绑定会很棒)
编辑: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);
}
....
}
}
到目前为止一切正常,但我更喜欢使用一些插件的普通网络测试,而不是编码的网络测试。
根据询问如何使用插件进行工作的更新问题,基于以下内容的内容应该可以工作。请注意,代码尚未经过编译或测试。
在网络测试的 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);
}
}
}
上面使用了两个插件来匹配问题中显示的两种方法。如果只有一个请求需要来自 CSV 的用户数据,则可以避免保存到上下文变量中,并且 new Users().GetUsers()
放置在 PreRequest
插件中对 var myUsers = ...
的赋值中。