为什么我的JMeter While控制器无限循环?

e4yzc0pl  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(275)

我正在尝试设置一个JMeter运行来执行以下操作:
1.发出Rest API请求

  • 使用JSON提取器检查给定值数组的响应。
  • 我将成功定义为所有“Items[*].Success”节点等于“true”
  • 如果响应成功,则退出循环(继续步骤#5
  • 如果响应失败,返回步骤#1
  • ...我的其余测试步骤

下面是我为此所做的设置:

  • 使用BeanShellAssert初始化循环变量:
  • 第一个月
  • 当控制器的条件设置为
  • ${__BeanShell(props.get("is_any_calc_pending")}
  • "我的问题就在这里,循环永不停止"
  • 进行Rest API调用(按预期工作)
  • JSON提取器(也按预期工作)
  • 创建变量的名称= API_successs
  • JSON路径表达式= $.Items[*]。成功
  • 匹配编号= -1
  • 计算串联=选中
  • 默认值=未设置API成功
  • JSR 223后处理器设置为Javascript以更新循环变量的值。

下面是第5步的代码,它只是检查JSON提取器创建的api_successes_ALL变量中是否存在“false”。

var api_successes_ALL = vars.get('api_successes_ALL')
var all_successful = api_successes_ALL.indexOf('false') < 0
props.put('is_any_calc_pending',!all_successful)

大部分这样的工作正如我所期望的;我可以用调试取样器来检查。我遇到的问题是循环永远不会停止。条件永远不会导致循环中断。
在日志中,我看到这一行:

DEBUG o.a.j.c.WhileController: Condition value: 'false'

文档中说While控制器会一直运行直到条件为false。从我在日志中看到的情况来看,条件总是false。我也不明白While控制器为什么从来没有看到我的is_any_calc_pending的值发生了变化。我可以在调试采样器中看到值发生了变化。
变量被重新初始化了吗?我想知道我的变量或属性是否超出了作用域。

3b6akqbq

3b6akqbq1#

我明白了。我是这么做的:

  • 简单控制器(我不确定是否有必要)
  • 进行Rest API调用以启动流程
  • 控制器时,参见以下条件代码
  • 进行Rest API调用以检查状态
  • JSON提取器,具有我在问题中列出的相同属性值

我没有预料到,但是While控制器可以访问JSON提取器中生成的变量。我认为简单控制器可能导致了这一点。
我把log.warn()调用留在那里,以显示我是如何调试这个条件的。

${__javaScript(
    log.warn( vars.get("api_successes_ALL") );

    !!vars.get("api_successes_ALL") ?
    (vars.get("api_successes_ALL").indexOf("false") >= 0) :
    "true";
)}
gojuced7

gojuced72#

找到了
JSON后处理器必须是请求的子级,而不是While循环的子级。
在这上面浪费了几个小时。

  • While循环
  • HTTP请求
  • JSON提取器
  • 延迟

相关问题