如何在Jmeter BeanShell中每次都循环一个HTTP请求并更新变量


问题内容

我有2个HTTP请求:一个请求从api获取数据,另一个请求将数据发布
到api。

GET请求将多个用户带入JSON。POST请求要求
每个用户1个请求。因此,我需要:

  1. 根据用户数量循环几次相同的POST请求(已经通过使用while控制器来执行此操作,该控制器从JSON响应中检查用户数量)。

  2. 对于每个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提取器尝试过此操作,但是问题是,如果我使用
路径:Travellers [*]。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提取器 。它当前正在将从JSON响应(Victor)获得的名字分配给变量$ {Name},我需要在POST请求的下一次迭代中,变量$ {Name}返回该路径中的名字,这是Julio。


问题答案:

这是解决方案..

  1. 将一个JSON提取器添加到get请求..使用match no -1来存储所有名字,如下所示。在此处输入图片说明
    我正在提取所有名字,并使用单个
    JSON提取器2 将其存储在JMeter变量中。向相同的get请求添加JSR223 Post
    处理器
    并将计数器值设置为1

    vars.put(“counter”,”1”);

  2. Add a while loop to the test plan and add the following condition to the while loop.

${__javaScript(parseInt(${counter})<=parseInt(vars.get(“FirstName_matchNr”)),)}

4.在发布请求中添加一个JSR223 预处理器并添加以下代码

vars.put("name",vars.get("FirstName_"+vars.get("counter")));

This will store FirstName_Matchno’s value in name variable.

  1. Add a JSR223 Post Processor to the POST Request and increment the counter.

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

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

让我知道是否有帮助。