如何在 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 个请求。因此我需要:

  1. 根据用户数量循环多次相同的 POST 请求(已经使用 while 控制器检查 JSON 响应中的用户数量) ).

  2. 对于每个 POST 请求,我需要根据 JSON 响应中的用户信息更新此类请求中使用的变量。

我尝试的方法是在 POST 请求中使用 BeanShell PreProcessor,但我遇到了麻烦。

假设在 POST 的请求正文中有一个名为 ${name} 的变量。我正在使用 JSON Extractor PostProcessor(在 GET 请求上)路径:"Travelers[0].FirstName" return 是第一个用户的名字,但我需要第二个用户的名字(Travelers1.FirstName) 在发送 POST 请求之前分配给同一个变量 ${name} ,依此类推。

问题是我不知道如何从另一个先前请求的 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。

这是解决方案..

  1. 向获取请求添加一个 JSON Extractor .. 使用匹配号 -1 存储所有名字,如下所示。

我正在使用单个 JSON 提取器提取所有名字并将其存储在 JMeter 变量中 2. 对同一个get请求添加一个JSR223 Post processor并将计数器值设置为1

vars.put("counter","1");
  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 的值存储在名称变量中。

  1. 向 POST 请求添加 JSR223 Post Processor 并增加计数器。

int counter = Integer.parseInt(vars.get("counter")) +1; vars.put("counter",Integer.toString(counter));

您可以在结果中看到它在循环的每次迭代中替换了不同的名称

如果有帮助请告诉我..