在JMeter中,如何循环直到找到结果

时间:2019-04-17 16:56:14

标签: jmeter

我在Jmeter中有一个需要循环的请求,直到找到所需的结果。我已经读了一些关于while控制器的信息,但是发现它们对看起来很重要的信息或正在使用旧版本的Jmeter都无济于事

我当前正在使用Jmeter 5.0,并且尝试实现了while控制器,但是失败了,因为我认为我不了解如何正确处理响应,甚至无法捕获响应,然后将其用作断言的比较如果该项目存在。

我从HTTP请求调用响应中得到了一个响应,看起来像这样:

{"data":{"getIDs":{"Page": 1,"PageSize": 25,"PageCount": 1,"isFirstPage": true,"batches":[{"id":"b601a257-13fe-4de3-b779-a5922e89765a"},{"id":"b601a257-13fe-4de3-b779-a5922e89765b"},{"id":"b601a257-13fe-4de3-b779-a5922e89765c"}]}}

我需要重新调用端点,直到找到我要查找的ID或10次尝试后将其取消

1 个答案:

答案 0 :(得分:1)

所以在摸索了一下我之后,我发现自己的答案似乎很好。但是我建议在将我的知识当作福音之前,先看看其他资料。

基本结构如下:

Setup of loop

在线程中设置变量,然后创建while循环作为下一步。在While循环中,我创建了一个计数器,然后添加了我想循环的请求。为了使循环更有效,我在请求下放置了三个项目。

  • 响应断言:此检查是否为200状态,因为呼叫永远不会失败
  • 恒定计时器:端点轮询之间存在延迟
  • JSR223断言:使用的常规代码可确保处理while循环逻辑

用户定义的变量:

User Defined Variables

这里我设置了两个变量:

  • DONE:Done是一个字符串值,如果我的JSR223断言在HTTP请求中找到我要查找的值,我会更改
  • MyValue (这在我的实际测试中是动态驱动的,出于演示目的,我只是声明要查找的值,即12345)

同时使用控制器:

While Controller

我仍然觉得我可能无法正确理解这一点,但是在进行了一次谷歌搜索之后,尽管遇到了JMeter控制台中的一些错误,但还是遇到了以下对我有用的代码:

${__javaScript(("${DONE}" != "yep" && ${Counter} < 10),)}

这段代码是说while循环将持续到满足以下两个条件之一为止:

  • DONE(先前创建的变量)等于值yep
  • 计数器小于10 (计数器在while循环下声明)

计数器:

Counter

这是一个简单的配置步骤,一旦我了解它需要在while循环内,就可以正常工作,我配置了以下内容:

  • 起始值= 1
  • 增量= 1
  • 导出的变量名称=计数器
  • 选中“为每个用户独立跟踪计数器”
  • 选中“在每次线程组迭代时重置计数器”

(导出的变量名称:您可以随意调用此名称,在此演示中,我将其命名为counter)

JSR223断言:

JSR223 Assertion

这是一个简单的脚本声明,仅使用布尔值和几个if语句来声明测试状态。

import org.apache.commons.lang3.StringUtils;

def done = vars.get("DONE");
String response = prev.getResponseDataAsString(); //retrieves the http request response as text
String MyValue = vars.get("MyValue");
def counter = vars.get("Counter");


//Find Substring within response string and stor result as boolean
String container = response;
String content = MyValue;
boolean containerContainsContent = StringUtils.containsIgnoreCase(container, content);

//Check if the true condition is met and change the value so the loop exits
if (containerContainsContent == true){
    log.info("------------------------Got Here");
    vars.put("DONE", "yep");

    }

//Force test to fail after 10 loops 
if (Counter.toString() == "10"){
    assert 1 == 2
}