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

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 Variables

2.2 配置

 1名称: 全局变量
 2注释: 定义全局使用的变量
 3
 4变量列表:
 5    名称: base_url
 6    值: http://localhost:8080
 7    
 8    名称: username
 9    值: testuser
10    
11    名称: password
12    值: 123456

2.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 Config

3.2 配置

 1名称: 用户数据
 2文件名: C:\test\users.csv
 3文件编码: UTF-8
 4变量名称: username,password,email
 5分隔符: ,
 6引用符号: "
 7是否允许带引号: true
 8循环读取: true
 9遇到文件结束符再次循环: true
10文件开始时执行一次: false

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

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

4.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: user2

4.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 Modifier

5.2 配置

1名称: URL重写
2目标字段: Query String
3参数名称: session_id

5.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 PreProcessor

6.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 可用变量

变量说明示例
varsJMeter变量对象vars.get("name"), vars.put("name", "value")
propsJMeter属性对象props.get("jmeter.home")
log日志对象log.info("message"), log.error("error")
ctxJMeter上下文对象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 PreProcessor

7.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 PreProcessor

8.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文件中的用户数据进行登录测试

配置步骤

  1. 创建CSV文件(users.csv):
1username,password,email
2admin,admin123,admin@example.com
3user1,user123,user1@example.com
4user2,user2123,user2@example.com
  1. 创建线程组(3线程,循环1次)

  2. 添加CSV数据文件设置:

1文件名: users.csv
2文件编码: UTF-8
3变量名称: username,password,email
4分隔符: ,
5循环读取: true
  1. 添加HTTP请求(登录接口):
1方法: POST
2路径: /api/login
3参数:
4    username: ${username}
5    password: ${password}
  1. 添加查看结果树

  2. 运行测试

10.2 案例2:动态参数生成

需求:每次请求前生成动态参数

配置步骤

  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. 运行测试

10.3 案例3:数据库预处理

需求:在发送请求前向数据库插入测试数据

配置步骤

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

  2. 添加JDBC连接配置:

1变量名: mysql_db
2JDBC驱动类: com.mysql.cj.jdbc.Driver
3JDBC URL: jdbc:mysql://localhost:3306/test
4用户名: root
5密码: password
  1. 添加JDBC预处理器:
1变量名: mysql_db
2查询类型: Update Statement
3查询语句: INSERT INTO test_data (name, value) VALUES ('test_${__Random(1,1000)}', '${__RandomString(10,abcdefghijklmnopqrstuvwxyz)}');
  1. 添加HTTP请求(测试接口):
1方法: GET
2路径: /api/data
  1. 添加查看结果树

  2. 运行测试

十一、常见问题

11.1 CSV数据文件路径问题

回答

  • 使用绝对路径:C:\test\users.csv
  • 使用相对路径:./data/users.csv
  • 确保文件编码正确

11.2 JSR223脚本性能问题

回答

  • 推荐使用Groovy语言
  • 避免在脚本中执行耗时操作
  • 避免创建大量对象
  • 使用编译缓存

11.3 前置处理器不执行

回答

  • 检查前置处理器的作用域是否正确
  • 检查前置处理器的执行顺序
  • 检查采样器是否执行成功

11.4 如何在前置处理器中获取响应数据

回答:前置处理器在采样器执行前执行,无法获取响应数据。需要使用后置处理器。


下一章07-后置处理器详解.md

最新文章

本页导航