每周读书与学习是由清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书的作者推出,分享作者多年的IT从业经历,希望对很多计算机科学技术IT类专业毕业生以及IT从业者有所帮助。
1、逻辑控制器
在Jmeter中,逻辑控制器顾名思义就是用来控制性能测试执行的逻辑,通常用来控制采样器的执行顺序,同时也可以对Jmeter中的元件的执行逻辑进行控制,因为在做性能测试时,可能经常会遇到一些比较复杂的业务场景,那么就可以使用逻辑控制器来完成一些特定的比较复杂的业务逻辑处理,如下图所示。
从图中可以看到,逻辑控制器通常主要包括:
- IF控制器:通过IF条件判断来控制性能测试脚本的运行,通常只有满足IF控制器中的条件才会执行对应的测试脚本逻辑,如下图所示,只有满足图中的Expression表达式的执行结果为true时,才会执行该控制器下的元件。Expression表达式的常用场景包括:
- 对某个Jmeter中的变量判断其结果是否为True,比如判断取样器的最后一次执行结果是否成功,可以在Expression中输入${JMeterThread.last_sample_ok}。
- 通过比较的方式来判断某个变量是否满足一定的条件,比如"${VAR}"=="abcd"表示某个变量VAR是否为abcd。
- 使用脚本语言表达式的方式来判断某个变量的值是否正确,比如{__jexl3({VAR} == 23)}表示通过Jexl脚本语言表达式来判断某个VAR变量的值是否等于23,比如${__groovy(vars.get("myMissing") != null )} 表示通过Groovy脚本语言表达式来判断某个myMissing变量值不为空,通常支持的脚本语言包括Jexl、Groovy、JavaScript、BeanShell等。
 
如果对于Jmeter支持的多种脚本语言不熟悉,因为毕竟学习一门脚本语言需要一定的编程基础,可以通过Jmeter中的函数助手来生成对应的脚本语言表达式,如下图所示,图中选中了Jexl3脚本语言,然后在JEXL expression to evaluate中输入了需要判断的条件,点击生成按钮即可生成对应的脚本语言表达式,Jmeter中的函数助手支持的脚本语言还包括了BeanShell、Groovy、JavaScript等。
- 
事务控制器:主要用于统计该控制器节点下的取样器请求的处理时长等各种性能指标,该控制器界面包含如下两个选项: - Generate parent sample:如果勾选表示该取样器作为其他取样器的父取样器来生成性能测试的指标结果,简单来说就是当该控制器下有多个取样器时,会将所有的取样器的性能指标合并在一起进行统计,否则表示该取样器作为独立取样器来生成性能测试的指标结果,此时当该控制器下有多个取样器时,将会分别展示每个取样器的性能指标。
- Include duration of timer and pre-post processors in generated sample:生成的取样器的处理时长中是否需要包含定时器、前置处理器和后置处理器的时长,默认为不勾选。
 
- 
循环控制器:用于让该控制器下的取样器等元件可以循环执行,该取样器界面上支持设置循环的次数,如下图所示。 
- 
While控制器:用于让控制器下的取样器等元件在满足条件判断时持续执行,直到While条件为False时,退出While循环,在While控制器的条件判断表达式中支持Groovy、Jexl等脚本语言表达式,表达式的结果必须要返回一个True或者False类型的布尔值。 - 比如可以输入{__jexl3({var_result}==10)},用于表示判断var_result这个变量的值是否等于10,如果不支持如何生成条件判断表达式,可以借助Jmeter中的函数助手来完成。
- 当不输入任何判断条件时,当最后一个While循环执行失败时,会直接退出循环,如下图所示。
 
- 
- 当输入判断条件为LAST时,也是表示当最后一个While循环执行失败时,会直接退出循环,同时在执行While控制循环之前,如果上一个取样器请求执行失败,那么Jmeter将直接不会进入到While控制器进行任何执行,如下图所示。
 
- 
临界部分控制器:通常用于在多线程并发处理时控制取样器等元件仅由一个线程来完成执行,因为该控制器支持使用锁定的方式来控制该控制器下的取样器等元件仅会让一个线程来运行,如下图所示,锁名称可以完全自定义,当在一个Jmeter测试计划中存在多个临界部分控制器时,建议每个临界部分控制器的锁名称不要重复。 
- 
ForEach控制器:用于循环遍历一组用户定义的相关变量的值,当将取样器等其他元件添加到该控制器下之后,每个取样器或者其他元件都会执行一次或者多次,每次会读取到不同的变量值。ForEach控制器通常需要结合配置元件下的用户定义的变量一起使用,如下图所示,在Jmeter的测试计划下从配置元件中添加了如下所示的用户定义的变量。 
在ForEach控制器中,定义了如何来遍历上面的用户定义的变量,如下图所示。
当运行图中所示的测试计划后,ForEach控制器会通过图中定义的输入变量前缀user 以及开始循环字段0和结束循环字段3去用户定义的变量中读取对应的符合前缀条件的变量以及该变量对应的值,并且赋予给名为vuser的新的变量名,并且这个新的变量在该控制器下的所有取样器或者其他元件中都可以通过${vuser}来引入使用,如下图所示。由于符合ForEach控制器读取条件的用户定义的变量总共有3个,所以ForEach控制器会读取三次,并且其下对应的取样器或者其他元件也会执行3次。
- 
Include控制器:通过读取外部的JMX文件(即Jmeter测试计划保存后的文件)中的测试计划来进行执行。 
- 
交替控制器:通常用于让交替控制器下的取样器交替执行,如下图所示,交替控制器会按照顺序,每次从其下选取一个取样器来进行交替执行。 
- 
录制控制器:录制控制器其本质只是一个占位符的作用,用于告诉代理服务器应该将取样器结果记录到哪里,在性能测试运行时,本身没有任何的效果。 
- 
吞吐量控制器:主要用于对该控制器下的取样器根据总吞吐量来控制其执行的频率,支持按照执行总数和执行百分比来限制执行的频率,当达到设置的阈值后,该控制器将直接停止执行。 
- 
仅一次控制器:用于控制在多线程并发用户执行时,该控制器下的取样器等元件每个线程都只会执行一次,如下图所示,当设置有10个并发线程用户在执行100次循环时,仅一次控制器下的HTTP登录请求取样器总共只会执行10次,而且10个线程,每个线程都只会执行一次后,就不会再执行,这里可以举一个实际的例子,一个性能压测时,需要先进行用户登录,登录完成后,再携带用户登录的Cookie去完成后续的其他请求操作,那么此时就需要用到仅一次控制器了,因为每个用户都只需要登录一次,登录成功后,就取得了登录之后的Cookie了,由于Cookie是可以在有效期过期时间内一直可以继续使用的,所以每个线程用户后续的其他请求操作就不需要再次进行登录请求操作了。 
- 
随机控制器:当该控制器下有多个取样器请求时,随机控制器用于从该控制器下随机选取一个取样器进行执行,并且每次只会随机选取一个,如下图所示。 
- 
随机顺序控制器:通常用于让该控制器下的多个取样器每次按照随机的顺序执行,并且确保每个取样器都只会被执行一次,如下图所示。 
- 
Runtime控制器:用于控制该控制器下的取样器等元件的运行时长,单位为秒,在该时长内,取样器或者其他元件会反复运行,直到达到了该控制时长,如下图所示。 
- 
简单控制器:通常用于对多个取样器等元件进行简单的分组管理,在性能测试时当存在多个不同取样器或者其他元件并且需要对这些取样器或者元件进行简单的分组时才会用到该控制器,简单控制器不会改变Jmeter运行的逻辑,如下图所示。 
- 
模块控制器:用于将测试计划中的某个控制器以及该控制器下的所有元件替换到当前测试计划中进行执行,如下图所示,其主要作用在于可以在多个不同的性能测试案例中进行切换,提高性能测试案例脚本的灵活度。 
- 
Switch控制器:用于通过该控制器界面上的Switch Value值来确定应该执行该控制器下的哪个子节点元件,如下图所示。 - 当Switch Value为空时,默认执行第1个子节点元件,即图中的HTTP请求A。
- 直接根据指定的子节点元件的名称来执行,比如Switch Value输入HTTP请求C时,会直接只执行HTTP请求C这个元件。
- Switch控制器下的子节点元件从0开始计数,通过指定子节点元件所在的数值来确定执行哪个元件,比如Switch Value输入2时,会直接只执行HTTP请求B这个元件,因为HTTP请求B这个元件恰好是排在第2位。
 
2、本次学习总结
- 逻辑控制器的使用,包括IF控制器、事务控制器、循环控制器、While控制器、临界部分控制器、ForEach控制器、Include控制器、交替控制器、录制控制器、吞吐量控制器、仅一次控制器、随机控制器、随机顺序控制器、Runtime控制器、简单控制器、模块控制器、Switch控制器等,建议读者重点掌握IF控制器、循环控制器、While控制器、仅一次控制器、Switch控制器的使用。
在完成本次的学习后,读者们需要能完成一些更加复杂的Jmeter性能测试脚本的编写,因为在性能测试时,有时候会遇到一些逻辑很复杂的业务需求,这时候可能就会需要用到函数助手或者逻辑控制器来完成这些复杂的性能测试场景。
出处 :本次学习的内容参考自清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书