JMeter 还提供了用于读取配置属性、动态分析表达式、执行脚本思路的函数。
1. property 函数 -__property() / __P()
作用:读取 JMeter 属性(全局、跨线程组),一般由命令行 -J 或 jmeter.properties 定义。
__P():简洁的写法。
语法:${__P(属性名, 默认值)}
示例:${__P(env.host, test.local)} → 读取 env.host 属性,如果未定义则使用 test.local。
__property():功能更全,可将结果存入变量供后续复用。
语法:${__property(属性名, 变量名, 默认值)}
示例:${__property(threads, userCount, 10)} → 将 threads 属性的值存入变量 userCount,默认 10。之后直接引用 ${userCount} 即可。
需要跨线程组共享数据时,可配合 __setProperty() 将变量提升为属性,如:${__setProperty(token, ${__UUID()},)}。
场景:
通过命令行 -Jenv.host=prod.example.com 切换测试环境。
多线程组间传递运行时生成的认证 token。
读取系统属性,如 java.version、user.dir。
2. eval 函数 - __eval()
作用:对一段包含变量或函数引用的字符串进行二次求值,实现动态表达式执行。
语法:${__eval(表达式, 变量名)}
机制:
假设有个变量 dynamicFunc 的值是字符串 "__time(yyyy-MM-dd)"。
直接引用 ${dynamicFunc} 只会得到原字符串,函数不会执行。
使用 ${__eval(${dynamicFunc})} 则会先取出该字符串,再将其作为函数执行,最后返回真实日期 2026-05-21。
更复杂的嵌套:${__eval(${__RandomString(1,012,prefix)}_suffix)}。
如果 __RandomString 返回 "0",则 eval 的表达式变为 0_suffix,如果存在名为 0_suffix 的变量,就会进一步返回其值。
场景:
循环中动态拼接变量名,如 var_${idx}。
从 CSV 中读取某列值为 __UUID(),通过 eval 真实生成 UUID。
根据条件选择不同的时间偏移表达式进行求值。
3. javaScript 函数 - __javaScript() (目前已弃用)
状态:自 JMeter 3.1 起弃用,在 Java 15+ 环境中默认不可用,会直接报错。因为 Java 移除了 Nashorn 引擎,JMeter 不再内置支持 JavaScript。
替代方案:强烈推荐使用 __groovy() 或 __jexl3(),它们性能更好且长期受支持。如果之前有脚本用到 __javaScript,需要尽快迁移。
以下是常见用法的迁移对照(文字说明,不用表格):
生成 0~99 的随机整数
弃用写法:${__javaScript(Math.floor(Math.random()*100),)}
推荐写法:${__groovy(Math.floor(Math.random()*100),)}
或使用更简洁的 __jexl3:${__jexl3(Math.floor(Math.random()*100),)}
字符串和时间戳拼接
弃用写法:${__javaScript("prefix_"+new Date().getTime())}
推荐写法:${__groovy("prefix_" + System.currentTimeMillis(),)}
生成带 UUID 的字符串
弃用写法:${__javaScript("ID_"+java.util.UUID.randomUUID().toString())}
推荐写法:${__groovy("ID_" + java.util.UUID.randomUUID().toString(),)}
使用 __groovy 时,建议在函数辅助对话框中勾选 “Cache compiled script”,可以避免每次调用都重新编译,显著提升性能。
如果因特殊原因必须运行 JavaScript,可配置 GraalVM 作为替代引擎,但配置复杂且不推荐,常规场景直接使用 Groovy 即可。
组合示例
如从命令行传入倍数 -Jmultiplier=10,脚本中动态计算 100 * multiplier:
先用 __P 读取属性:${__P(multiplier,5)} 得到 10。
拼接成 Groovy 表达式并执行:${__eval(__groovy(100 * ${__P(multiplier,5)}),)}
这里 __eval 保证拼接后的 __groovy(100 * 10) 被真正求值,得到结果 1000。
这样的组合让脚本在环境切换、动态运算时非常灵活。