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

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 Extractor

2.2 配置

1名称: 提取用户ID
2引用名称: user_id
3JSON路径表达式: $.data.id
4匹配数字: 1
5默认值: -1

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

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

4.2 配置

1名称: 提取用户名
2引用名称: username
3XPath表达式: //user/name/text()
4匹配数字: 1
5默认值: unknown

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

5.2 配置

1名称: 提取ID
2引用名称: id
3左边界: "id":
4右边界: ,
5匹配数字: 1
6默认值: -1

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

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

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

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

8.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 PostProcessor

9.2 配置

1名称: 调试变量
2显示JMeter变量: true
3显示系统属性: false
4显示环境变量: false

9.3 参数说明

显示JMeter变量(Display JMeter Variables)

1勾选: 显示JMeter变量

说明:如果勾选,在查看结果树中显示所有JMeter变量的值。

显示系统属性(Display JMeter Properties)

1勾选: 显示系统属性

说明:如果勾选,在查看结果树中显示所有JMeter系统属性。

显示环境变量(Display Environment Variables)

1勾选: 显示环境变量

说明:如果勾选,在查看结果树中显示所有环境变量。

9.4 使用场景

1调试测试脚本,查看变量值是否正确。

十、实战案例

10.1 案例1:接口关联测试

需求:测试用户登录后访问个人信息接口

配置步骤

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

  2. 添加HTTP请求(登录接口):

1方法: POST
2路径: /api/login
3Body Data:
4    {
5        "username": "test",
6        "password": "123456"
7    }
  1. 添加JSON提取器(提取Token):
1引用名称: token
2JSON路径表达式: $.data.token
3匹配数字: 1
4默认值: 
  1. 添加HTTP信息头管理器:
1名称: Authorization
2值: Bearer ${token}
  1. 添加HTTP请求(获取个人信息):
1方法: GET
2路径: /api/user/profile
  1. 添加查看结果树

  2. 运行测试

10.2 案例2:复杂数据提取

需求:从JSON响应中提取多个字段

配置步骤

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

  2. 添加HTTP请求(获取用户列表):

1方法: GET
2路径: /api/users?page=1&size=10
  1. 添加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}")
  1. 添加查看结果树

  2. 添加调试后置处理器

  3. 运行测试

10.3 案例3:数据库记录日志

需求:将每次请求的日志记录到数据库

配置步骤

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

  2. 添加JDBC连接配置:

1变量名: mysql_db
2JDBC驱动类: com.mysql.cj.jdbc.Driver
3JDBC URL: jdbc:mysql://localhost:3306/test
4用户名: root
5密码: password
  1. 添加JSR223前置处理器(生成请求ID):
1def requestId = UUID.randomUUID().toString()
2vars.put("request_id", requestId)
3vars.put("request_time", System.currentTimeMillis().toString())
  1. 添加HTTP请求(测试接口):
1方法: GET
2路径: /api/test
  1. 添加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)}');
  1. 添加聚合报告

  2. 运行测试

十一、常见问题

11.1 后置处理器不执行

回答

  • 前置处理器只有在采样器执行成功后才会执行
  • 检查采样器是否执行成功
  • 检查后置处理器的作用域是否正确

11.2 JSON提取器提取不到数据

回答

  • 检查JSON路径表达式是否正确
  • 检查响应是否为有效的JSON格式
  • 检查匹配数字是否正确
  • 使用调试后置处理器查看响应内容

11.3 正则表达式提取器提取不到数据

回答

  • 检查正则表达式是否正确
  • 检查响应内容是否匹配正则表达式
  • 使用在线正则表达式测试工具验证

11.4 如何在后置处理器中获取请求参数

回答:使用sampler对象:

1def params = sampler.getArguments()
2def username = params.getArgument("username").getValue()

下一章08-配置元件详解.md

最新文章

本页导航