我有 2 个 HTTP 请求:一个用于从 api 获取数据,另一个用于将数据 POST 到 api。
GET 请求会带来 JSON 格式的多个用户。 POST 请求需要每个用户 1 个请求。因此我需要:
根据用户数量多次循环相同的 POST 请求(已经通过使用 while Controller 从 JSON 响应检查用户数量来做到这一点)。
对于每个 POST 请求,我需要根据 JSON 响应中的用户信息更新此类请求中使用的变量。
我尝试的方法是在 POST 请求中使用 BeanShell PreProcessor,但我遇到了麻烦。
假设 POST 请求正文中有一个名为 ${name} 的变量。我正在使用 JSON Extractor PostProcessor(在 GET 请求上)路径:“Travelers[0].FirstName”,它返回第一个用户的名字,但随后我需要第二个用户的名称(Travelers 1 .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"
}
]
}
这是后置处理器 JSON Extractor在我正在使用的 GET 请求中。它当前正在将从 JSON 响应 (Victor) 获得的第一个名称分配给变量 ${Name} 我需要在下一次迭代(POST 请求)中,变量 ${Name} 返回该路径中的下一个名称,即 Julio。
最佳答案
这是解决方案..
- 添加 JSON Extractor对于 get 请求.. 使用匹配号 -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.在post请求中添加JSR223 Pre Processor并添加以下代码
vars.put("name",vars.get("FirstName_"+vars.get("counter")));
这会将 FirstName_Matchno 的值存储在名称变量中。
- 添加 JSR223 Post Processor到 POST 请求并增加计数器。
int counter = Integer.parseInt(vars.get("counter")) +1; vars.put("counter",Integer.toString(counter));
您可以在结果中看到它在循环的每次迭代中替换不同的名称
如果有帮助请告诉我..
关于jmeter - 如何在 Jmeter BeanShell 中循环 HTTP 请求并每次更新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50974115/