概述
背景
工作中有使用这个逻辑控制器的需求,使用中发现官方提示不同判断条件写法有不同性能,本文讲述如何使用if控制器并进行性能评测。
If Controller介绍
If Controller是众多逻辑控制器中的一种,主要用来控制测试脚本中请求的执行逻辑,比如前一个请求失败则不执行下一个请求,某个请求响应内容包含什么字段值则执行某个请求或者其他逻辑。
Jmeter中添加If控制器路径
逻辑控制条件语句的几种写法
- 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?勾选则此种写法不生效,不能达到逻辑判断目的! - 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?都可以,但是为了性能还是勾选 - 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?都可以,但是为了性能还是勾选
性能评测脚本
判断条件的不同写法会有不同的性能损耗,需要说明的是这里说的性能损耗主要指的是发压机的性能,不是被压测系统性能损耗(一般压测机和被压测系统所部署机器是分开的)
如下,选择上述的JavaScript和jexl3写法进行性能测试:
- JavaScript
通过关联获取到http request返回值中包含的success字段值,赋值到result变量中,条件中引用result变量值和success进行比对判断,true则执行Java Request,false则不执行Java Request。条件中输入"${result}" == “success”,不勾选“Interpret Condition as Variable Expression?”
- jexl3
在javascript的基础上包了一个jexl3函数,并且勾选“Interpret Condition as Variable Expression?
性能评测
- 测试环境
虚拟机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单核使用:
内存使用
以上数据表明不同条件判断语句写法在压力发起机资源使用上的确有不同性能表现,主要体现在使用JavaScript判断方式会比使用jexl3函数表达式使用更多的CPU和内存,在基本相同TPS(250笔每秒)和RT情况下,JavaScript方式在压力机CPU消耗上增加一倍,内存耗用上增加0.7倍
总结
实际性能测试过程中请务必使用变量表达式加勾选Interpret Condition as Variable Expression?方式-----jexl3
官方一些表达式示例
KaTeX parse error: Expected group after '_' at position 2: {_̲_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)
bug
在本次调试脚本过程中发现一个bug,在if控制器的comments(注释)位置添加${__jexl3()}内容,脚本会报错,而且if控制器下请求也不会执行,理论上注释位置添加任意内容均不会导致脚本问题。
Q?
if controller下如果请求中有参数化取值,那么当条件判断出现false时,继续测试后续请求条件判断为true,请求中参数化取值应该怎样取值?
最后
以上就是傲娇金毛为你收集整理的JMeter 逻辑控制器 If Controller 性能评测背景If Controller介绍逻辑控制条件语句的几种写法性能评测脚本性能评测总结官方一些表达式示例bugQ?的全部内容,希望文章能够帮你解决JMeter 逻辑控制器 If Controller 性能评测背景If Controller介绍逻辑控制条件语句的几种写法性能评测脚本性能评测总结官方一些表达式示例bugQ?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复