1. 基础语法和调用方式
函数的标准格式为:
text
${__functionName(arg1, arg2, arg3)}
以 ${__ 开头,} 结尾
参数之间用英文逗号 , 分隔
函数可以嵌套,内层先执行
快速生成函数的方法:
打开 JMeter - 菜单栏 Tools - Function Helper Dialog(函数助手对话框),选择函数、填写参数,点击生成即可得到格式化好的字符串,直接复制到需要的地方。
2. 常用函数分类速查
变量/属性
__P / __property:读取 JMeter 属性(命令行 -J 传入),如 ${__P(host,localhost)}
__setProperty:动态设置属性,常用于跨线程组传值,如 ${__setProperty(token,${token},)}
__V:嵌套分析变量(如变量名本身也是动态的),如 ${__V(user_${id})}
随机数/字符串
__Random:生成指定范围的随机整数,如 ${__Random(1000,9999,orderId)}
__RandomString:生成随机字符串(可指定字符集),如 ${__RandomString(8,abcdef123,)}
__RandomDate:生成指定范围内的随机日期,如 ${__RandomDate(2024-01-01,2024-12-31,yyyy-MM-dd,)}
__UUID:生成 UUID(默认带横线),如 ${__UUID}
时间
__time:获取当前时间戳或按格式输出时间,如 ${__time(yyyyMMddHHmmss,)}
__timeShift:以指定格式进行时间加减运算,如 ${__timeShift(yyyy-MM-dd HH:mm:ss,,P1D,,)}
计数器/数字
__counter:线程安全的自增计数器,如 ${__counter(FALSE,myCounter)}
__intSum:整数求和,如 ${__intSum(5,8,result)}
__longSum:长整型求和,如 ${__longSum(${a},${b},)}
字符串处理
__urlencode:URL 编码,如 ${__urlencode(你好)} - %E4%BD%A0%E5%A5%BD
__urldecode:URL 解码,反向操作
__split:按分隔符拆分字符串到一系列变量,如 ${__split(apple,banana,grape,fruits,)}
__changeCase:大小写转换,如 ${__changeCase(Hello World,UPPER,)} 输出 HELLO WORLD
__char:将 ASCII/Unicode 码转换为字符,如 ${__char(65,)} - A
思路/脚本
__jexl3:执行 JEXL3 表达式,常用于条件判断,如 ${__jexl3(${count} > 5,)}
__if:根据条件返回不同值,如 ${__if(${status} == 200,OK,FAIL)}
__groovy:执行 Groovy 脚本(推荐替代 BeanShell),如 ${__groovy(new Date().format('yyyyMMdd'))}
__eval:执行一个字符串表达式,如 ${__eval(${myVar})}
文件操作
__CSVRead:从 CSV 文件中按顺序读取指定列,如 ${__CSVRead(users.csv,1)}
__StringFromFile:每次调用读取文件的新一行,如 ${__StringFromFile(data.txt,,,)}
环境/机器信息
__TestPlanName:返回当前测试计划名称,如 ${__TestPlanName}
__machineName:返回运行 JMeter 的机器名,如 ${__machineName}
__threadNum:当前线程在线程组内的编号(从1开始),如 ${__threadNum}
3. 注意事项
3.1 逗号转义
当参数内部包含逗号时,必须用反斜杠转义,否则会被当成参数分隔符。
text
# 错误:JMeter 会认为有4个参数
${__split(北京,上海,广州, cities,)}
# 正确:逗号转义
${__split(北京\,上海\,广州, cities,)}
3.2 函数嵌套
函数可以多层嵌套,内层函数会先计算。常见组合:计数器+时间、随机数+格式化。
text
# 生成 "user_随机数_时间戳" 格式的用户名
${__RandomString(5,abcdef,)}_${__time(,)}
3.3 变量分析时机和 __V 函数
如果变量的值本身又是一个变量引用,需要 __V 来二次分析。
场景:要读取 user_${counter} 这个动态变量。
text
${__V(user_${counter})}
__V 会先计算 ${counter} 得到完整变量名,再从变量池中取出最后值。
4. 实战示例
4.1 生成随机手机号
text
138${__RandomString(8,0123456789,)}
# 解释:138开头,后面8位随机数字
4.2 动态订单号(毫秒时间戳+4位随机数)
text
ORD${__time(,)}${__Random(1000,9999,)}
4.3 参数化 HTTP 请求时间范围
需要查询过去7天的某一天数据,用 __timeShift:
text
startDate=${__timeShift(yyyy-MM-dd,,P-7D,,)}
endDate=${__time(yyyy-MM-dd,)}
4.4 根据条件动态赋值
text
${__if(${gender} == 1, 男性, 女性)}
# 如果 gender 变量为1,输出“男性”,否则“女性”
4.5 跨线程组传递 Token
线程组1(提取 token 到变量) → 后置处理器 Beanshell / JSR223:
java
props.put("globalToken", vars.get("token")); // 存入属性
线程组2 调用:
text
Authorization: Bearer ${__P(globalToken,)}
5. 性能实践
优先使用 __groovy 替代 __BeanShell:Groovy 预编译,性能更好,脚本和 Java 语法高度兼容。
高频调用避免复杂函数:比如在循环内执行 __RandomDate 足够,但使用 Groovy 脚本做复杂计算比嵌套几十个函数更易维护。
可复用思路放在变量表达式里:在用户定义的变量或前置处理器中统一生成,减少重复计算。
查看函数详情:在函数助手中每个函数都有中文说明,可随时查阅官方文档或助手提示。