转自 https://www.blazemeter.com/blog/six-tips-for-jmeter-if-controller-usage
如果您的性能脚本包含高级逻辑,并且您的负载测试需要比连续运行几个请求更复杂的执行,那么您需要高级工具。幸运的是,Apache JMeter™也提供了它们。其中一个最重要的是JMeter If Controller或If条件。
在本文中,我们将展示如何使用JMeter的If Controller。If Controller的基本思想是根据某些条件确定是否运行一批子采样器。虽然主要思想非常简单,但围绕此控制器存在许多问题和疑问。在本文中,我们将展示使用If Controller的不同示例,并为您提供有关如何正确使用它的有用提示。
配置If控制器
'If Controller'有几个参数:
- 名称 - 用于标识JMeter元素树中的元素的控制器
- 注释 - 可用于包含指定条件的描述性解释的字段(有时条件可能非常复杂,将此类注释留作引用很有用)
- 条件(默认Javascript) - 由执行流程验证的条件,用于决定是否应执行子元素。默认情况下,条件被解释为返回“true”或“false”的Javascript代码
- 将条件解释为变量表达式? - 此参数适用于不需要评估Javascript代码的情况。默认方法接受并将指定的条件解释为Javascript代码,然后验证结果是否等于true或false。但是如果您选择此参数,则不会使用任何Javascript解释,并且条件将被视为JMeter变量(不用担心,我们将在其中一个示例中详细介绍)
- 评估所有孩子? - 如果选择此属性,则将检查每个子条目的指定条件,而不仅仅是一次,因为默认情况下已完成
现在我们更好地了解了If Controller,让我们来看一些提示。
提示#1 - 控制测试脚本执行流程
If Controller的主要用途是控制JMeter执行脚本流程。这基本上意味着只有在某个条件为真时才能运行采样器。假设我们有一个带有两个请求采样器的基本脚本:第一个请求采样器位于If控制器之前一步,而第二个采样器位于其中。让我们添加最简单的条件,以验证执行工作流是否按预期工作:
请记住,JMeter If Controller使用Javascript进行条件解释。您可以使用本文来更好地了解Javascript比较运算符。让我们运行我们的脚本:
如您所见,两个请求都被触发,因为我们的If Controller条件(1 == 1)被返回为true。让我们尝试将其设为false并再次验证脚本执行:
由于我们的新条件(1 == 2),这个位于If Controller内部的请求没有按预期执行,这显然返回为false。
这是If Controller如何允许您控制脚本执行流程的最简单示例。要防止执行脚本的某个部分,请将其嵌套在If Controller下并将条件设置为false。
提示#2 - 用心检查你的条件语法
在创建条件时,您应该验证它们的语法,因为很容易犯错并不容易捕获。让我们创建一个用户定义的变量,我们可以在测试条件中进一步使用它:
现在我们应该有$ {RESULT}变量返回'COMPLETED'字符串。让我们创建一个创建变量与期望值的简单比较:
我们知道$ {RESULT}变量应该包含'COMPLETED'字符串,我们可能希望创建的线程组将运行我们的两个请求。我们来看看这个:
如您所见,这次没有执行第二个请求。我们没有错误,脚本运行成功,那有什么不对?您可以猜测,我们的条件语法错误。这是If Controller最常见的错误之一。如果要比较两个字符串,则必须在引号中指定它们(即使对于变量也应使用引号)。让我们尝试修复它并再次运行脚本:
这就是为什么重要的是要仔细检查您的条件语法以防止意外的脚本行为。
提示#3 - 尽可能使用'解释条件作为变量表达式'
运行模拟大量用户的性能脚本时,应记住您用于测试的资源数量。在这里阅读更多。使用If Controller时,请记住默认情况下,If Controller使用Javascript解释条件,并且每个解释都占用资源。
因此,如果您可以使用“解释条件作为变量表达式”而不是默认的Javascript解释 - 使用它!让我们创建一个带有布尔“true”值的定义变量:
现在让我们在基本条件下使用该变量并运行我们的脚本:
一切都按预期工作。但是让我们明智并重构'If Controller'以使用'Interpret Condition as Variable Expression':
脚本结果是一样的,一切正常。但是这次我们知道指定的条件不需要Javascript解释,它节省了性能资源。
提示#4 - 使用Groovy和JEXL解释器而不是Javascript
如果您有一个无法使用变量表达式解释器执行的复杂条件,则最好使用Groovy和JEXL解释器。他们也被JMeter的文件建议表演。
要使用Groovy或JEXL解释器,您需要适当地使用__jexl3或__groovy函数。看看这个示例,它可以让您了解如何正确使用它:
提示#5 - 使用$ {JMeterThread.last_sample_ok}检查交易请求
在某些情况下,您可能希望将请求列表验证为一个事务。事务是一个必须成功或失败的操作作为一个完整的单元,它永远不会部分完成。在我们的脚本中,我们可能希望运行一批请求,直到其中一个请求失败。在这种情况下,我们不希望剩余的请求运行。
虽然JMeter不提供执行此类工作流的特殊控制器,但您可以将If Controller与$ {JMeterThread.last_sample_ok}函数一起使用,该函数检查先前的请求是否成功。我们可以通过几个步骤完成这项工作。让我们创建5个请求并使其中一个无效:
让我们假设我们想要运行所有请求,直到其中一些请求失败。为此,您可以将If Controller添加为这些请求的父元素,并应用此配置:
正如我们之前提到的,$ {JMeterThread.last_sample_ok}函数返回上一个请求采样器的结果,而'评估所有孩子?' 参数告诉JMeter验证针对每个子请求采样器的条件。
因此,如果先前的请求成功,则$ {JMeterThread.last_sample_ok}将为下一个请求返回“true”,它将运行。否则,$ {JMeterThread.last_sample_ok}将返回false,并且不会运行所有剩余的请求。
提示#6 - 使用CLI测试您的条件
验证If控制器条件的最佳方法是使用命令行界面(CLI)对其进行测试。CLI是可用于语法验证的工具。
谷歌浏览器提供了一个开箱即用的“开发者工具”扩展,它已经有一个可用于语法检查的Javascript控制台。要访问此控制台,只需打开Google Chrome浏览器,然后转到“选项 - >更多工具 - >开发人员工具 - >控制台”。
相同的原则可以应用于Groovy和JEXL解释器。在测试中使用它们之前,只需使用适当的工具来验证您的条件。
而已!现在你知道如何使用JMeter'Ifitor Controller',你可以尝试应用所有这些技巧!请在评论部分告诉我们您的想法,如果您还有其他一些有趣的例子。
要了解更多JMeter,请注册我们的免费JMeter学院。
要尝试增强JMeter功能的BlazeMeter,请在下面的框中请求演示或放置您的URL或JMX文件,您的测试将在几分钟内开始。