【问题标题】:Jmeter: unable to use multiple conditional statements in If ControllerJmeter:无法在 If Controller 中使用多个条件语句
【发布时间】:2018-10-03 15:08:37
【问题描述】:

回答问题

亲爱的读者,如果您愿意,请继续阅读问题。但至多我愿意提供 Dmitri 的答案,这样其他人就不会浪费时间玩 Jmeter If Controller。

如果您希望在 If Controller 中使用多个条件语句, 特别是如果您想检查变量是否等于某些字符串, 不要使用 ${__javaScript()} 函数!!! Dmitri 建议改用 ${__groovy()} 函数,在我的情况下有效。正确的语法 以下。注意左括号、逗号位置和右大括号:

${__groovy((vars.get('yourVariable').equals('someString') && vars.get('yourAnotherVariable').equals('someOtherString')),)}

加法

如果您想在尝试使 If Controller 处理多个条件时节省时间,请始终取消选中 将条件解释为变量表达式复选框。否则你将不得不坚持使用那些 __javaScript、__groovy 或其他函数,因为无法理解它们到底是如何工作的,以及为什么它们不能解析为 true 或 false(在这种情况下日志文件总是干净的) .这就是您在没有这些“功能”帮助的情况下所做的事情。请看下面我的例子

${yourVariable} != 'not_found' && ${youAnotherVariable_matchNr} == 1 

就是这样,不需要使用任何功能。


初始问题

Jmeter v4.0 r 1823414 中,我只能将 If Controller 与单个语句一起使用,而不能与多个语句一起使用。我从here 获取的使用多个语句的示例,建议使用

${__javaScript("${responsecode}"=="404")} && ${__javaScript("${responseMessage}" == "未找到")}

我还检查了blazemeter tutorial page,但它没有说明 If Controller 中的多个条件语句。

我的测试计划示例如下

在我的调试采样器中,我可以看到以下内容

在测试计划的某个地方,我放置了 IF Controller 来检查两个变量是否等于 not_found...

${__javaScript(vars.get('manual_bug')=='not_found')} && ${__javaScript(vars.get('integration_bug')=='not_found')}

...所以所有后续动作都被执行了。然而,这个 IF 控制器 要么永远不会被执行,要么总是返回 FALSE。不知道它发生了什么。

在责备我 :-) 我没有做足够的研究并急于提出一个关于 SO 的问题之前,我将提供以下我已经尝试过但没有帮助的示例:

  • 在变量两边加上双引号

    ${__javaScript(vars.get("manual_bug")=="not_found")} && ${__javaScript(vars.get("integration_bug")=="not_found")}

  • 等号之间有额外的空格

${__javaScript(vars.get('manual_bug') == 'not_found')} && ${__javaScript(vars.get('integration_bug') == 'not_found')}

  • 避免使用 vars.get

${__javaScript(${manual_bug} == 'not_found')} && ${__javaScript(${integration_bug} == 'not_found')}

  • 使用不带 vars.get 的双引号

    ${__javaScript(${manual_bug} == "not_found")} && ${__javaScript(${integration_bug} == "not_found")}

我的日志文件看起来完全正常,没有错误

请告知是否有人能够在 Jmeter 工具中执行多个条件语句?谢谢!

【问题讨论】:

    标签: if-statement jmeter


    【解决方案1】:

    在链接中,您引用的 2 个子句位于 单个 __javaScript() function 中,并且您有 2 个不同的功能,因此 JMeter 不知道您的 && 是什么意思,特别是给定 @987654329 @ If 控制器的默认模式。

    此外,如果您打开If Controller GUI,您将看到以下警告:

    为了性能,建议检查“将条件解释为变量表达式” 并使用 __jexl3 或 __groovy 评估为真或假或包含真或假的变量。 ${JMeterThread.last_sample_ok} 可用于测试最后一个采样器是否成功

    因此,我建议重新考虑您的方法并使用__groovy() function,相关语法为:

    ${__groovy((vars.get('responseCode').equals('404') && vars.get('responseMessage').equals('Not Found')),)}
    

    演示:

    【讨论】:

    • 谢谢德米特里。在我提供的每个示例中,我使用了 2 个 __javascript() 函数,每个函数都应该返回 true 或 false。这不是 Jmeter 应该理解的默认行为吗?没有?
    • 你指的是this answer,它被赞成和接受,令人惊讶的是它有多个条件wrapped into a single function。不?我希望一个自认为是 QA 工程师的人对细节的关注程度更高。没有?
    • 对不起,我根本不是IT领域的,所以可能没有注意到一些细节。
    【解决方案2】:

    以下语法(带双引号)也可以,但它还要求您取消选中“将条件解释为变量表达式”设置。

    "${yourVariable}" != "not_found" && "${youAnotherVariable_matchNr}" == "1" 
    

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 2013-12-17
      • 2012-12-13
      • 2019-03-01
      • 2013-06-17
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多