在JMeter中if-else阻塞

时间:2015-06-04 14:21:43

标签: jmeter jmeter-plugins

我希望我的应用程序中有两种可能的情况:搜索成功并且搜索失败。在这两种情况下,我都有两组不同的HTTP请求,JMeter应该执行这些请求。如何在JMeter场景中实现if-else块?我试过使用带有正则表达式提取器的控制器,但依赖于Debug Sampler的结果,这种提取器没有为当前线程附加。因此,一个线程可以简单地覆盖另一个线程的结果。是bug还是功能?有没有解决方法?

我的正则表达式提取器: extractor

我的第一个If控制器:

first if controller

我的第二个if控制器: enter image description here

执行顺序:
order

始终触发第一个控制器而不是第二个控制器。当客户搜索失败时,页面不包含单词“Daniel”,我希望$ {customer_name}的长度为0。此外,调试取样器在搜索失败后返回带有填充值的customer_name。看起来其他线程会覆盖它,这个提取器不是线程安全的。

4 个答案:

答案 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结构并不容易,但可能:

  1. 只需使用Switch controller(由整数激活)代替IF控制器,
  2. 在条件中使用(写为Groovy)ternary operator ?:。即:
      

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

  3. 然后将“0”情况用作(某种程度上)默认值。这样,您可以拥有更多“Else”分支,但是,只需要两个分支(显式+默认)就足够了,像往常一样使用。

    1. 要获得Else-If,您需要 嵌套 另一台切换到root-some开关。
    2. 另请注意,Elvis operator存在(折叠的三元组),这对于int值非常方便。

答案 3 :(得分:-1)

只需使用两个IF-controllers。一个用于成功搜索的IF控制器和一个用于不成功搜索的IF控制器。

确保每次运行都清除变量。