JMeter 中的 if-else 块

if-else block in JMeter

我预计在我的应用程序中可能出现两种情况:搜索成功和搜索失败。在这两种情况下,我都有两组不同的 HTTP 请求,JMeter 应该执行它们。如何在 JMeter 场景中实现 if-else 块?我尝试将 if 控制器与正则表达式提取器一起使用,但根据 Debug Sampler 的结果,这种提取器并未附加到当前线程。因此,一个线程可以简单地覆盖另一个线程的结果。是错误还是功能?有什么解决方法吗?

我的正则表达式提取器:

我的第一个 If 控制器:

我的第二个 if 控制器:

执行顺序:

始终触发第一个控制器,从不触发第二个。当客户搜索失败时,页面不包含单词 "Daniel",我希望 ${customer_name} 的长度为 0。此外,Debug Sampler returns customer_name 在搜索失败后填充了值。看起来其他线程覆盖了它并且这个提取器不是线程安全的。

就用两个IF-controllers。搜索成功1个中频控制器,搜索失败1个中频控制器

确保在每个 运行.

上清除您的变量

我的问题的主要细节:我已经在 Loop 控制器中执行了场景。因此,我的变量没有被重置,下一次迭代是不正确的。为了避免它,我添加了 BeanShell 后处理器,它会在每次迭代后重置我的变量。

vars.put("customer_name","");

现在一切都很好。

你的第二个条件不稳定。

例如我有 ${foo} 变量。如果未设置,它的值将为 ${foo}(令人惊讶),长度将为 6。

因此,如果没有匹配项,您的 "${customer_name}".length 值将为 16。

我建议将您的第二个 If Controller 条件更改为:

${__javaScript(vars.get('customer_name')==null,)}

它应该以这种方式工作。 (您需要使用 __javaScript() function to get access to vars object which is a shorthand to JMeterVariables 个实例)

另一个选项是在找不到 "Daniel" 的情况下将采样器标记为失败,并使用 ${JMeterThread.last_sample_ok} 变量值作为条件。

有关 If 控制器的一些提示和技巧,请参阅 How to use JMeter's 'IF' Controller and get Pie. 指南。

这个 If-Then-Else 构造不是那么容易,但可能:

  1. 只需使用Switch controller(由整数激活)而不是IF控制器,并且
  2. 在条件中使用(写作Groovy)ternary operator ?:。 IE。:

    ${__groovy( (vars.get("customer_name")==null) ?0:1 )}

然后将“0”大小写用作(某种程度上)默认值。这样,您可以拥有更多 "Else" 个分支,但是,只需两个分支(显式+默认)就足够了,照常使用。

  1. 要得到Else-If,你需要嵌套另一个开关到root-some开关。

另请注意 Elvis operator 存在(折叠的三元组),这对于 int 值可能很方便。