1、JMeter 变量的基本概念
- JMeter 中的“变量”指的是可在测试计划中被引用和替换的值;
- 变量可以静态定义,也可以在运行过程中动态生成。
- JMeter 支持以下几种变量类型:
类型 |
示例 |
来源 |
用户自定义变量 |
${username} |
Test Plan 或 User Defined Variables |
预处理器赋值 |
${var} |
Beanshell / JSR223 PreProcessor |
参数化变量 |
${user_1} |
CSV Data Set Config |
响应提取变量 |
${token} |
JSON Extractor、Regular Expression Extractor |
系统变量 |
${__time(YMD)} |
函数助手或内置函数 |
2 定义变量的几种方式
2.1 用户自定义变量(User Defined Variables)
- 在 Test Plan、Thread Group 或 Test Fragment 下添加 User Defined Variables 元件:
变量名:username
变量值:admin
- 然后可以在任何地方用 ${username} 引用。
2.2 CSV Data Set Config
- 用于从 CSV 文件中读取参数,进行数据驱动测试:
文件路径:data/users.csv
变量名:user,password
admin,123456
test,abcdef
- 每个线程读取一行,并将 ${user} 和 ${password} 替换为相应值。
2.3 BeanShell / JSR223 赋值
- 在 JSR223 PreProcessor 中设置变量:
vars.put("authToken", "Bearer 123456abc")
2.4 提取器生成变量
JSONPath:$.data.token
变量名:token
3 变量的作用域说明
变量类型 |
作用范围 |
生命周期 |
用户自定义变量 |
整个线程组内可见 |
脚本运行期间不变 |
CSV 变量 |
当前线程 |
每线程一行,生命周期随线程 |
vars.put() |
当前线程 |
动态创建,可被后续请求访问 |
提取变量 |
当前线程请求后 |
通常只在后续使用 |
不同线程组间变量不可共享(除非用 JMeter Properties);
使用 vars.get() / vars.put() 访问线程变量;
使用 props.get() / props.put() 访问全局变量(不推荐用于并发写)。
4 变量嵌套与函数辅助
${__RandomString(8,abcdefghijklmnopqrstuvwxyz,varname)}
- 可以动态生成一个变量 ${varname},后续引用 ${varname} 即可。
- 嵌套示例:
服务器地址:${__P(env)}.example.com
5 变量使用实战案例
场景:登录后提取 Token 并用于后续请求
5.1 HTTP 请求 - 登录接口
{"username": "admin", "password": "123456"}
5.2 JSON Extractor
- JSONPath 表达式:$.data.token
- 变量名称:token
5.3 HTTP 请求 - 需要鉴权的接口
Authorization: Bearer ${token}
- 此场景实现了从响应中提取变量并在后续请求中使用的链式操作。
6 常见问题与错误排查
问题 |
原因 |
解决方案 |
${var} 显示为空 |
变量未定义或作用域不对 |
检查变量是否在当前线程组定义 |
CSV 参数未变化 |
缓存导致、共享模式错误 |
设置 Sharing Mode=Current Thread |
多线程变量冲突 |
使用 props 全局变量 |
改用 vars 或线程安全写法 |
提取失败导致后续接口报错 |
提取器配置不正确 |
使用 Debug Sampler 检查返回体 |