本文内容总结了 JMeter 中的各种常用函数、复杂函数、对我比较有用的函数 等等。
但是,并没有包含全部函数。
JMeter 提供了很多函数,可以很方便的实现一些小功能,几乎可以用于测试计划中的任何元件。
函数调用的格式如下所示:
${__functionName(var1,var2,var3)}
其中,__functionName
为函数名,括号内是函数的参数,无参数时可以不用括号,如 ${__UUID}
。
Tips:
\
来转义,否则 JMeter 会把它当作一个参数分隔符;JMeter 中的函数主要分为如下几类:
函数类型 | 函数名称 | 函数作用 | 启用版本 |
---|---|---|---|
获取信息函数 | __TestPlanName |
返回当前测试计划的名称 | |
__threadGroupName |
返回当前线程组的名称 | 4.1 | |
__threadNum |
返回当前正在执行的线程的编号 | 1.X | |
__samplerName |
返回当前请求的名称 | 2.5 | |
__log |
输出日志信息 | 2.2 | |
__time |
以多种格式返回当前时间 | 2.2 | |
数据输入函数 | __StringFromFile |
从文本文件中读取字符串,每次调用读取一行 | 1.9 |
__FileToString |
把文件读取成一个字符串,每次调用都是读取整个文件 | 2.4 | |
__CSVRead |
返回当前正在执行的线程的编号 | 1.9 | |
__XPath |
使用 XPath 语法匹配 XML文件 | 2.0 | |
数据计算函数 | __counter |
计数器函数 | 1.9 |
__intSum |
对多个整数求和 | 1.8.1 | |
__longSum |
长整型求和 | 2.3.2 | |
__Random |
返回指定最大值和最小值之间的随机整数 | 1.9 | |
__RandomDate |
返回给定开始日期和结束日期值之间的随机日期 | 3.3 | |
_RandomString |
根据给定的字符生成指定长度的随机字符串 | 2.6 | |
__UUID |
通用唯一标识符函数 | 2.9 | |
属性信息函数 | __isPropDefined |
判断属性是否存在 | 4.0 |
__property |
对多个整数求和 | 1.8.1 | |
__P |
简化的属性函数,用于与命令行上定义的属性一起使用 | 2.0 | |
__setProperty |
简化的属性函数,用于与命令行上定义的属性一起使用 | 2.0 | |
字符串操作函数 | __split |
根据分隔符拆分字符串为多个变量 | 2.0.2 |
__changeCase |
转换大小写 | 4.0 | |
__regexFunction |
使用正则表达式解析之前的响应结果 | 1.X | |
脚本函数 | __BeanShell |
执行 beanshell 脚本 | 1.X |
__javaScript |
执行 js 脚本 | 1.9 |
__TestPlanName
${__TestPlanName}
,返回当前测试计划的名称;Demo.jmx
, 即返回 Demo.jmx
。__threadGroupName
${__threadGroupName}
,返回当前线程组的名称,从 4.1 版本开始启用。__threadNum
${__threadNum}
,返回当前正在执行的线程的编号,而且不依赖于线程组;__samplerName
${__samplerName()}
,返回当前请求的名称。__log
OUT
和 ERR
将会分别输出记录到 System.out
和 System.err
中。在这种情况下,输出总是会被打印(它不依赖于当前的日志设置)。示例:
${__log(Message)}:写入日志文件,形如 "...thread Name : Message"。
${__log(Message,OUT)}:写到控制台窗口。
${__log(${VAR},,,VAR=)}:写入日志文件,形如"...thread Name VAR=value"。
__time
jmeter 中默认定义的时间格式属性值有:
YMD = yyyyMMdd。
HMS = HHmmss。
YMDHMS = yyyyMMdd-HHmmss。
USER1 = JMeter属性time.USER1。
USER2 = JMeter属性time.USER2。
用户可以通过修改JMeter属性来改变默认格式,例如,time.YMD=yyMMdd。
使用示例:
${__time()} 返回'1548133155699'
${__time(YMD,)} 返回'20190122'
${__time(dd/MM/yyyy,)} 返回'22/01/2019'
__StringFromFile
**ERR**
。参数 | 描述 | 是否必填 |
---|---|---|
文件名 | 文件名的路径 (路径可以相对于 JMeter 启动目录)。 如果使用序列号,路径名称应该适合传递到 DecimalFormat。 |
是 |
变量名 | 用于后续调用该函数的变量名称 | 否 |
启动序号 | 初始序列号(如果省略,则将结束序列号视为循环计数) | 否 |
末端序号 | 最终序列号(如果省略,序列号可以无限制地增加) | 否 |
读取单个文件:
${_StringFromFile(demo.txt,,,)} 读取demo.txt
读取多个文件,需要在文件名中使用序列号:
${_StringFromFile(PIN.DAT,,,2)} 读取 PIN.DAT 两次
${_StringFromFile(PIN#'.'DAT,,1,3)} 读取 PIN1.DAT PIN2.DAT PIN3.DAT
${_StringFromFile(pin000'.'dat,,6,8)} 读取 pin006.dat pin007.dat pin008.dat
使用序列号时,路径名被用作 java.text.DecimalFormat
的格式字符串。当前序列号作为唯一参数传入。如果未指定开始序列号,则按原样使用路径名称。
常用的两个格式化序列:
#
:插入数字,没有前导零或空格。000
:插入数字,数字不足三位时,将插入前导零补足三位;数字超过三位时,则插入数字实际位数。用法说明:
在不带前导零的情况下插入数字:
pin#'.'dat -> pin1.dat, ... pin9.dat, pin10.dat, ... pin9999.dat
带前导零的情况下插入数字:
pin000'.'dat -> pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat
在不带前导零的情况下追加数字:
pin'.'dat# -> pin.dat1, ... pin.dat9 ... pin.dat999
注意:上面的 .
是格式化字符,必须用单引号括起来。
__FileToString
**ERR**
。参数:
参数 | 描述 | 是否必填 |
---|---|---|
文件名 | 文件名的路径。(路径可以相对于JMeter启动目录) | 是 |
文件编码 | 用于读取文件的编码。如果未指定,则使用平台默认值。 | 否 |
变量名 | 用于后续调用该函数的变量名称。 | 否 |
__CSVRead
参数 | 描述 | 是否必填 |
---|---|---|
文件名 | 要读取的文件名 | 是 |
列号 | 文件中的列号。0–第一列,1–第二列,next–文件的下一行。 | 是 |
读取文件中的第1行第1列:
${__CSVRead(random.txt,0)}
读取文件中的第1行第2列,并进入文件下一行:
${__CSVRead(random.txt,1)}${__CSVRead(random.txt,next)}
读取文件第2行第1列:
${__CSVRead(random.txt,0)}
读取文件中的第2行第2列,并进入文件下一行:
${__CSVRead(random.txt,1)}${__CSVRead(random.txt,next)}
注意:
CSV Data Set Config
或者 StringFromFile
。jmeter.properties
文件中的 csvread.delimiter=
。__XPath
示例:
${__XPath(/path/to/build.xml, //target/@name)}
这会找到 build.xml 文件中的所有目标节点,并返回下一个 name 属性的内容。
__counter
__intSum
__intSum
可以被用来计算两个或者更多整数值的和。至少需要两个整数,如果指定变量名则名称中必须包含一个非数字字母,否则它会被当成另一个整数值,而被函数用于计算。注意:
在 4.0 版本之前,当有多个整数时,要通过点击添加按钮来增加参数,但是需要注意的是,添加完参数后,点击 生成
的函数默认是把手动添加的函数放在后面,这时需要手动调整变量名的位置,把它放到最后,否则会报错。 在 4.0 版本之后,该问题已解决。
__longSum
该函数用来计算两个或更多长整型值的和,使用方法跟上面的 __intSum
函数一样,这里不再赘述。
__Random
返回 0--10 之间的随机整数:
${__Random(0,10)}
__RandomDate
${__RandomDate(,,2050-07-08,,)} 随机返回一个从现在到 2050-07-08 的日期,例如 2039-06-21
${__RandomDate(dd MM yyyy,,08 07 2050,,)} 返回带有自定义格式的随机日期,如 04 03 2034
_RandomString
Random string length
:生成的随机字符的长度Chars to use for random string generation
:用来生成随机字符串的字符,可以是纯数字,纯字符,字符字母数字组合。Name of variable in which to store the result (optional)
:保存结果的变量例如:
${__RandomString(6,abcdefgh1234566,ranstr)}
随机生成一个6位长度的字符串,并保存在变量 ranstr 中,后续可以通过 ${ranstr}
来调用。
__UUID
示例:
${__UUID()}
返回结果类似:c69e0dd1-ac6b-4f2b-8d59-5d4e8743eecd
。
__isPropDefined
示例:
${__isPropDefined(START.HMS)}
判断属性 START.HMS 是否存在,返回 true。
__property
示例:
${__property(user.dir)} 返回 user.dir 的值。
${__property(user.dir,UDIR)} 返回 user.dir 的值,并保存在变量 UDIR 中。
${__property(abcd,ABCD,atod)} 返回属性 abcd 的值,如果该属性未定义则返回 atod,并保存在变量 ABCD 中。
${__property(abcd,,atod)} 返回属性 abcd 的值,如果该属性未定义则返回 atod,不保存结果值。
__P
_property
函数不同,没有选项可以将值保存在变量中,如果不提供默认值,则假定为1。示例:
在脚本中定义如下两个函数:
${__P(group1.threads, 10)}
${__P(group1.loops)}
在命令行中调用:
jmeter -Jgroup1.threads=50 -Jgroup1.loops=100 执行时,两个参数分别是 50、100。
若命令行中不设置属性,执行时,两个参数分别是 10、1。
__setProperty
__split
?
。${VAR_1}, ${VAR_2} ...
,总个数是 ${VAR_n}
。?
。示例:
定义字符串:
VAR="a||c|"
调用 split 函数:
${__split(${VAR},VAR,|)}
返回 "a||c|",并生成如下变量:
VAR_n=4
VAR_1=a
VAR_2=?
VAR_3=c
VAR_4=?
VAR_5=null
__changeCase
UPPER
、LOWER
、CAPITALIZE
。示例:
UPPER--转换成大写字母:
${__changeCase(Avaro omnia desunt\, inopi pauca\, sapienti nihil,UPPER,)}
返回 AVARO OMNIA DESUNT, INOPI PAUCA, SAPIENTI NIHIL
LOWER--转换成小写字母:
${__changeCase(LABOR OMNIA VINCIT IMPROBUS,LOWER,)}
返回 labor omnia vincit improbus
CAPITALIZE--单词首字母大写:
${__changeCase(omnibus viis romam pervenitur,CAPITALIZE,)}
返回 Omnibus viis romam pervenitur
__regexFunction
变量调用示例:
Name of variable in which to store the result
:在这个参数中设置变量名为 refName
,那么我们可以使用:
${refName} 来引用第2个参数(Template for the replacement string)的计算结果,这依赖于函数的解析结果。
${refName_g0} 来引用函数解析后发现的所有匹配结果。
${refName_g1} 来引用函数解析后发现的第一个匹配组合。
${refName_g#} 来引用函数解析后发现的第n个匹配组合。
${refName_matchNr} 来引用函数总共发现的匹配组合数目。
具体参数描述如下:
其实这个函数的作用跟正则表达式提取器的作用是类似的。
__BeanShell
示例:
${__BeanShell(123*456)} 返回56088
${__BeanShell(source("function.bsh"))} 会执行外部脚本function.bsh,并返回结果
${__BeanShell(import java.util.*;Properties props = System.getProperties();String osName = props.getProperty("os.name");if(osName.contains("Windows"))return 443;return 8443;)} 根据不同系统返回端口号
与 beanshell 元件比较:
该函数与 beanshell 元件(beanshell sampler、beanshell preprocess等)作用是一样的,只是 beanshell 函数更常用于一些简单的判断或计算等,可以把少量的脚本放在函数中直接赋值给一个变量,而不用总是添加 beanshell 元件。
__javaScript
JavaScript
脚本片段,并返回结果值。注意:文本字符串要添加必要的引号。如果表达式中有逗号,要确保对其转义。
例如:${__javaScript('${sp}'.slice(7\,99999))}
,对 7 之后的逗号进行了转义。