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.-%E8%84%9A%E6%9C%AC%E5%87%BD%E6%95%B0}
1.1 __BeanShell:执行 beanshell 脚本 {#1.1-__beanshell%EF%BC%9A%E6%89%A7%E8%A1%8C-beanshell-%E8%84%9A%E6%9C%AC}
它有两个参数,第一个参数是要执行的语句,可以是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 脚本 {#1.2-__javascript%EF%BC%9A%E6%89%A7%E8%A1%8C-js-%E8%84%9A%E6%9C%AC}
函数__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.-%E8%8E%B7%E5%8F%96%E4%BF%A1%E6%81%AF%E5%87%BD%E6%95%B0}
2.1 __log : 输出日志信息 {#2.1-__log-%3A-%E8%BE%93%E5%87%BA%E6%97%A5%E5%BF%97%E4%BF%A1%E6%81%AF}
函数记录一条消息,并返回其输入字符串
${__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 {#2.2-__machineip-%3A-%E8%BF%94%E5%9B%9E%E6%9C%BA%E5%99%A8%EF%BC%88%E7%94%B5%E8%84%91%EF%BC%89ip}
| 字段 | 含义 | 是否必传 | |---------------|-------|------| | Variable Name | 引用变量名 | no |
2.3 __time : 通过多种格式返回当前时间 {#2.3-__time-%EF%BC%9A-%E9%80%9A%E8%BF%87%E5%A4%9A%E7%A7%8D%E6%A0%BC%E5%BC%8F%E8%BF%94%E5%9B%9E%E5%BD%93%E5%89%8D%E6%97%B6%E9%97%B4}
| 字段 | 含义 | 是否必传 | |-----|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|------| | 格式 | 要传递给SimpleDateFormatSimpleDateFormat的格式。该函数支持各种速记别名,见下文。如果省略,则该函数返回自纪元以来的当前时间(以毫秒为单位) | no | | 变量名 | 要设置的变量的名称 | no |
如果省略了格式字符串,那么函数会以毫秒的形式返回当前时间。其他情况下,当前时间会被转成简单日期格式。
JMeter 中默认定义的时间格式属性值有:
YMD = yyyyMMdd。
HMS = HHmmss。
YMDHMS = yyyyMMdd-HHmmss。
- 变量操作函数 {#3.-%E5%8F%98%E9%87%8F%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0}
3.1 __split:字符串分割函数 {#3.1-__split%EF%BC%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%88%86%E5%89%B2%E5%87%BD%E6%95%B0}
函数__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:执行变量名表达式 {#3.2-__v%EF%BC%9A%E6%89%A7%E8%A1%8C%E5%8F%98%E9%87%8F%E5%90%8D%E8%A1%A8%E8%BE%BE%E5%BC%8F}
函数__V可以用于执行变量名表达式,并返回执行结果。它可以被用于执行嵌套函数引用。
${A1}:能正常工作。
${A${N}}:无法正常工作(嵌套变量引用)。
${__V(A${N})}:可以正常工作。A${N}变为A1,函数 __V返回变量值A1。
参数说明:
| 字段 | 含义 | 是否必传 | |---------------|---------------------------------|------| | Variable name | 要评估的变量。 | yes | | Default value | 未找到变量时的默认值,如果为空且未找到变量,则函数返回变量名称 | no |
场景使用:将数据库获取的数据作为下一个接口的参数(循环控制器+计数器函数){_V(name{__counter(,)})} 详细使用说明 点击这里
3.3 __eval:返回计算字符串表达式的结果 {#3.3-__eval%EF%BC%9A%E8%BF%94%E5%9B%9E%E8%AE%A1%E7%AE%97%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E7%BB%93%E6%9E%9C}
这允许在存储在变量中的字符串中插入变量和函数引用
例如,给定变量name=Smith、column=age、table=birthdays、SQL=select columnfrom{table}wherename=' name′,那么通过{__eval(${SQL})},就能执行"selectagefrombirthdayswherename='Smith'"。这样一来,就可以与CSV数据集相互配合,例如,将SQL语句和值都定义在数据文件中。
| 字段 | 含义 | 是否必传 | |---------------|---------|------| | Variable name | 要评估的变量。 | yes |
使用场景:
①场景内容对某商品的增删改查,该商品的id为固定前缀xxx+32位随机数。
②原来一个注册,因为用到的参数都是随机生成,所以不方便写入csv参数化文件里,只能出现这种多个if控制器+请求样本的脚本设计来跑这些用例。这样脚本就会很繁琐,改动也不方便。
数据文件中直接使用函数或者前文提取的变量。很方便的实现了数据驱动,脚本缩减。
3.4 __evalVar:返回计算存储在变量中的表达式的结果 {#3.4-__evalvar%EF%BC%9A%E8%BF%94%E5%9B%9E%E8%AE%A1%E7%AE%97%E5%AD%98%E5%82%A8%E5%9C%A8%E5%8F%98%E9%87%8F%E4%B8%AD%E7%9A%84%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E7%BB%93%E6%9E%9C}
这允许人们从文件中读取字符串,并处理其中的任何变量引用。例如,如果变量" query "包含" select ${column} from table"并且"column"和"table"包含"name"和"customers",则{__evalVar(query)} 将评价为"select name from customers"。
| 字段 | 含义 | 是否必传 | |---------------|---------|------| | Variable name | 要评估的变量。 | yes |
使用场景同上,使用 __evalVar 里面不用 ${} 就可引用到变量
- 数据计算函数 {#4.-%E6%95%B0%E6%8D%AE%E8%AE%A1%E7%AE%97%E5%87%BD%E6%95%B0}
4.1 __counter:计数器 {#4.1-__counter%EF%BC%9A%E8%AE%A1%E6%95%B0%E5%99%A8}
1、每次调用计数器函数都会产生一个新值,从1开始每次加1。计数器既可以被配置成针对每个虚拟用户是独立的,也可以被配置成所有虚拟用户公用的。
2、如果每个虚拟用户的计数器是独立增长的,那么通常被用于记录测试计划运行了多少遍。全局计数器通常被用于记录发送了多少次请求。
3、计数器使用一个整数值来记录,允许的最大值为2,147,483,647。
4.2 __intSum:整数求和函数 {#4.2-__intsum%EF%BC%9A%E6%95%B4%E6%95%B0%E6%B1%82%E5%92%8C%E5%87%BD%E6%95%B0}
1、函数__intSum可以被用来计算两个或者更多整数值的合。至少需要两个整数,如果指定变量名则名称中必须包含一个非数字字母,否则它会被当成另一个整数值,而被函数用于计算。
2、当有多个整数时点击添加按钮来增加参数,但是需要注意的是,添加完参数后,点击"生成"的函数默认是把手动添加的函数放在后面,这时需要手动调整变量名的位置,把它放到最后,否则会报错。
4.3 __longSum:计算两个或多个长值的和 {#4.3-__longsum%EF%BC%9A%E8%AE%A1%E7%AE%97%E4%B8%A4%E4%B8%AA%E6%88%96%E5%A4%9A%E4%B8%AA%E9%95%BF%E5%80%BC%E7%9A%84%E5%92%8C}
longSum 函数可用于计算两个或多个 long 值的总和,只要您知道您的值不在 -2147483648 到 2147483647 的区间内,请使用它而不是 __intSum。
| 字段 | 含义 | 是否必传 | |-----------------|----------------|------| | First argument | 第一个长值 | yes | | Second argument | 第二个长值 | yes | | nth argument | 第n个长值 | no | | last argument | 重用此函数计算的值的引用名称 | no |
4.4 __Random:随机数函数 {#4.4-__random%EF%BC%9A%E9%9A%8F%E6%9C%BA%E6%95%B0%E5%87%BD%E6%95%B0}
random 函数返回一个介于给定最小值和最大值之间的随机数。
| 字段 | 含义 | 是否必传 | |---------------|----------------|------| | Minimum value | 最小值 | yes | | Maximum value | 最大值 | yes | | Variable Name | 重用此函数计算的值的引用名称 | no |
4.5 __RandomString:随机字符串 {#4.5-__randomstring%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%AD%97%E7%AC%A6%E4%B8%B2}
RandomString 函数使用要使用的字符中的字符返回长度的随机字符串
| 字段 | 含义 | 是否必传 | |-------------------|----------------|------| | Length | 生成的字符串的数字长度 | yes | | Characters to use | 用于生成字符串的字符 | no | | Variable Name | 重用此函数计算的值的引用名称 | no |
4.6 __UUID:随机数函数 {#4.6-__uuid%EF%BC%9A%E9%9A%8F%E6%9C%BA%E6%95%B0%E5%87%BD%E6%95%B0}
UUID 函数返回一个伪随机类型 4 通用唯一标识符 (UUID) 备注:此函数无参数
将返回此格式的 UUID:c69e0dd1-ac6b-4f2b-8d59-5d4e8743eecd