当前位置: 首页 > 测试知识 > JMeter函数使用指南
JMeter函数使用指南
2026-06-15 作者cwb 浏览次数57

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 脚本做复杂计算比嵌套几十个函数更易维护。

可复用思路放在变量表达式里:在用户定义的变量或前置处理器中统一生成,减少重复计算。

查看函数详情:在函数助手中每个函数都有中文说明,可随时查阅官方文档或助手提示。


文章标签: 软件测试 测试工具
咨询软件测试