工作中有使用这个逻辑控制器的需求,使用中发现官方提示不同判断条件写法有不同性能,本文讲述如何使用if控制器并进行性能评测。
P1
If Controller介绍
Jmeter中添加If控制器路径
If Controller是众多逻辑控制器中的一种,主要用来控制测试脚本中请求的执行逻辑,比如前一个请求失败则不执行下一个请求,某个请求响应内容包含什么字段值则执行某个请求或者其他逻辑。
P2
逻辑控制条件语句的几种写法
1
If Controller using javascript
If Controller will internally use javascript to evaluate the condition but this can have a performance penalty.
if控制器内部使用javascript去处理判断条件语句,但是这样会有性能损耗
本例:条件语句填写 "${result}" == "success"
不勾选Interpret Condition as Variable Expression?
勾选则此种写法不生效,不能达到逻辑判断目的!
2
If Controller using Variable
If you want to test if last sample was successful, you can use ${JMeterThread.last_sample_ok}
如果你只是想判断上一个请求是否成功,你只需要使用${JMeterThread.last_sample_ok}判断语句即可。这里面判断上一个请求是否为true,猜测是基于断言成功还是失败的,经过人为改变断言内容实践,得到了验证。
本例:${JMeterThread.last_sample_ok}
勾选或不够选Interpret Condition as Variable Expression?都可以,但是为了性能还是勾选
3
If Controller using expression
Use a function (${__jexl3()} is advised) to evaluate an expression that must return true or false
官方建议使用此种方式,性能更好。
本例:${__jexl3("${result}" == "success")}
勾选或不够选Interpret Condition as Variable Expression?都可以,但是为了性能还是勾选
P3
性能评测脚本
判断条件的不同写法会有不同的性能损耗,需要说明的是这里说的性能损耗主要指的是发压机的性能,不是被压测系统性能损耗(一般压测机和被压测系统所部署机器是分开的)
如下,选择P2中的写法一(JavaScript)和写法三(jexl3)进行性能测试。
测试脚本:
写法一:通过关联获取到http request返回值中包含的success字段值,赋值到result变量中,条件中引用result变量值和success进行比对判断,true则执行Java Request,false则不执行Java Request。条件中输入"${result}" == "success",不勾选“Interpret Condition as Variable Expression?”
写法三:在写法一的基础上包了一个jexl3函数,并且勾选“Interpret Condition as Variable Expression?”
P4
性能评测数据
测试环境:
虚拟机2C2G+jdk1.8+apache-jmeter-5.1.1
被压测应用:
Http Request:jmeter自带类 Sleep_Time 50
org.apache.jmeter.protocol.java.test.JavaTest
java Request:jmeter自带类 Sleep_Time 100
org.apache.jmeter.protocol.java.test.JavaTest
jmeter数据总览图:
压力发起机器资源使用监控:
CPU整体使用
CPU单核使用
内存使用
▽
实际性能测试过程中请务必使用变量表达式加勾选Interpret Condition as Variable Expression?方式。
以上数据表明不同条件判断语句写法在压力发起机资源使用上的确有不同性能表现,主要体现在使用JavaScript判断方式会比使用jexl3函数表达式使用更多的CPU和内存,在基本相同TPS(250笔每秒)和RT情况下,JavaScript方式在压力机CPU消耗上增加一倍,内存耗用上增加0.7倍
官方manual变量表达式举例:
${__jexl3(${COUNT} < 10)}
${JMeterThread.last_sample_ok} (check if the last sample succeeded)
${__groovy(vars.get("myVar") != "Invalid" )} (Groovy check myVar is not equal to Invalid)
${__groovy(vars.get("myInt").toInteger() <=4 )} (Groovy check myInt is less then or equal to 4)
${__groovy(vars.get("myMissing") != null )} (Groovy check if the myMissing variable is not set)
P5
bug
在本次调试脚本过程中发现一个bug,在if控制器的comments(注释)位置添加${__jexl3()}内容,脚本会报错,而且if控制器下请求也不会执行,理论上注释位置添加任意内容均不会导致脚本问题。
Q:
if controller下如果请求中有参数化取值,那么当条件判断出现false时,继续测试后续请求条件判断为true,请求中参数化取值应该怎样取值?
记录|实践|分享