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

时间:2018-06-21 17:10:16

标签: jmeter beanshell

我有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 Extractor。当前正在将其从JSON响应(Victor)获得的名字分配给变量$ {Name} 我需要在(POST请求的)下一次迭代中使用变量$ {Name}来返回该路径中的下一个名称,即Julio。

1 个答案:

答案 0 :(得分:1)

这是解决方法。

  1. 在获取请求中添加JSON Extractor。使用match no -1存储所有名字,如下所示。 enter image description here

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

vars.put("counter","1");
  1. 在测试计划中添加while loop,并将以下条件添加到while循环中。
  

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

4。向发布请求中添加JSR223 Pre Processor并添加以下代码

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

这会将FirstName_Matchno的值存储在名称变量中。

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

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

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

enter image description here

让我知道是否有帮助。