--
:
--
:
--
JMeter前置处理器详解
最后更新于:
JMeter前置处理器详解
一、前置处理器概述
1.1 什么是前置处理器
前置处理器(Pre-Processors)是JMeter中在采样器执行之前执行的元件,用于在发送请求前准备数据、修改请求参数或执行其他预处理操作。
1.2 前置处理器的作用
- 生成测试数据:在发送请求前生成动态数据
- 修改请求参数:在发送请求前修改请求参数
- 设置变量:在发送请求前设置JMeter变量
- 数据准备:准备测试所需的数据
- 请求预处理:对请求进行预处理
1.3 前置处理器执行顺序
1前置处理器执行顺序:
21. 配置元件
32. 前置处理器(按在测试计划树中的顺序)
43. 定时器
54. 采样器
65. 后置处理器
76. 断言
87. 监听器1.4 前置处理器分类
| 类型 | 前置处理器名称 | 说明 |
|---|---|---|
| 数据准备 | 用户定义的变量、CSV数据文件设置、用户参数 | 准备测试数据 |
| 请求修改 | HTTP URL重写修饰符、HTTP Cookie管理器 | 修改请求 |
| 脚本执行 | JSR223前置处理器、BeanShell前置处理器 | 执行自定义脚本 |
| 数据库操作 | JDBC预处理器 | 执行数据库操作 |
二、用户定义的变量
2.1 添加用户定义的变量
1右键点击线程组 → Add → Pre Processors → User Defined Variables2.2 配置
1名称: 全局变量
2注释: 定义全局使用的变量
3
4变量列表:
5 名称: base_url
6 值: http://localhost:8080
7
8 名称: username
9 值: testuser
10
11 名称: password
12 值: 1234562.3 参数说明
名称(Name)
1名称: base_url说明:变量名称,后续可通过${base_url}引用。
值(Value)
1值: http://localhost:8080说明:变量的值。
2.4 使用场景
定义全局配置变量
1测试计划结构示例:
2测试计划
3├── 用户定义的变量(线程组级别)
4│ ├── base_url = http://localhost:8080
5│ ├── api_version = v1
6│ └── timeout = 30000
7├── 线程组
8│ ├── HTTP请求
9│ │ 路径: /${api_version}/users
10│ │ 服务器名称: ${base_url}定义测试数据变量
1测试计划结构示例:
2测试计划
3├── 线程组
4│ ├── 用户定义的变量
5│ │ ├── user_id = 1
6│ │ ├── user_name = testuser
7│ │ └── user_email = test@example.com
8│ └── HTTP请求(使用变量)三、CSV数据文件设置
3.1 添加CSV数据文件设置
1右键点击线程组 → Add → Config Element → CSV Data Set Config3.2 配置
1名称: 用户数据
2文件名: C:\test\users.csv
3文件编码: UTF-8
4变量名称: username,password,email
5分隔符: ,
6引用符号: "
7是否允许带引号: true
8循环读取: true
9遇到文件结束符再次循环: true
10文件开始时执行一次: false3.3 参数说明
文件名(Filename)
1文件名: C:\test\users.csv说明:CSV文件的路径。支持绝对路径和相对路径。
文件编码(File Encoding)
1文件编码: UTF-8说明:CSV文件的编码格式。
变量名称(Variable Names)
1变量名称: username,password,email说明:CSV文件中各列对应的变量名,用逗号分隔。
分隔符(Delimiter)
1分隔符: ,说明:CSV文件中的列分隔符。
常见分隔符:
- 逗号(,):默认
- 分号(;):适用于欧洲格式
- 制表符(\t):适用于TSV文件
引用符号(Quote character)
1引用符号: "说明:CSV文件中的引用符号,用于包含特殊字符的字段。
循环读取(Recycle on EOF)
1勾选: 循环读取说明:当读取到文件末尾时,是否重新从文件开头读取。
遇到文件结束符再次循环(Stop thread on EOF)
1勾选: 遇到文件结束符再次循环说明:当读取到文件末尾时,是否停止线程。
3.4 CSV文件格式
1username,password,email
2user1,pass1,user1@example.com
3user2,pass2,user2@example.com
4user3,pass3,user3@example.com3.5 使用场景
参数化登录测试
1CSV文件内容:
2username,password
3admin,admin123
4user1,user123
5user2,user2123
6
7测试计划结构:
8测试计划
9├── 线程组(3线程,循环1次)
10│ ├── CSV数据文件设置
11│ │ 变量名称: username,password
12│ │ 文件名: users.csv
13│ └── HTTP请求(登录)
14│ 参数:
15│ username = ${username}
16│ password = ${password}四、用户参数
4.1 添加用户参数
1右键点击线程组 → Add → Pre Processors → User Parameters4.2 配置
1名称: 用户参数
2每个用户独立的变量: false
3
4变量列表:
5 名称: user_id
6 用户_1: 1
7 用户_2: 2
8 用户_3: 3
9
10 名称: user_name
11 用户_1: admin
12 用户_2: user1
13 用户_3: user24.3 参数说明
每个用户独立的变量(Each user iterates independently?)
1勾选: 每个用户独立的变量说明:如果勾选,每个线程独立迭代变量值。
4.4 使用场景
为每个线程分配不同的测试数据
1测试计划结构:
2测试计划
3├── 线程组(3线程,循环3次)
4│ ├── 用户参数
5│ │ ├── user_id: 1, 2, 3
6│ │ └── user_name: admin, user1, user2
7│ └── HTTP请求(使用变量)效果:
- 线程1使用 user_id=1, user_name=admin
- 线程2使用 user_id=2, user_name=user1
- 线程3使用 user_id=3, user_name=user2
五、HTTP URL重写修饰符
5.1 添加HTTP URL重写修饰符
1右键点击线程组 → Add → Pre Processors → HTTP URL Re-writing Modifier5.2 配置
1名称: URL重写
2目标字段: Query String
3参数名称: session_id5.3 参数说明
目标字段(Target field to rewrite)
1目标字段: Query String选项:
- Query String:查询字符串
- Path:路径
- Request Body:请求体
参数名称(Parameter name)
1参数名称: session_id说明:需要重写的参数名称。
5.4 使用场景
1自动从响应中提取session_id,并添加到后续请求的URL中。六、JSR223前置处理器
6.1 添加JSR223前置处理器
1右键点击采样器 → Add → Pre Processors → JSR223 PreProcessor6.2 配置
1名称: 生成动态参数
2脚本语言: groovy
3脚本:
4 // 获取当前时间戳
5 def timestamp = System.currentTimeMillis()
6
7 // 生成随机数
8 def random = new Random().nextInt(1000)
9
10 // 设置变量
11 vars.put("timestamp", timestamp.toString())
12 vars.put("random_id", random.toString())
13
14 // 打印日志
15 log.info("Generated timestamp: ${timestamp}")
16 log.info("Generated random_id: ${random}")6.3 参数说明
脚本语言(Language)
1脚本语言: groovy选项:
- groovy(推荐):性能最好
- javascript:JavaScript语言
- beanshell:BeanShell语言
脚本(Script)
1// 脚本内容说明:要执行的脚本代码。
6.4 可用变量
| 变量 | 说明 | 示例 |
|---|---|---|
| vars | JMeter变量对象 | vars.get("name"), vars.put("name", "value") |
| props | JMeter属性对象 | props.get("jmeter.home") |
| log | 日志对象 | log.info("message"), log.error("error") |
| ctx | JMeter上下文对象 | ctx.getThreadNum() |
| sampler | 当前采样器对象 | sampler.getDomain() |
6.5 使用场景
生成动态请求参数
1// 生成UUID
2def uuid = UUID.randomUUID().toString()
3vars.put("request_id", uuid)
4
5// 生成签名
6def timestamp = System.currentTimeMillis()
7def sign = MD5(timestamp + "secret")
8vars.put("sign", sign)
9vars.put("timestamp", timestamp.toString())修改请求参数
1// 修改HTTP请求的参数
2sampler.addArgument("timestamp", timestamp.toString())
3sampler.addArgument("sign", sign)数据预处理
1// 读取CSV数据并进行处理
2def rawData = vars.get("raw_data")
3def processedData = rawData.replace(" ", "")
4vars.put("processed_data", processedData)七、BeanShell前置处理器
7.1 添加BeanShell前置处理器
1右键点击采样器 → Add → Pre Processors → BeanShell PreProcessor7.2 配置
1名称: BeanShell预处理
2脚本:
3 // 获取变量
4 String username = vars.get("username");
5
6 // 处理数据
7 String upperUsername = username.toUpperCase();
8
9 // 设置变量
10 vars.put("username_upper", upperUsername);
11
12 // 打印日志
13 log.info("Processed username: " + upperUsername);7.3 使用场景
注意:推荐使用JSR223前置处理器(Groovy语言),性能比BeanShell好。
八、JDBC预处理器
8.1 添加JDBC预处理器
1右键点击采样器 → Add → Pre Processors → JDBC PreProcessor8.2 配置
1名称: JDBC预处理
2变量名: mysql_db
3查询类型: Update Statement
4查询语句: INSERT INTO test_log (message) VALUES ('test');8.3 参数说明
变量名(Variable Name of Pool)
1变量名: mysql_db说明:引用JDBC连接配置中设置的变量名。
查询类型(Query Type)
1查询类型: Update Statement选项:
- Select Statement:SELECT查询
- Update Statement:INSERT/UPDATE/DELETE
- Callable Statement:存储过程调用
8.4 使用场景
1在发送HTTP请求前,先向数据库插入测试数据。九、前置处理器作用域
9.1 全局前置处理器
1添加位置: 线程组级别
2作用域: 线程组内所有采样器9.2 局部前置处理器
1添加位置: 采样器级别
2作用域: 仅该采样器9.3 控制器级别前置处理器
1添加位置: 控制器级别
2作用域: 控制器内所有采样器十、实战案例
10.1 案例1:参数化登录测试
需求:使用CSV文件中的用户数据进行登录测试
配置步骤:
- 创建CSV文件(users.csv):
1username,password,email
2admin,admin123,admin@example.com
3user1,user123,user1@example.com
4user2,user2123,user2@example.com创建线程组(3线程,循环1次)
添加CSV数据文件设置:
1文件名: users.csv
2文件编码: UTF-8
3变量名称: username,password,email
4分隔符: ,
5循环读取: true- 添加HTTP请求(登录接口):
1方法: POST
2路径: /api/login
3参数:
4 username: ${username}
5 password: ${password}添加查看结果树
运行测试
10.2 案例2:动态参数生成
需求:每次请求前生成动态参数
配置步骤:
创建线程组(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}添加查看结果树
运行测试
10.3 案例3:数据库预处理
需求:在发送请求前向数据库插入测试数据
配置步骤:
创建线程组(10线程,循环1次)
添加JDBC连接配置:
1变量名: mysql_db
2JDBC驱动类: com.mysql.cj.jdbc.Driver
3JDBC URL: jdbc:mysql://localhost:3306/test
4用户名: root
5密码: password- 添加JDBC预处理器:
1变量名: mysql_db
2查询类型: Update Statement
3查询语句: INSERT INTO test_data (name, value) VALUES ('test_${__Random(1,1000)}', '${__RandomString(10,abcdefghijklmnopqrstuvwxyz)}');- 添加HTTP请求(测试接口):
1方法: GET
2路径: /api/data添加查看结果树
运行测试
十一、常见问题
11.1 CSV数据文件路径问题
回答:
- 使用绝对路径:
C:\test\users.csv - 使用相对路径:
./data/users.csv - 确保文件编码正确
11.2 JSR223脚本性能问题
回答:
- 推荐使用Groovy语言
- 避免在脚本中执行耗时操作
- 避免创建大量对象
- 使用编译缓存
11.3 前置处理器不执行
回答:
- 检查前置处理器的作用域是否正确
- 检查前置处理器的执行顺序
- 检查采样器是否执行成功
11.4 如何在前置处理器中获取响应数据
回答:前置处理器在采样器执行前执行,无法获取响应数据。需要使用后置处理器。
下一章:07-后置处理器详解.md
📡
👤
作者:
阿海
🌐
版权:
本站文章除特别声明外,均采用
CC BY-NC-SA 4.0
协议,转载请注明来自
阿海 Blog!
- 01JMeter界面详解 2026-07-11
- 02性能测试学习路线 2026-07-11
- 03JMeter线程组配置详解 2026-07-11