JMeter 提供了很多函数,如果能够熟练使用,可以为测试带来很多方便。
函数调用的格式 ${__functionName(var1,var2,var3)}
其中,__functionName为函数名,括号内是函数的参数,无参数JMeter时可以不用括号,如$
如果参数包含逗号,那么一定要使用 “\”来转义,否则 JMeter 会把它当作一个参数分隔符
在Metersphere实际使用时,可通过点击参数后面的铅笔选择函数,或在参数值一栏直接输入**${__** 可自动联想补全
函数亦可在脚本中使用,可参考:JMeter 函数
JMeter 中的函数主要分为如下几类:
函数类型 | 函数名称 | 函数作用 |
---|---|---|
脚本函数 | __BeanShell | 执行 beanshell 脚本 |
__javaScript | 执行 javaScript 脚本 | |
获取信息函数 | __log | 输出日志信息 |
__machineIP | 返回机器(电脑)IP | |
__machineName | 返回本机的主机名 | |
__time | 以多种格式返回当前时间 | |
变量操作函数 | __split | 根据分隔符分割传递给它的字符串 |
__V | 执行嵌套函数引用 | |
__eval | 执行字符串表达式 | |
__evalVar | 执行保存在变量中的表达式 | |
数据计算函数 | __counter | 计数器 |
__intSum | 整数求和 | |
__longSum | 长整型求和 | |
__Random | 随机数 | |
__RandomString | 随机字符串 | |
__UUID | 伪随机类型的唯一标识符ID |
1. 脚本函数
1.1 __BeanShell:执行 beanshell 脚本
它有两个参数,第一个参数是要执行的语句,可以是beanshell语句或者是文件地址,是必选参数;第二个参数是保存结果的变量名称,非必选参数。
字段 | 含义 | 是否必传 |
---|---|---|
BeanShell script | beanshell 脚本(不是文件名) | yes |
Name of variable | 用于重用此函数计算的值的引用名称 | no |
示例:
${__BeanShell(vars.put("name"\,"value"))}
${__BeanShell(123*456)} 返回56088
//根据不同系统返回端口号
${__BeanShell(import java.util.*;Properties props = System.getProperties();String osName = props.getProperty("os.name");if(osName.contains("Linux"))return 443;return 8443;,beanshell)}
//取数组中随机值
${__BeanShell(import java.util.*;Random random = new Random();int[] array = {1\,100\,1000\,1100};int i = array[random.nextInt(array.length-1)];return i;,beanshell)}
//实际业务:随机值+当前时间
${__javaScript((Number(Math.random().toString().substr(3\, 11) + Date.now()).toString(36)))}
与 beanshell 元件比较:
该函数与 beanshell 元件(beanshell sampler、beanshell preprocess等)作用是一样的,只是 beanshell 函数更常用于一些简单的判断或计算等,可以把少量的脚本放在函数中直接赋值给一个变量,而不用总是添加 beanshell 元件。
1.2 __javaScript:执行 js 脚本
函数__javaScript可以用来执行JavaScript代码片段(非Java),并返回结果值。
该函数会调用标准的 JavaScript 解释器,还可以直接调用 JMeter 的内置函数。
字段 | 含义 | 是否必传 |
---|---|---|
Expression | 要执行的 JavaScript 表达式 | yes |
Name of variable | 重用此函数计算的值的引用名称 | no |
示例:
${__javaScript(new Date(),MYDATE)} # 返回当前日期和时间
${__javaScript(Math.floor(Math.random()*(${maxRandom}+1)),MYRESULT)} # 将使用 maxRandom 变量,返回一个介于 0 和 maxRandom 之间的随机值并将其存储在 MYRESULT
${__javaScript(${minRandom}+Math.floor(Math.random()*(${maxRandom}-${minRandom}+1)),MYRESULT)} #将使用maxRandom和minRandom变量,返回maxRandom和minRandom之间的随机值并将其存储在变量MYRESULT下
${__javaScript("${VAR}"=="abcd",MYRESULT)} # 将VAR变量的值与abcd进行比较,返回true或false并将结果存储在 MYRESULT
注意:文本字符串要添加必要的引号。如果表达式中有逗号,要确保对其转义。
例如:{__javaScript('{sp}'.slice(7,99999))},对 7 之后的逗号进行了转义。
2. 获取信息函数
2.1 __log : 输出日志信息
函数记录一条消息,并返回其输入字符串
${__log(Message)}:写入日志文件,形如"...threadName:Message"。
${__log(Message,OUT)}:写到控制台窗口。
${__log(${VAR},,,VAR=)}:写入日志文件,形如"...threadNameVAR=value"。
参数说明:
字段 | 含义 | 是否必传 |
---|---|---|
日志内容 | 引用变量名 | yes |
Log Level | OUT, ERR, DEBUG, INFO (default), WARN or ERROR | no |
Throwable text | 如果非空,则创建一个 Throwable 传递给记录器 | no |
Comment | 如果存在,则显示在字符串中。用于识别正在记录的内容 | no |
2.2 __machineIP : 返回机器(电脑)IP
字段 | 含义 | 是否必传 |
---|---|---|
Variable Name | 引用变量名 | no |
2.3 __time : 通过多种格式返回当前时间
字段 | 含义 | 是否必传 |
---|---|---|
格式 | 要传递给SimpleDateFormatSimpleDateFormat的格式。该函数支持各种速记别名,见下文。如果省略,则该函数返回自纪元以来的当前时间(以毫秒为单位) | no |
变量名 | 要设置的变量的名称 | no |
如果省略了格式字符串,那么函数会以毫秒的形式返回当前时间。其他情况下,当前时间会被转成简单日期格式。
JMeter 中默认定义的时间格式属性值有:
YMD = yyyyMMdd。
HMS = HHmmss。
YMDHMS = yyyyMMdd-HHmmss。
3. 变量操作函数
3.1 __split:字符串分割函数
函数__split会通过分隔符来拆分传递给它的字符串,并返回原始的字符串。如果分隔符紧挨在一起,那么函数就会以变量值的形式返回"?"。拆分出来的字符串,以变量${VAR_1}、{VAR_2}…以此类推的形式加以返回。
分隔符默认是逗号,如果你想要多此一举,明确指定使用逗号,需要对逗号转义,如“,”
参数说明:
字段 | 含义 | 是否必传 |
---|---|---|
String to split | 分隔字符串,例如“ a | b| c ” | yes |
Name of variable | 用于重用此函数计算的值的引用名称。 | no |
Delimiter | 指定分隔符,如 " \ : , ”等,若省略,默认使用",“进行分割。若指定”,“进行分割,则需要将”,“进行转义为”," | no |
前后置脚本中,示例特殊情况‘a||c|’分割,分隔符紧挨在一起,返回"?“,以分隔符结束,返回”?"
分割后的数组可搭配循环控制器使用,这里循环控制引用上图分割好的${var}变量
参数中示例分割字符串“admin|b|c”
3.2 __V:执行变量名表达式
函数__V可以用于执行变量名表达式,并返回执行结果。它可以被用于执行嵌套函数引用。
${A1}:能正常工作。
${A${N}}:无法正常工作(嵌套变量引用)。
${__V(A${N})}:可以正常工作。A${N}变为A1,函数 __V返回变量值A1。
参数说明:
字段 | 含义 | 是否必传 |
---|---|---|
Variable name | 要评估的变量。 | yes |
Default value | 未找到变量时的默认值,如果为空且未找到变量,则函数返回变量名称 | no |
场景使用:将数据库获取的数据作为下一个接口的参数(循环控制器+计数器函数){__V(name_{__counter(,)})} 详细使用说明 点击这里
3.3 __eval:返回计算字符串表达式的结果
这允许在存储在变量中的字符串中插入变量和函数引用
例如,给定变量name=Smith、column=age、table=birthdays、SQL=select{table}wherename='{__eval(${SQL})},就能执行"selectagefrombirthdayswherename=‘Smith’"。这样一来,就可以与CSV数据集相互配合,例如,将SQL语句和值都定义在数据文件中。
字段 | 含义 | 是否必传 |
---|---|---|
Variable name | 要评估的变量。 | yes |
使用场景:
①场景内容对某商品的增删改查,该商品的id为固定前缀xxx+32位随机数。
②原来一个注册,因为用到的参数都是随机生成,所以不方便写入csv参数化文件里,只能出现这种多个if控制器+请求样本的脚本设计来跑这些用例。这样脚本就会很繁琐,改动也不方便。
数据文件中直接使用函数或者前文提取的变量。很方便的实现了数据驱动,脚本缩减。
3.4 __evalVar:返回计算存储在变量中的表达式的结果
这允许人们从文件中读取字符串,并处理其中的任何变量引用。例如,如果变量“ query ”包含“ select ${column} from {__evalVar(query)} 将评价为“select name from customers”。
字段 | 含义 | 是否必传 |
---|---|---|
Variable name | 要评估的变量。 | yes |
使用场景同上,使用 __evalVar 里面不用 ${} 就可引用到变量
4. 数据计算函数
4.1 __counter:计数器
1、每次调用计数器函数都会产生一个新值,从1开始每次加1。计数器既可以被配置成针对每个虚拟用户是独立的,也可以被配置成所有虚拟用户公用的。
2、如果每个虚拟用户的计数器是独立增长的,那么通常被用于记录测试计划运行了多少遍。全局计数器通常被用于记录发送了多少次请求。
3、计数器使用一个整数值来记录,允许的最大值为2,147,483,647。
4.2 __intSum:整数求和函数
1、函数__intSum可以被用来计算两个或者更多整数值的合。至少需要两个整数,如果指定变量名则名称中必须包含一个非数字字母,否则它会被当成另一个整数值,而被函数用于计算。
2、当有多个整数时点击添加按钮来增加参数,但是需要注意的是,添加完参数后,点击”生成”的函数默认是把手动添加的函数放在后面,这时需要手动调整变量名的位置,把它放到最后,否则会报错。
4.3 __longSum:计算两个或多个长值的和
longSum 函数可用于计算两个或多个 long 值的总和,只要您知道您的值不在 -2147483648 到 2147483647 的区间内,请使用它而不是 __intSum。
字段 | 含义 | 是否必传 |
---|---|---|
First argument | 第一个长值 | yes |
Second argument | 第二个长值 | yes |
nth argument | 第n个长值 | no |
last argument | 重用此函数计算的值的引用名称 | no |
4.4 __Random:随机数函数
random 函数返回一个介于给定最小值和最大值之间的随机数。
字段 | 含义 | 是否必传 |
---|---|---|
Minimum value | 最小值 | yes |
Maximum value | 最大值 | yes |
Variable Name | 重用此函数计算的值的引用名称 | no |
4.5 __RandomString:随机字符串
RandomString 函数使用要使用的字符中的字符返回长度的随机字符串
字段 | 含义 | 是否必传 |
---|---|---|
Length | 生成的字符串的数字长度 | yes |
Characters to use | 用于生成字符串的字符 | no |
Variable Name | 重用此函数计算的值的引用名称 | no |
4.6 __UUID:随机数函数
UUID 函数返回一个伪随机类型 4 通用唯一标识符 (UUID) 备注:此函数无参数
将返回此格式的 UUID:c69e0dd1-ac6b-4f2b-8d59-5d4e8743eecd