我希望我的应用程序中有两种可能的情况:搜索成功并且搜索失败。在这两种情况下,我都有两组不同的HTTP请求,JMeter应该执行这些请求。如何在JMeter场景中实现if-else块?我试过使用带有正则表达式提取器的控制器,但依赖于Debug Sampler的结果,这种提取器没有为当前线程附加。因此,一个线程可以简单地覆盖另一个线程的结果。是bug还是功能?有没有解决方法?
我的正则表达式提取器:
我的第一个If控制器:
我的第二个if控制器:
执行顺序:
始终触发第一个控制器而不是第二个控制器。当客户搜索失败时,页面不包含单词“Daniel”,我希望$ {customer_name}的长度为0。此外,调试取样器在搜索失败后返回带有填充值的customer_name。看起来其他线程会覆盖它,这个提取器不是线程安全的。
答案 0 :(得分:3)
你的第二个条件是不稳定的。
例如我有$ {foo}变量。如果未设置,则其值为${foo}
(令人惊讶),其长度为6.
因此,如果没有匹配,您的"${customer_name}".length
值将为16.
我建议将第二个If控制器条件更改为:
${__javaScript(vars.get('customer_name')==null,)}
它应该以这种方式工作。 (您需要使用__javaScript()函数来访问vars
对象,这是JMeterVariables实例的简写)
另一种选择是将采样器标记为失败,以及#34; Daniel"找不到并使用${JMeterThread.last_sample_ok}
变量值作为条件。
有关If控制器的提示和技巧,请参阅How to use JMeter's 'IF' Controller and get Pie.指南。
答案 1 :(得分:0)
我的问题的主要细节:我在Loop控制器中执行了场景。因此,我的变量尚未重置,下一次迭代不正确。避免它的顺序我添加了BeanShell PostProcessor,它在每次迭代后重置我的变量。
vars.put("customer_name","");
现在一切都很好。
答案 2 :(得分:0)
这个If-Then-Else
结构并不容易,但可能:
Switch controller
(由整数激活)代替IF控制器,ternary operator ?:
。即:
${__groovy( (vars.get("customer_name")==null) ?0:1 )}
然后将“0”情况用作(某种程度上)默认值。这样,您可以拥有更多“Else”分支,但是,只需要两个分支(显式+默认)就足够了,像往常一样使用。
Else-If
,您需要 嵌套 另一台切换到root-some开关。另请注意,Elvis operator
存在(折叠的三元组),这对于int
值非常方便。
答案 3 :(得分:-1)
只需使用两个IF-controllers。一个用于成功搜索的IF控制器和一个用于不成功搜索的IF控制器。
确保每次运行都清除变量。