【问题标题】:Using BeanShell in JMeter if controller to stop thread如果控制器停止线程,则在 JMeter 中使用 BeanShell
【发布时间】:2020-06-24 00:18:19
【问题描述】:

此线程中接受的答案来自 2014 年,似乎不再起作用。我不知道为什么:JMeter. How to determine when thread group is finished

我有 2 个线程组(忽略设置组)

根据我添加的上述线程中接受的答案

  • BeanShell 预处理器vars.put("DONE", "FALSE");
  • BeanShell 后处理器
    int activeThreadCount = org.apache.jmeter.threads.JMeterContextService.getNumberOfThreads();
    if (activeThreadCount <= 1)
    {
      vars.put("DONE", "TRUE");
    }
    
  • 如果控制器${__BeanShell(vars.get("DONE") != null &amp;&amp; vars.get("DONE")=="TRUE")};
  • ... 如果触发,流控制操作会通过 Stop now 终止所有线程。

通过后处理器中的打印语句,我能够验证变量“DONE”的设置是否正确,并且条件vars.get("DONE") != null &amp;&amp; vars.get("DONE")=="TRUE" 的评估是否正确(在后处理器中使用时)。

但是,当我在 If Controller 中使用条件时,似乎没有正确评估 If Controller 的子元素内的任何代码。即使条件评估为真,“Thred Group:ETL”也会继续运行。

我的假设是,这与“将条件解释为可变表达式”复选框或 If 控制器后面的解释器有关。但不幸的是,我对 JMeter 的了解还不够,无法弄清楚这一点。

【问题讨论】:

  • 链接答案使用props 而不是vars
  • 我都试过了,没什么区别。

标签: jmeter beanshell


【解决方案1】:

不允许在 If Controller 表达式的末尾使用分号。删除分号后,控制器按预期工作

【讨论】:

    【解决方案2】:
    1. 首先要熟悉JMeter Scoping Rules,因为您的 Beanshell 前处理器和后处理器是在每个采样器之前/之后执行的,在我看来,这并不是您真正想要实现的目标
    2. 第二,since JMeter 3.1 you should be using JSR223 Test Elements and Groovy language for scripting
    3. If Controller 接受解析为 truefalse 的东西,在你的情况下是 true; 所以如果控制器的孩子永远不会被执行
    4. 可以直接从 PostProcessor 本身停止所有线程,就像 prev.setStopTest(true) 一样简单

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多