头像
淇迹时刻
-- : -- : --
切换主题色
-- : -- : --

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 Variables

2.2 配置

 1名称: 全局变量
 2
 3变量列表:
 4    名称: base_url
 5    值: http://localhost:8080
 6    
 7    名称: username
 8    值: testuser
 9    
10    名称: password
11    值: 123456

2.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()}UUIDabc123-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-11

3.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)}  → KJDFOI

3.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 JMeter

7.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()} → 11

7.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/false

7.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:动态参数生成

需求:生成动态请求参数

配置步骤

  1. 创建线程组(100线程,循环10次)

  2. 添加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)
  1. 添加HTTP请求(使用动态参数):
1方法: POST
2路径: /api/order
3参数:
4    request_id: ${request_id}
5    timestamp: ${timestamp}
6    sign: ${sign}
  1. 添加查看结果树

  2. 运行测试

8.2 案例2:日期范围测试

需求:测试日期范围查询接口

配置步骤

  1. 创建线程组(10线程,循环1次)

  2. 添加用户定义的变量:

1start_date: ${__timeShift(yyyy-MM-dd,-7,d,)}
2end_date: ${__time(yyyy-MM-dd)}
  1. 添加HTTP请求(日期范围查询):
1方法: GET
2路径: /api/orders
3参数:
4    start_date: ${start_date}
5    end_date: ${end_date}
  1. 添加查看结果树

  2. 运行测试

效果:查询最近7天的订单数据。

8.3 案例3:动态变量引用

需求:根据变量值动态引用不同的变量

配置步骤

  1. 创建线程组(3线程,循环1次)

  2. 添加用户定义的变量:

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
  1. 添加JSR223前置处理器:
1def threadNum = ctx.getThreadNum() + 1
2vars.put("thread_num", threadNum.toString())
  1. 添加HTTP请求(使用动态变量):
1方法: POST
2路径: /api/login
3参数:
4    username: ${__V(user_${thread_num}_name)}
5    email: ${__V(user_${thread_num}_email)}
  1. 添加查看结果树

  2. 运行测试

效果:每个线程使用不同的用户数据。

九、常见问题

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

最新文章