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

标签 jmeter beanshell

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

GET 请求会带来 JSON 格式的多个用户。 POST 请求需要每个用户 1 个请求。因此我需要:

  1. 根据用户数量多次循环相同的 POST 请求(已经通过使用 while Controller 从 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 提取器尝试过此操作,但问题是,如果我使用路径: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。

最佳答案

这是解决方案..

  1. 添加 JSON Extractor对于 get 请求.. 使用匹配号 -1 来存储所有名字,如下所示。 enter image description here

我正在使用单个 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));

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

    enter image description here

    如果有帮助请告诉我..

    关于jmeter - 如何在 Jmeter BeanShell 中循环 HTTP 请求并每次更新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50974115/

    相关文章:

    cookies - header Cookie "sid"值赋给变量

    iteration - jmeter 停止当前迭代

    java - 获取jMeter线程已运行的时间

    java - CannotResolveClassException : org. apache.jmeter.protocol.http.sampler.HTTPSamplerProxy

    java - 重装操作系统后无法在Jmeter中记录

    Jmeter中的socket.io

    java - 如何在 BeanShell Sampler 中将 Jmeter 变量添加到 JAVA 变量?

    java - 使用 Java 在 Beanshell 中编辑 XML 值?

    jmeter - 如何在jmeter中将子样本结果更改为成功?

    java - JMeter 环境特定配置