--
:
--
:
--
JMeter变量与函数详解
最后更新于:
JMeter变量与函数详解
一、变量概述
1.1 什么是JMeter变量
JMeter变量是存储数据的容器,用于在测试计划中传递数据和参数。
1.2 变量的作用
- 存储测试数据:存储用户输入、响应数据等
- 传递参数:在不同采样器之间传递数据
- 配置测试:通过变量配置测试行为
- 参数化测试:使用变量实现参数化
1.3 变量类型
| 类型 | 说明 | 示例 |
|---|---|---|
| 用户定义变量 | 用户手动定义的变量 | ${base_url} |
| 系统变量 | JMeter内置的系统变量 | ${__time()} |
| 响应变量 | 从响应中提取的变量 | ${user_id} |
| 函数变量 | 通过函数生成的变量 | ${__Random(1,100)} |
1.4 变量引用方式
1${变量名}示例:
1${username}
2${user_id}
3${token}二、用户定义的变量
2.1 添加用户定义的变量
1右键点击线程组 → Add → Config Element → User Defined Variables2.2 配置
1名称: 全局变量
2
3变量列表:
4 名称: base_url
5 值: http://localhost:8080
6
7 名称: username
8 值: testuser
9
10 名称: password
11 值: 1234562.3 使用场景
定义全局配置变量
1测试计划结构示例:
2测试计划
3├── 用户定义的变量(测试计划级别)
4│ ├── base_url = http://localhost:8080
5│ ├── api_version = v1
6│ └── timeout = 30000
7├── 线程组
8│ ├── HTTP请求
9│ │ 服务器名称: ${base_url}
10│ │ 路径: /${api_version}/users定义测试数据变量
1测试计划结构示例:
2测试计划
3├── 线程组
4│ ├── 用户定义的变量
5│ │ ├── user_id = 1
6│ │ ├── user_name = testuser
7│ │ └── user_email = test@example.com
8│ └── HTTP请求(使用变量)三、系统变量
3.1 常用系统变量
| 变量 | 说明 | 示例值 |
|---|---|---|
| ${__jmeter.thread.name} | 线程名称 | Thread Group 1-1 |
| ${__jmeter.thread.num} | 线程编号 | 1 |
| ${__jmeter.iteration.num} | 迭代次数 | 1 |
| ${__time(yyyy-MM-dd HH:mm:ss)} | 当前时间 | 2026-07-11 10:00:00 |
| ${__dateTime()} | 当前日期时间 | 20260711100000 |
| ${__Random(1,100)} | 随机数 | 42 |
| ${__UUID()} | UUID | abc123-def456 |
3.2 时间函数
__time函数
1${__time(yyyy-MM-dd HH:mm:ss)}格式说明:
| 格式 | 说明 | 示例 |
|---|---|---|
yyyy | 年份(4位) | 2026 |
MM | 月份(2位) | 07 |
dd | 日期(2位) | 11 |
HH | 小时(24小时制) | 10 |
mm | 分钟(2位) | 00 |
ss | 秒(2位) | 00 |
示例:
1${__time(yyyy-MM-dd)} → 2026-07-11
2${__time(HH:mm:ss)} → 10:00:00
3${__time(yyyyMMddHHmmss)} → 20260711100000__dateTime函数
1${__dateTime()}默认格式:yyyyMMddHHmmss
示例:
1${__dateTime()} → 20260711100000
2${__dateTime(yyyy-MM-dd)} → 2026-07-113.3 随机数函数
__Random函数
1${__Random(1,100)}参数说明:
- 第一个参数:最小值
- 第二个参数:最大值
示例:
1${__Random(1,100)} → 42
2${__Random(1000,9999)} → 5678
3${__Random(1,100,random_seed)} → 使用固定种子生成随机数__RandomString函数
1${__RandomString(10,abcdefghijklmnopqrstuvwxyz)}参数说明:
- 第一个参数:字符串长度
- 第二个参数:字符集
示例:
1${__RandomString(10,abcdefghijklmnopqrstuvwxyz)} → kjdfoiweqr
2${__RandomString(8,0123456789)} → 84729163
3${__RandomString(6,ABCDEFGHIJKLMNOPQRSTUVWXYZ)} → KJDFOI3.4 UUID函数
__UUID函数
1${__UUID()}示例:
1${__UUID()} → 550e8400-e29b-41d4-a716-446655440000四、响应变量
4.1 提取响应变量
JSON提取器
1引用名称: user_id
2JSON路径表达式: $.data.id
3匹配数字: 1
4默认值: -1结果:${user_id} = 提取的值
正则表达式提取器
1引用名称: token
2正则表达式: "token":"([^"]+)"
3模板: $1$
4匹配数字: 1
5默认值: 结果:${token} = 提取的值
XPath提取器
1引用名称: username
2XPath表达式: //user/name/text()
3匹配数字: 1
4默认值: unknown结果:${username} = 提取的值
4.2 使用响应变量
1测试计划结构示例:
2测试计划
3├── 线程组
4│ ├── HTTP请求(登录)
5│ ├── JSON提取器(提取Token)
6│ │ 引用名称: token
7│ ├── HTTP请求(获取用户信息)
8│ │ 路径: /api/user/${user_id}
9│ │ 信息头: Authorization: Bearer ${token}五、自定义函数
5.1 使用JSR223脚本定义变量
1// 设置变量
2vars.put("custom_var", "custom_value")
3
4// 获取变量
5def value = vars.get("custom_var")
6
7// 设置整数变量
8vars.put("count", "10")
9
10// 设置对象变量(需要序列化)
11def map = ["name": "test", "age": 25]
12vars.put("user_data", new groovy.json.JsonBuilder(map).toString())5.2 使用BeanShell脚本定义变量
1// 设置变量
2vars.put("custom_var", "custom_value");
3
4// 获取变量
5String value = vars.get("custom_var");
6
7// 设置整数变量
8vars.put("count", "10");六、变量作用域
6.1 线程级变量
1作用域: 仅当前线程
2示例: vars.put("thread_var", "value")6.2 用户级变量
1作用域: 所有线程共享
2示例: props.put("global_var", "value")6.3 配置级变量
1作用域: 配置元件所在的级别
2示例: 用户定义的变量七、JMeter函数详解
7.1 字符串函数
__split函数
1${__split(1,2,3,4,5,values,)}参数说明:
- 第一个参数:要分割的字符串
- 第二个参数:分隔符
- 第三个参数:变量名前缀
示例:
1${__split(a,b,c,d,e,values,)}
2${values_1} → a
3${values_2} → b
4${values_3} → c__substring函数
1${__substring(Hello World,0,5)}参数说明:
- 第一个参数:字符串
- 第二个参数:开始索引
- 第三个参数:结束索引
示例:
1${__substring(Hello World,0,5)} → Hello
2${__substring(Hello World,6,11)} → World__replace函数
1${__replace(Hello World,World,JMeter)}参数说明:
- 第一个参数:字符串
- 第二个参数:要替换的子字符串
- 第三个参数:替换后的字符串
示例:
1${__replace(Hello World,World,JMeter)} → Hello JMeter7.2 数学函数
__eval函数
1${__eval(${var1} + ${var2})}说明:执行变量表达式。
示例:
1${var1} = 10
2${var2} = 20
3${__eval(${var1} + ${var2})} → 30__intSum函数
1${__intSum(10,20,30)}参数说明:
- 多个整数参数
示例:
1${__intSum(10,20)} → 30
2${__intSum(10,20,30)} → 60__longSum函数
1${__longSum(1000000000,2000000000)}说明:长整数求和。
7.3 日期函数
__timeShift函数
1${__timeShift(yyyy-MM-dd,1,d,)}参数说明:
- 第一个参数:日期格式
- 第二个参数:偏移量
- 第三个参数:偏移单位(d=天, h=小时, m=分钟, s=秒)
示例:
1${__timeShift(yyyy-MM-dd,1,d,)} → 明天
2${__timeShift(yyyy-MM-dd,-1,d,)} → 昨天
3${__timeShift(yyyy-MM-dd HH:mm:ss,1,h,)} → 1小时后__dayOfMonth函数
1${__dayOfMonth()}说明:获取当前日期的天数。
示例:
1${__dayOfMonth()} → 117.4 逻辑函数
__jexl3函数
1${__jexl3(${count} < 10,)}说明:执行JEXL表达式。
示例:
1${__jexl3(${response_code} == 200,)} → true/false
2${__jexl3(${response_time} < 1000,)} → true/false
3${__jexl3(${count} > 0 && ${count} < 100,)} → true/false__javaScript函数
1${__javaScript(${count} < 10,)}说明:执行JavaScript表达式。
示例:
1${__javaScript(${response_code} == 200,)} → true/false7.5 变量函数
__evalVar函数
1${__evalVar(var_name)}说明:获取变量的值。
示例:
1${var_name} = user_id
2${user_id} = 123
3${__evalVar(var_name)} → 123__V函数
1${__V(user_${count})}说明:动态引用变量名。
示例:
1${count} = 1
2${user_1} = test1
3${__V(user_${count})} → test1八、实战案例
8.1 案例1:动态参数生成
需求:生成动态请求参数
配置步骤:
创建线程组(100线程,循环10次)
添加JSR223前置处理器:
1// 生成UUID作为请求ID
2def requestId = UUID.randomUUID().toString()
3vars.put("request_id", requestId)
4
5// 生成时间戳
6def timestamp = System.currentTimeMillis()
7vars.put("timestamp", timestamp.toString())
8
9// 生成随机签名
10def sign = "${timestamp}${requestId}secret".md5()
11vars.put("sign", sign)- 添加HTTP请求(使用动态参数):
1方法: POST
2路径: /api/order
3参数:
4 request_id: ${request_id}
5 timestamp: ${timestamp}
6 sign: ${sign}添加查看结果树
运行测试
8.2 案例2:日期范围测试
需求:测试日期范围查询接口
配置步骤:
创建线程组(10线程,循环1次)
添加用户定义的变量:
1start_date: ${__timeShift(yyyy-MM-dd,-7,d,)}
2end_date: ${__time(yyyy-MM-dd)}- 添加HTTP请求(日期范围查询):
1方法: GET
2路径: /api/orders
3参数:
4 start_date: ${start_date}
5 end_date: ${end_date}添加查看结果树
运行测试
效果:查询最近7天的订单数据。
8.3 案例3:动态变量引用
需求:根据变量值动态引用不同的变量
配置步骤:
创建线程组(3线程,循环1次)
添加用户定义的变量:
1user_1_name: admin
2user_1_email: admin@example.com
3user_2_name: user1
4user_2_email: user1@example.com
5user_3_name: user2
6user_3_email: user2@example.com- 添加JSR223前置处理器:
1def threadNum = ctx.getThreadNum() + 1
2vars.put("thread_num", threadNum.toString())- 添加HTTP请求(使用动态变量):
1方法: POST
2路径: /api/login
3参数:
4 username: ${__V(user_${thread_num}_name)}
5 email: ${__V(user_${thread_num}_email)}添加查看结果树
运行测试
效果:每个线程使用不同的用户数据。
九、常见问题
9.1 变量引用不生效
回答:
- 检查变量名称是否正确
- 检查变量是否已定义
- 检查变量作用域是否正确
- 确保变量在使用前已经被设置
9.2 函数语法错误
回答:
- 检查函数名称是否正确
- 检查函数参数是否正确
- 参考JMeter函数文档
9.3 变量值为空
回答:
- 检查变量是否被正确设置
- 检查提取器是否提取到数据
- 使用调试后置处理器查看变量值
9.4 如何在脚本中使用变量
回答:
1// 获取变量
2def value = vars.get("var_name")
3
4// 设置变量
5vars.put("var_name", "value")
6
7// 设置整数变量
8vars.put("count", "10")下一章:11-参数化测试.md
📡
👤
作者:
阿海
🌐
版权:
本站文章除特别声明外,均采用
CC BY-NC-SA 4.0
协议,转载请注明来自
阿海 Blog!
- 01JMeter界面详解 2026-07-11
- 02性能测试学习路线 2026-07-11
- 03JMeter线程组配置详解 2026-07-11