如何在 Jmeter BeanShell 中每次循环 HTTP 请求并更新变量
How to loop an HTTP request and update the variables each time in Jmeter BeanShell
我有 2 个 HTTP 请求:一个是从 api 获取数据,另一个是 POST 数据到 api。
GET 请求带来了 JSON 中的多个用户。 POST 请求需要每个用户 1 个请求。因此我需要:
根据用户数量循环多次相同的 POST 请求(已经使用 while 控制器检查 JSON 响应中的用户数量) ).
对于每个 POST 请求,我需要根据 JSON 响应中的用户信息更新此类请求中使用的变量。
我尝试的方法是在 POST 请求中使用 BeanShell PreProcessor,但我遇到了麻烦。
假设在 POST 的请求正文中有一个名为 ${name} 的变量。我正在使用 JSON Extractor PostProcessor(在 GET 请求上)路径:"Travelers[0].FirstName" return 是第一个用户的名字,但我需要第二个用户的名字(Travelers1.FirstName) 在发送 POST 请求之前分配给同一个变量 ${name} ,依此类推。
我想做一个这样的for循环:
for (int i = 0; i <= numberOfTravelers; i++) {
vars.put("Name", Travelers[i].FirstName)
}
问题是我不知道如何从另一个先前请求的 JSON 响应中调用 JSON 路径。有没有一种方法可以将 jsonpath 引用到特定的 JSON 响应,或者有一种方法可以将整个 JSON 响应保存在一个变量中,然后在该变量中找到特定的值作为 JSON 路径.
我已经用 JSON 提取器尝试过,但问题是如果我使用路径:Travelers[*].FirstName,它实际上会获取 JSON 上的所有名称,但是变量 ${name} 将只存储一个名称,而不是将所有名称都存储为一个数组,稍后我可以使用普通变量 ${name[i]} 在我的 for 循环中访问该数组。这就是为什么我需要从 BeanSheall 访问 JSON 路径。
这里是 JSON 响应的示例:
{
"Travelers":
[
{
"FirstName":"VICTOR",
"Surname":"ORREGO",
"Key":"1.1",
"PassengerRPH":1,
"TypeCode":"ADT"
},
{
"FirstName":"JULIO",
"Surname":"OZAETA",
"Key":"2.2",
"PassengerRPH":2,
"TypeCode":"ADT"
}
]
}
这是我在 GET 请求中使用的 PostProcesor JSON Extractor。它当前正在将从 JSON 响应 (Victor) 中获得的名字分配给变量 ${Name}
我需要在(POST 请求的下一次迭代中)变量 ${Name} 到 return 该路径中的下一个名称,即 Julio。
这是解决方案..
- 向获取请求添加一个 JSON Extractor .. 使用匹配号 -1 存储所有名字,如下所示。
我正在使用单个 JSON 提取器提取所有名字并将其存储在 JMeter 变量中
2. 对同一个get请求添加一个JSR223 Post processor并将计数器值设置为1
vars.put("counter","1");
- 在测试计划中添加一个while loop,并在while循环中添加以下条件。
${__javaScript(parseInt(${counter})<=parseInt(vars.get("FirstName_matchNr")),)}
4.To post请求添加一个JSR223 Pre Processor并添加如下代码
vars.put("name",vars.get("FirstName_"+vars.get("counter")));
这会将 FirstName_Matchno 的值存储在名称变量中。
- 向 POST 请求添加 JSR223 Post Processor 并增加计数器。
int counter = Integer.parseInt(vars.get("counter")) +1;
vars.put("counter",Integer.toString(counter));
您可以在结果中看到它在循环的每次迭代中替换了不同的名称
如果有帮助请告诉我..
我有 2 个 HTTP 请求:一个是从 api 获取数据,另一个是 POST 数据到 api。
GET 请求带来了 JSON 中的多个用户。 POST 请求需要每个用户 1 个请求。因此我需要:
根据用户数量循环多次相同的 POST 请求(已经使用 while 控制器检查 JSON 响应中的用户数量) ).
对于每个 POST 请求,我需要根据 JSON 响应中的用户信息更新此类请求中使用的变量。
我尝试的方法是在 POST 请求中使用 BeanShell PreProcessor,但我遇到了麻烦。
假设在 POST 的请求正文中有一个名为 ${name} 的变量。我正在使用 JSON Extractor PostProcessor(在 GET 请求上)路径:"Travelers[0].FirstName" return 是第一个用户的名字,但我需要第二个用户的名字(Travelers1.FirstName) 在发送 POST 请求之前分配给同一个变量 ${name} ,依此类推。
我想做一个这样的for循环:
for (int i = 0; i <= numberOfTravelers; i++) { vars.put("Name", Travelers[i].FirstName) }
问题是我不知道如何从另一个先前请求的 JSON 响应中调用 JSON 路径。有没有一种方法可以将 jsonpath 引用到特定的 JSON 响应,或者有一种方法可以将整个 JSON 响应保存在一个变量中,然后在该变量中找到特定的值作为 JSON 路径.
我已经用 JSON 提取器尝试过,但问题是如果我使用路径:Travelers[*].FirstName,它实际上会获取 JSON 上的所有名称,但是变量 ${name} 将只存储一个名称,而不是将所有名称都存储为一个数组,稍后我可以使用普通变量 ${name[i]} 在我的 for 循环中访问该数组。这就是为什么我需要从 BeanSheall 访问 JSON 路径。
这里是 JSON 响应的示例:
{
"Travelers":
[
{
"FirstName":"VICTOR",
"Surname":"ORREGO",
"Key":"1.1",
"PassengerRPH":1,
"TypeCode":"ADT"
},
{
"FirstName":"JULIO",
"Surname":"OZAETA",
"Key":"2.2",
"PassengerRPH":2,
"TypeCode":"ADT"
}
]
}
这是我在 GET 请求中使用的 PostProcesor JSON Extractor。它当前正在将从 JSON 响应 (Victor) 中获得的名字分配给变量 ${Name} 我需要在(POST 请求的下一次迭代中)变量 ${Name} 到 return 该路径中的下一个名称,即 Julio。
这是解决方案..
- 向获取请求添加一个 JSON Extractor .. 使用匹配号 -1 存储所有名字,如下所示。
我正在使用单个 JSON 提取器提取所有名字并将其存储在 JMeter 变量中 2. 对同一个get请求添加一个JSR223 Post processor并将计数器值设置为1
vars.put("counter","1");
- 在测试计划中添加一个while loop,并在while循环中添加以下条件。
${__javaScript(parseInt(${counter})<=parseInt(vars.get("FirstName_matchNr")),)}
4.To post请求添加一个JSR223 Pre Processor并添加如下代码
vars.put("name",vars.get("FirstName_"+vars.get("counter")));
这会将 FirstName_Matchno 的值存储在名称变量中。
- 向 POST 请求添加 JSR223 Post Processor 并增加计数器。
int counter = Integer.parseInt(vars.get("counter")) +1; vars.put("counter",Integer.toString(counter));
您可以在结果中看到它在循环的每次迭代中替换了不同的名称
如果有帮助请告诉我..