JMeter后置处理器详解
JMeter后置处理器详解
一、后置处理器概述
1.1 什么是后置处理器
后置处理器(Post-Processors)是JMeter中在采样器执行之后执行的元件,用于在收到响应后提取数据、处理响应或执行其他后处理操作。
1.2 后置处理器的作用
- 提取响应数据:从响应中提取需要的数据
- 设置变量:将提取的数据保存为JMeter变量
- 数据处理:对响应数据进行处理
- 关联请求:将一个请求的响应数据传递给下一个请求
- 记录日志:记录响应数据到日志
1.3 后置处理器执行顺序
1后置处理器执行顺序:
21. 采样器执行完成
32. 后置处理器(按在测试计划树中的顺序)
43. 断言
54. 监听器收集结果1.4 后置处理器分类
| 类型 | 后置处理器名称 | 说明 |
|---|---|---|
| 数据提取 | JSON提取器、正则表达式提取器、XPath提取器、边界提取器 | 从响应中提取数据 |
| 脚本执行 | JSR223后置处理器、BeanShell后置处理器 | 执行自定义脚本 |
| 数据库操作 | JDBC后置处理器 | 执行数据库操作 |
| 调试 | 调试后置处理器 | 调试变量值 |
二、JSON提取器
2.1 添加JSON提取器
1右键点击采样器 → Add → Post Processors → JSON Extractor2.2 配置
1名称: 提取用户ID
2引用名称: user_id
3JSON路径表达式: $.data.id
4匹配数字: 1
5默认值: -12.3 参数说明
引用名称(Reference Name)
1引用名称: user_id说明:提取的数据将保存到该变量中,后续可通过${user_id}引用。
JSON路径表达式(JSON Path Expression)
1JSON路径表达式: $.data.id说明:JSON路径表达式,用于定位JSON中的字段。
常用JSON Path表达式:
| 表达式 | 说明 | 示例 |
|---|---|---|
$.key | 获取根对象的key字段 | $.code |
$.data[0] | 获取data数组的第一个元素 | $.data[0].name |
$.data[*] | 获取data数组的所有元素 | $.data[*].id |
$.data.length() | 获取data数组的长度 | $.data.length() |
$..name | 获取所有name字段 | $..name |
匹配数字(Match No.)
1匹配数字: 1说明:指定匹配第几个结果。
选项:
- 0:随机匹配一个
- 1:匹配第一个
- -1:匹配所有,结果以逗号分隔
默认值(Default Value)
1默认值: -1说明:当JSON路径表达式匹配不到结果时使用的默认值。
2.4 使用场景
提取单个字段
1{
2 "code": 0,
3 "message": "success",
4 "data": {
5 "id": 1,
6 "name": "test",
7 "email": "test@example.com"
8 }
9}1引用名称: user_id
2JSON路径表达式: $.data.id
3匹配数字: 1
4默认值: -1结果:${user_id} = 1
提取数组元素
1{
2 "code": 0,
3 "data": [
4 {"id": 1, "name": "test1"},
5 {"id": 2, "name": "test2"},
6 {"id": 3, "name": "test3"}
7 ]
8}1引用名称: user_ids
2JSON路径表达式: $.data[*].id
3匹配数字: -1
4默认值: 结果:${user_ids} = 1,2,3
提取嵌套字段
1{
2 "code": 0,
3 "data": {
4 "user": {
5 "profile": {
6 "name": "test"
7 }
8 }
9 }
10}1引用名称: user_name
2JSON路径表达式: $.data.user.profile.name
3匹配数字: 1
4默认值: unknown结果:${user_name} = test
三、正则表达式提取器
3.1 添加正则表达式提取器
1右键点击采样器 → Add → Post Processors → Regular Expression Extractor3.2 配置
1名称: 提取Token
2引用名称: token
3正则表达式: "token":"([^"]+)"
4模板: $1$
5匹配数字: 1
6默认值: 3.3 参数说明
引用名称(Reference Name)
1引用名称: token说明:提取的数据将保存到该变量中。
正则表达式(Regular Expression)
1正则表达式: "token":"([^"]+)"说明:用于匹配响应内容的正则表达式。
模板(Template)
1模板: $1$说明:使用捕获组提取匹配内容,$1$表示第一个捕获组。
匹配数字(Match No.)
1匹配数字: 1说明:指定匹配第几个结果。
默认值(Default Value)
1默认值: 说明:当正则表达式匹配不到结果时使用的默认值。
3.4 使用场景
提取Token
1{
2 "code": 0,
3 "data": {
4 "token": "abc123def456",
5 "user_id": 1
6 }
7}1引用名称: token
2正则表达式: "token":"([^"]+)"
3模板: $1$
4匹配数字: 1结果:${token} = abc123def456
提取URL参数
1<a href="/api/users?id=123">查看用户</a>1引用名称: user_id
2正则表达式: id=(\d+)
3模板: $1$
4匹配数字: 1结果:${user_id} = 123
提取HTML标签内容
1<h1>Hello World</h1>1引用名称: title
2正则表达式: <h1>([^<]+)</h1>
3模板: $1$
4匹配数字: 1结果:${title} = Hello World
四、XPath提取器
4.1 添加XPath提取器
1右键点击采样器 → Add → Post Processors → XPath Extractor4.2 配置
1名称: 提取用户名
2引用名称: username
3XPath表达式: //user/name/text()
4匹配数字: 1
5默认值: unknown4.3 参数说明
引用名称(Reference Name)
1引用名称: username说明:提取的数据将保存到该变量中。
XPath表达式(XPath Expression)
1XPath表达式: //user/name/text()说明:XPath表达式,用于定位XML/HTML中的元素。
匹配数字(Match No.)
1匹配数字: 1说明:指定匹配第几个结果。
默认值(Default Value)
1默认值: unknown说明:当XPath表达式匹配不到结果时使用的默认值。
忽略空白(Ignore Whitespace)
1勾选: 忽略空白说明:如果勾选,忽略XML/HTML中的空白字符。
返回值类型(Return XPath Default Value)
1勾选: 返回值类型说明:如果勾选,当XPath表达式匹配不到结果时返回默认值。
4.4 使用场景
提取XML元素
1<response>
2 <code>0</code>
3 <data>
4 <user>
5 <name>test</name>
6 <age>25</age>
7 </user>
8 </data>
9</response>1引用名称: username
2XPath表达式: //user/name/text()
3匹配数字: 1结果:${username} = test
提取HTML元素
1<html>
2 <body>
3 <div class="content">
4 <span id="user-name">testuser</span>
5 </div>
6 </body>
7</html>1引用名称: username
2XPath表达式: //span[@id='user-name']/text()
3匹配数字: 1结果:${username} = testuser
五、边界提取器
5.1 添加边界提取器
1右键点击采样器 → Add → Post Processors → Boundary Extractor5.2 配置
1名称: 提取ID
2引用名称: id
3左边界: "id":
4右边界: ,
5匹配数字: 1
6默认值: -15.3 参数说明
引用名称(Reference Name)
1引用名称: id说明:提取的数据将保存到该变量中。
左边界(Left Boundary)
1左边界: "id":说明:目标数据的左侧边界。
右边界(Right Boundary)
1右边界: ,说明:目标数据的右侧边界。
匹配数字(Match No.)
1匹配数字: 1说明:指定匹配第几个结果。
默认值(Default Value)
1默认值: -1说明:当边界匹配不到结果时使用的默认值。
5.4 使用场景
提取JSON字段值
1{"id": 123, "name": "test"}1引用名称: id
2左边界: "id":
3右边界: ,结果:${id} = 123
提取HTML标签内容
1<span class="price">¥99.9</span>1引用名称: price
2左边界: <span class="price">
3右边界: </span>结果:${price} = ¥99.9
六、JSR223后置处理器
6.1 添加JSR223后置处理器
1右键点击采样器 → Add → Post Processors → JSR223 PostProcessor6.2 配置
1名称: 处理响应数据
2脚本语言: groovy
3脚本:
4 // 获取响应数据
5 def response = prev.getResponseDataAsString()
6
7 // 解析JSON
8 def json = new groovy.json.JsonSlurper().parseText(response)
9
10 // 提取字段
11 def userId = json.data.id
12 def userName = json.data.name
13
14 // 设置变量
15 vars.put("user_id", userId.toString())
16 vars.put("user_name", userName)
17
18 // 打印日志
19 log.info("Extracted user_id: ${userId}")
20 log.info("Extracted user_name: ${userName}")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() |
| prev | 前一个采样器的结果对象 | prev.getResponseDataAsString(), prev.getResponseCode() |
6.5 使用场景
复杂数据提取和处理
1// 获取响应数据
2def response = prev.getResponseDataAsString()
3
4// 解析JSON
5def json = new groovy.json.JsonSlurper().parseText(response)
6
7// 处理数据
8def items = json.data.items
9def totalPrice = items.sum { it.price }
10
11// 设置变量
12vars.put("total_price", totalPrice.toString())
13vars.put("item_count", items.size().toString())
14
15// 打印日志
16log.info("Total price: ${totalPrice}")
17log.info("Item count: ${items.size()}")修改响应数据
1// 修改响应数据
2def modifiedResponse = prev.getResponseDataAsString().replace("old", "new")
3prev.setResponseData(modifiedResponse.getBytes())自定义断言逻辑
1// 检查响应码
2if (prev.getResponseCode() != "200") {
3 log.error("Response code is not 200: ${prev.getResponseCode()}")
4 prev.setSuccessful(false)
5}
6
7// 检查响应时间
8if (prev.getTime() > 5000) {
9 log.warn("Response time exceeds 5 seconds: ${prev.getTime()}ms")
10}七、BeanShell后置处理器
7.1 添加BeanShell后置处理器
1右键点击采样器 → Add → Post Processors → BeanShell PostProcessor7.2 配置
1名称: BeanShell后处理
2脚本:
3 // 获取响应数据
4 String response = prev.getResponseDataAsString();
5
6 // 设置变量
7 vars.put("response_data", response);
8
9 // 打印日志
10 log.info("Response: " + response);7.3 使用场景
注意:推荐使用JSR223后置处理器(Groovy语言),性能比BeanShell好。
八、JDBC后置处理器
8.1 添加JDBC后置处理器
1右键点击采样器 → Add → Post Processors → JDBC PostProcessor8.2 配置
1名称: JDBC后处理
2变量名: mysql_db
3查询类型: Update Statement
4查询语句: INSERT INTO audit_log (request_id, response_code) VALUES ('${request_id}', '${response_code}');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在收到响应后,记录请求日志到数据库。九、调试后置处理器
9.1 添加调试后置处理器
1右键点击采样器 → Add → Post Processors → Debug PostProcessor9.2 配置
1名称: 调试变量
2显示JMeter变量: true
3显示系统属性: false
4显示环境变量: false9.3 参数说明
显示JMeter变量(Display JMeter Variables)
1勾选: 显示JMeter变量说明:如果勾选,在查看结果树中显示所有JMeter变量的值。
显示系统属性(Display JMeter Properties)
1勾选: 显示系统属性说明:如果勾选,在查看结果树中显示所有JMeter系统属性。
显示环境变量(Display Environment Variables)
1勾选: 显示环境变量说明:如果勾选,在查看结果树中显示所有环境变量。
9.4 使用场景
1调试测试脚本,查看变量值是否正确。十、实战案例
10.1 案例1:接口关联测试
需求:测试用户登录后访问个人信息接口
配置步骤:
创建线程组(10线程,循环1次)
添加HTTP请求(登录接口):
1方法: POST
2路径: /api/login
3Body Data:
4 {
5 "username": "test",
6 "password": "123456"
7 }- 添加JSON提取器(提取Token):
1引用名称: token
2JSON路径表达式: $.data.token
3匹配数字: 1
4默认值: - 添加HTTP信息头管理器:
1名称: Authorization
2值: Bearer ${token}- 添加HTTP请求(获取个人信息):
1方法: GET
2路径: /api/user/profile添加查看结果树
运行测试
10.2 案例2:复杂数据提取
需求:从JSON响应中提取多个字段
配置步骤:
创建线程组(10线程,循环1次)
添加HTTP请求(获取用户列表):
1方法: GET
2路径: /api/users?page=1&size=10- 添加JSR223后置处理器:
1// 获取响应数据
2def response = prev.getResponseDataAsString()
3
4// 解析JSON
5def json = new groovy.json.JsonSlurper().parseText(response)
6
7// 提取第一个用户的信息
8def firstUser = json.data.list[0]
9vars.put("first_user_id", firstUser.id.toString())
10vars.put("first_user_name", firstUser.name)
11vars.put("first_user_email", firstUser.email)
12
13// 计算用户总数
14def totalCount = json.data.total
15vars.put("total_count", totalCount.toString())
16
17// 提取所有用户ID
18def userIds = json.data.list.collect { it.id }.join(",")
19vars.put("all_user_ids", userIds)
20
21// 打印日志
22log.info("First user: ${firstUser.name}")
23log.info("Total users: ${totalCount}")添加查看结果树
添加调试后置处理器
运行测试
10.3 案例3:数据库记录日志
需求:将每次请求的日志记录到数据库
配置步骤:
创建线程组(100线程,循环10次)
添加JDBC连接配置:
1变量名: mysql_db
2JDBC驱动类: com.mysql.cj.jdbc.Driver
3JDBC URL: jdbc:mysql://localhost:3306/test
4用户名: root
5密码: password- 添加JSR223前置处理器(生成请求ID):
1def requestId = UUID.randomUUID().toString()
2vars.put("request_id", requestId)
3vars.put("request_time", System.currentTimeMillis().toString())- 添加HTTP请求(测试接口):
1方法: GET
2路径: /api/test- 添加JDBC后置处理器(记录日志):
1变量名: mysql_db
2查询类型: Update Statement
3查询语句: INSERT INTO request_log (request_id, url, method, response_code, response_time, start_time, end_time) VALUES ('${request_id}', '${sampler.getPath()}', '${sampler.getMethod()}', '${response_code}', '${response_time}', '${request_time}', '${__time(yyyy-MM-dd HH:mm:ss)}');添加聚合报告
运行测试
十一、常见问题
11.1 后置处理器不执行
回答:
- 前置处理器只有在采样器执行成功后才会执行
- 检查采样器是否执行成功
- 检查后置处理器的作用域是否正确
11.2 JSON提取器提取不到数据
回答:
- 检查JSON路径表达式是否正确
- 检查响应是否为有效的JSON格式
- 检查匹配数字是否正确
- 使用调试后置处理器查看响应内容
11.3 正则表达式提取器提取不到数据
回答:
- 检查正则表达式是否正确
- 检查响应内容是否匹配正则表达式
- 使用在线正则表达式测试工具验证
11.4 如何在后置处理器中获取请求参数
回答:使用sampler对象:
1def params = sampler.getArguments()
2def username = params.getArgument("username").getValue()下一章:08-配置元件详解.md
- 01JMeter界面详解 2026-07-11
- 02性能测试学习路线 2026-07-11
- 03JMeter线程组配置详解 2026-07-11