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
构造不是那么容易,但可能:
- 只需使用
Switch controller
(由整数激活)而不是IF控制器,并且
- 在条件中使用(写作Groovy)
ternary operator ?:
。 IE。:
${__groovy( (vars.get("customer_name")==null) ?0:1 )}
然后将“0”大小写用作(某种程度上)默认值。这样,您可以拥有更多 "Else" 个分支,但是,只需两个分支(显式+默认)就足够了,照常使用。
- 要得到
Else-If
,你需要嵌套另一个开关到root-some开关。
另请注意 Elvis operator
存在(折叠的三元组),这对于 int
值可能很方便。
我预计在我的应用程序中可能出现两种情况:搜索成功和搜索失败。在这两种情况下,我都有两组不同的 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
构造不是那么容易,但可能:
- 只需使用
Switch controller
(由整数激活)而不是IF控制器,并且 - 在条件中使用(写作Groovy)
ternary operator ?:
。 IE。:${__groovy( (vars.get("customer_name")==null) ?0:1 )}
然后将“0”大小写用作(某种程度上)默认值。这样,您可以拥有更多 "Else" 个分支,但是,只需两个分支(显式+默认)就足够了,照常使用。
- 要得到
Else-If
,你需要嵌套另一个开关到root-some开关。
另请注意 Elvis operator
存在(折叠的三元组),这对于 int
值可能很方便。