JMeter内置了36个函数,这些函数可以通过函数助手进行编辑和测试。了解这些函数,不仅能提高JMeter的使用熟练度,也有助于知晓测试工具或测试框架通用的函数有哪些,在自主设计时,作为参考借鉴。
JMeter函数调用的写法是${__function()}
,注意函数名前面需要添加双下划线前缀。
__BeanShell
脚本语言
执行BeanShell脚本。BeanShell是Java编写的Java源码解释器,小型、免费、可嵌入,可以像写脚本语言一样写Java,无需编译,立即运行。
示例,字符串拼接:
![image-20210529095244217](https://img-blog.csdnimg.cn/img_convert/55033abef18ac8e195648dd910dd7bcb.png)
输入表达式后,点击Generate & Copy to clipboard
按钮,会生成函数语法并复制到粘贴板,同时输出函数运行结果。
__char
把数字转化成Unicode字符。
示例,数字65转化成字符A:
![image-20210531142353946](https://img-blog.csdnimg.cn/img_convert/17ad6f3fe06a83265cd2aecb2845b618.png)
__counter
统计线程的迭代次数。它有两个参数:
- 第一个参数,如果为true,那么每个线程单独统计;如果为false,那么所有线程合在一起统计。
- 第二个参数,变量名。
示例:
![image-20210531142653887](https://img-blog.csdnimg.cn/img_convert/4125634a6f001228d4804230389bc647.png)
__CSVRead
从CSV文件中读取数据。
固定取值
始终取第n列第一行的值。
示例:
![image-20210531144416950](https://img-blog.csdnimg.cn/img_convert/0fba181047c758657eed1f23f8e55f8f.png)
动态取值
使用next每次迭代取下一行数据。注意必须先取列,再取行。
示例:
![image-20210531144832367](https://img-blog.csdnimg.cn/img_convert/8cd0ae3e4407f771ba5eb0063660622c.png)
文件别名
给文件名起个别名。
示例:
![image-20210531145335502](https://img-blog.csdnimg.cn/img_convert/98a89fcb36d7c03ea691a7a6977c1b18.png)
__escapeHtml
HTML转义。
示例:
![image-20210531145738207](https://img-blog.csdnimg.cn/img_convert/45ff195e13e71bf7900084e8d63fb0c9.png)
__escapeOroRegrexChars
把一些Java正则表达式引擎不识别的正则表达式转换一下,这样就可以识别了。转换过程中使用了ORO正则表达式库。
示例:
![image-20210531150336942](https://img-blog.csdnimg.cn/img_convert/1905768b33efaf2d80334f678ba2a5ab.png)
__eval
计算表达式。
示例:
![image-20210531152230689](https://img-blog.csdnimg.cn/img_convert/fc103f2e20271fcc83d5be0dd6a73c21.png)
__evalVar
把表达式的结果存入变量。
示例:
![image-20210531152831042](https://img-blog.csdnimg.cn/img_convert/67919419a3a224f68a3cf3c22ad3b9b8.png)
![image-20210531152841364](https://img-blog.csdnimg.cn/img_convert/b08500ce1beb8d716a10e29abe126535.png)
__FileToString
读取文件全部内容,以字符串形式保存到变量中。
示例:
![image-20210531153542939](https://img-blog.csdnimg.cn/img_convert/9329e88f93d8826b01313f8328722a9f.png)
__intSum
int型求和。
示例:
![image-20210531154020310](https://img-blog.csdnimg.cn/img_convert/f20bd19665d0322d18adeaa4f00655fb.png)
__longSum
跟上个一样,只是换成了long型。
__javaScript
执行JavaScript脚本。
示例:
![image-20210531154838870](https://img-blog.csdnimg.cn/img_convert/7074379352f192c265677daf799137a0.png)
__jexl
JEXL全称是Jakarta Commons Jexl,它是一种表达式语言解释器。jexl能直接访问JMeter中的部分变量:
- log:直接调用logger函数
- ctx:获取JMeterContent对象
- vars:获取JMeter定义的变量
- props:获取JMeter配置属性
- threadName:获取JMeter线程名
- sampler:获取Sampler实例
- sampleResult:获取SamplerResult实例
- OUT:OUT.println(),类似System.out.println
示例:
![image-20210531155821116](https://img-blog.csdnimg.cn/img_convert/3a7188481994b50e677097d45615359a.png)
__log
记录日志,并返回输入的字符串。
日志级别包括:
控制台指JMeter GUI的感叹号打开的控制台;标准输出窗口指打开JMeter时的CMD窗口。
- OUT:打印到控制台和标准输出窗口,相当于System.out.print()
- ERR:打印到控制台和标准输出窗口,相当于System.err
- DEBUG:打印到控制台,DEBUG级别以上
- INFO:打印到控制台,INFO及ERROR级别
- WARN:打印到控制台,WARN、INFO、ERROR级别
- ERROR:打印到控制台,仅ERROR级别
后四种级别DEBUG、INFO、WARN、ERROR是否写入JMeter的运行时日志,需要通过jmeter.property文件进行配置。
示例:
![image-20210531162511075](https://img-blog.csdnimg.cn/img_convert/bb7aaface97dae3151ec4871c855821e.png)
__logn
与上一个类似,区别是它只记录日志,不返回值。
__machineIP
本机的IP。
__machineName
本机的计算机名。
__P
获取命令行中定义的属性,默认值为1。
示例:
![image-20210531164008854](https://img-blog.csdnimg.cn/img_convert/3b33434a7b1e1d401c42a3755e91d6ce.png)
在非GUI方式运行测试计划时,可以用这个函数来做参数化,由运行命令动态指定参数值,方便跟Jenkins、Maven或者Ant集成。
__property
获取jmeter.properties文件中设置的JMeter属性。
示例:
![image-20210531164712287](https://img-blog.csdnimg.cn/img_convert/37d290cb6459ef4ca549dd6b47da7a3d.png)
__Random
随机值。
示例:
![image-20210531164848189](https://img-blog.csdnimg.cn/img_convert/d2c5a30b849ea0d85130b2d66a2a330f.png)
__RandomString
随机字符串。
示例:
![image-20210531164946221](https://img-blog.csdnimg.cn/img_convert/748114c73769f01b4f98268184288f1a.png)
__regexFunction
跟后置处理器的正则表达式提取器用法一样。
示例:
![image-20210531170414328](https://img-blog.csdnimg.cn/img_convert/0e92360af80064062d405a032204a8f8.png)
![image-20210531170451003](https://img-blog.csdnimg.cn/img_convert/6c78cf6e3835e60c78c17e0e21ef8b5b.png)
__samplerName
获取当前sampler名称。
__setProperty
动态设置JMeter属性。
示例:
![image-20210531170731146](https://img-blog.csdnimg.cn/img_convert/0ecbd4779046ecff90bacf4af584af68.png)
__split
拆分字符串。
![image-20210531171136879](https://img-blog.csdnimg.cn/img_convert/b66eec1761cd4d8da9ebfbd35aa530f1.png)
__StringFromFile
不如使用CSV Data Set Config。
__TestPlanName
获取测试计划的名字。
__threadNum
返回当前线程号,从1开始递增。
示例:
![image-20210531172632373](https://img-blog.csdnimg.cn/img_convert/f0e4bb514f4c7be8f8f6fe06db5ff4ad.png)
__time
返回当前时间,由SimpleDateFormat类来处理函数格式。
- 年:yyyy
- 月:MM
- 日:dd
- 时:hh
- 分:mm
- 秒:ss
示例:
![image-20210531172851631](https://img-blog.csdnimg.cn/img_convert/991fe1cb56fbc2f8121a2fe4b981d17b.png)
__unescape
返转escape字符,如\r\n
转成CRLF。
__unescapeHtml
反转HTML,如
转成空格。
__urldecode
反转URL中的Unicode编码字符,如word%22school%22
转成word"school"
。
__urlencode
转成Unicode编码字符,如word"school"
转成word%22school%22
。
__UUID
生成唯一字符串。
__V
执行变量表达式并返回结果,如果需要嵌套的使用变量时,就可以用到它。
比如定义变量a1=2, b1=1
,${a1}``${b1}
都可以调用成功。
但是如果想通过${a${b1}}
来调用${a1}
就不能成功。
使用${__V(a${b1})}
等价于${__V(a1)}
等价于${a1}
就可以了。
__XPath
匹配XML文件内容。
示例:
<?xml version="1.0" encoding="utf-8"?>
<company>
<name>
<address>
shanghai
</address>
</name>
</company>
XPath表达式/company/name/address/text()
取值shanghai。
XPath可以参考https://www.w3school.com.cn/xpath/index.asp
最近新增
除了上述36个内置函数,JMeter最近还新增了以下函数:
changeCase
改变大小写
dateTimeConvert
日期格式转换
digest
加密算法,如SHA-1, SHA-256, MD5等
escapeXml
转义XML
groovy
groovy表达式
isPropDefined
属性是否定义
isVarDefined
变量是否定义
RandomDate
随机日期
RandomFromMultipleVars
从多个变量中取随机值
StringToFile
把字符串写入文件中
timeShift
时间偏移,比如计算某一天的前三天
小结
本文对36个内置函数,以及11个新增函数进行了介绍,灵活选择使用这些函数,能起到事半功倍的效果。函数助手可以很方便的对函数进行预览和测试。最新最全的函数及其使用介绍可以到官网查阅:https://jmeter.apache.org/usermanual/functions.html
参考资料:
《全栈性能测试修炼宝典JMeter实战》