接口测试:JMeter(三)

news/2025/11/29 20:21:46/文章来源:https://www.cnblogs.com/GDmsBKY/p/19287373

JSON提取器和正则提取器

非常好!JSON 提取器正则表达式提取器 是 JMeter 中最重要、最常用的两个后置处理器,用于关联(Correlation)—— 即从服务器响应中提取数据,供后续请求使用。

核心概念

  • 作用:都是从采样器的响应结果中提取特定数据,并保存为变量。
  • 位置:必须作为后置处理器,放在某个采样器下面。
  • 执行时机:在采样器收到服务器响应后、下一个采样器执行前。

JSON 提取器

专门用于从 JSON 格式的响应中提取数据,语法简单直观,是处理 JSON 响应时的首选

适用场景

  • REST API 返回 JSON 格式数据
  • 需要提取 token、用户ID、订单号等字段值

配置界面详解

字段 说明 示例
Name of created variables 创建的变量名 userId
JSON Path expressions JSONPath 表达式 $.data.userId
Match No. (0 for Random) 匹配序号(0=随机,-1=所有) 1
Compute concatenation var 是否创建拼接变量 false
Default Values 提取失败时的默认值 NOT_FOUND

常用 JSONPath 表达式示例

假设响应体为:

{"status": "success","data": {"user": {"id": 12345,"name": "张三","email": "zhangsan@example.com"},"tokens": {"accessToken": "abc123xyz","refreshToken": "refresh456"}},"items": [{"id": 1, "name": "item1"},{"id": 2, "name": "item2"}]
}
要提取的值 JSONPath 表达式 结果
状态码 $.status success
用户ID $.data.user.id 12345
访问令牌 $.data.tokens.accessToken abc123xyz
第一个物品名称 $.items[0].name item1
所有物品ID $.items[*].id [1, 2]
如果返回的就是一个list $[0].userId$.[0].userId

使用提取的变量

在后续请求中,用 ${变量名}格式引用:

  • 在 HTTP 请求的 ParametersBody Data 中:"token": "${accessToken}"
  • Path 中:/api/users/${userId}/profile

正则表达式提取器

功能更强大,可以从任何文本格式(JSON、HTML、XML、纯文本)的响应中提取数据,但语法相对复杂。

适用场景

  • 响应格式不是标准 JSON
  • 需要从 HTML 页面提取数据(如 CSRF token)
  • 复杂的文本模式匹配

配置界面详解

字段 说明 示例
引用名称 创建的变量名 csrf_token
正则表达式 匹配模式 "token":"(.+?)"
模板 提取组号的组合 $1$
匹配数字 匹配序号(0=随机,-1=所有) 1
缺省值 提取失败时的默认值 EXTRACTION_FAILED

正则表达式语法详解

基本元字符

  • (.+?)最常用!非贪婪匹配,提取任意字符
  • (\d+):匹配一个或多个数字
  • ([a-zA-Z0-9]+):匹配字母和数字

实际示例

示例1:从 JSON 中提取

{"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9", "expires_in": 3600}
  • 正则表达式"access_token":"(.+?)"
  • 模板$1$
  • 结果eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

示例2:从 HTML 中提取 CSRF Token

<input type="hidden" name="_csrf" value="a1b2c3d4-e5f6-7890">
  • 正则表达式name="_csrf" value="(.+?)"
  • 模板$1$
  • 结果a1b2c3d4-e5f6-7890

示例3:匹配多组数据

User: John (ID: 123), Department: Engineering
  • 正则表达式User: (.+?) \(ID: (\d+)\), Department: (.+?)
  • 模板$1$::$2$::$3$
  • 结果John::123::Engineering(可用分割符进一步处理)

匹配数字的特殊用法

含义 变量生成
1 提取第一个匹配项 token=abc123
0 随机匹配一个 token=随机值
-1 匹配所有项 token_1=abc, token_2=def, token_matchNr=2

两者对比与选择指南

特性 JSON 提取器 正则表达式提取器
易用性 ⭐⭐⭐⭐⭐(简单直观) ⭐⭐⭐(需要正则知识)
可读性 ⭐⭐⭐⭐⭐(清晰明了) ⭐⭐(难以阅读)
性能 ⭐⭐⭐⭐(较快) ⭐⭐⭐(相对较慢)
灵活性 ⭐⭐⭐(仅限JSON) ⭐⭐⭐⭐⭐(任何文本)
准确性 ⭐⭐⭐⭐⭐(结构准确) ⭐⭐⭐(可能误匹配)

选择建议

优先使用 JSON 提取器,当且仅当:

  • ✅ 响应是标准 JSON 格式
  • ✅ 需要提取的字段有清晰的 JSON 结构

只能使用正则表达式提取器,当:

  • ❌ 响应是 HTML、XML 或其他非 JSON 格式
  • ❌ JSON 结构不规则或需要复杂匹配逻辑
  • ❌ 需要跨行匹配或复杂文本模式

实战调试技巧

  1. 先用查看结果树验证响应内容
    • 运行请求,在"查看结果树"中确认响应数据格式和内容
  2. 测试提取表达式
    • 使用在线工具测试:
      • JSONPath 测试器:https://jsonpath.com/
      • 正则表达式测试器:https://regex101.com/
  3. 使用 Debug Sampler 查看变量值
    • 添加 → 取样器 → Debug Sampler
    • 运行后查看"查看结果树"中的变量值
  4. 添加断言验证提取结果
    • 用响应断言检查 ${yourVariable}是否包含预期值

黄金法则:如果响应是 JSON,永远优先选择 JSON 提取器!

JSON提取器提取变量的作用范围和对应请求的顺序

非常好!这个问题涉及到 JMeter 执行顺序和作用域的核心机制。理解这一点对于构建正确的测试逻辑至关重要。

核心结论:作用域与执行顺序

JSON 提取器提取的变量作用范围 = 它所在分支的后续所有元件

执行顺序 = 严格按照元件在测试树中的位置顺序


1. 作用域规则详解

JSON 提取器的作用域遵循 JMeter 的父级-子级关系原则

规则说明表

JSON 提取器位置 变量作用范围(哪些请求能使用变量) 示例说明
HTTP 请求 A 的子级 仅对 同一个父节点下的后续兄弟元件 及其子元件有效 请求A → JSON提取器 → 请求B(B能用到变量)
逻辑控制器 的子级 对该逻辑控制器内部的所有后续元件有效 事务控制器 → [请求A → JSON提取器 → 请求B](B能用到)
线程组 的子级 对该线程组内的所有后续元件有效 线程组 → [JSON提取器 → 所有请求](所有请求都能用到)

视觉化示例

测试计划
├── 线程组
│   ├── HTTP 请求 A (登录)
│   │   └── JSON 提取器 (提取 token)     # 变量:authToken
│   ├── HTTP 请求 B (查询用户信息)        # ✅ 能使用 ${authToken}
│   ├── 仅一次控制器
│   │   ├── HTTP 请求 C (获取配置)        # ✅ 能使用 ${authToken}
│   │   └── JSON 提取器 (提取 configId)  # 变量:configId
│   └── HTTP 请求 D (其他操作)            # ✅ 能使用 ${authToken} 和 ${configId}
├── 线程组 2
│   └── HTTP 请求 E (独立操作)            # ❌ 不能使用 ${authToken} (不同线程组)
└── HTTP 请求 F (测试计划下)              # ❌ 不能使用 ${authToken} (位置不对)

2. 执行顺序规则详解

JMeter 的执行是深度优先的,严格按照测试树中元件的物理位置顺序

执行顺序优先级

  1. 同一层级:从上到下顺序执行
  2. 不同层级:先执行父元件,然后递归执行子元件
  3. 后置处理器:在所属采样器收到响应后立即执行

执行顺序示例分析

线程组
├── HTTP 请求 1 (登录)
│   └── JSON 提取器 A (提取 token)
├── HTTP 请求 2 (查询)
│   └── JSON 提取器 B (提取用户ID)
├── 如果控制器 (条件: ${userID} != null)
│   └── HTTP 请求 3 (更新用户)           # 依赖 userID 变量
└── HTTP 请求 4 (注销)

执行顺序和时间线:

时间点 执行动作 变量状态
T1 执行 HTTP 请求 1(登录) -
T2 执行 JSON 提取器 A 创建变量 token=abc123
T3 执行 HTTP 请求 2(查询) 使用 ${token}
T4 执行 JSON 提取器 B 创建变量 userID=1001
T5 评估 如果控制器条件 ${userID}已存在,条件为真
T6 执行 HTTP 请求 3(更新) 使用 ${token}${userID}
T7 执行 HTTP 请求 4(注销) 使用 ${token}

3. 常见场景与解决方案

场景一:登录后多个请求使用 Token

问题:登录接口返回 token,后续多个 API 都需要在 header 中使用。

正确做法

线程组
├── HTTP 请求 登录
│   └── JSON 提取器 (提取: authToken)
├── HTTP 信息头管理器 (添加: Authorization: Bearer ${authToken})
├── HTTP 请求 获取用户信息    ✅ 能使用 token
├── HTTP 请求 查询订单       ✅ 能使用 token
└── HTTP 请求 退出登录       ✅ 能使用 token

场景二:依赖多个顺序接口的变量

问题:接口B需要接口A返回的数据,接口C需要接口B返回的数据。

正确做法

线程组
├── HTTP 请求 A (创建订单)
│   └── JSON 提取器 A (提取: orderId)
├── HTTP 请求 B (支付订单,使用: ${orderId})
│   └── JSON 提取器 B (提取: paymentId)
└── HTTP 请求 C (查询支付状态,使用: ${paymentId})

场景三:同一层级多个提取器的变量覆盖

问题:同一个请求下有多个 JSON 提取器,变量名相同怎么办?

HTTP 请求
├── JSON 提取器 1 (变量: resultCode, 值: 200)
└── JSON 提取器 2 (变量: resultCode, 值: SUCCESS)

结果:后面的提取器会覆盖前面的,${resultCode}的最终值为 SUCCESS


4. 重要注意事项与最佳实践

变量生命周期

  • 作用域内有效:变量在作用域内一直有效,除非被重新赋值
  • 线程隔离:每个线程有自己独立的变量副本,互不干扰
  • 循环有效:在循环控制器内,变量每次循环都会重新提取和覆盖

调试技巧

  1. 使用 Debug Sampler 查看变量值:

    HTTP 请求
    └── JSON 提取器
    └── Debug Sampler (查看提取的变量值)
    
  2. 使用 BeanShell 后置处理器 打印变量:

    log.info("提取的token值: " + vars.get("authToken"));
    
  3. 在查看结果树中观察

    • 检查每个请求的变量值是否正确传递

最佳实践

  1. 变量命名要有意义:使用 apiTokenuserId而不是 var1var2
  2. 提取器紧挨着采样器:将 JSON 提取器直接放在对应的 HTTP 请求下面
  3. 设置默认值:在 JSON 提取器中设置合理的默认值,避免提取失败时脚本异常
  4. 作用域最小化:不要将提取器放在过高的层级,避免变量污染

错误示例分析

线程组
├── JSON 提取器 (试图提取token,但前面没有请求!) ❌ 错误!
├── HTTP 请求 登录
└── HTTP 请求 查询

错误原因:JSON 提取器在登录请求之前执行,此时还没有响应数据可供提取。

正确做法:始终将后置处理器放在采样器下面,确保执行顺序正确。


总结

方面 规则 实践建议
作用域 影响同一父节点下的所有后续元件 将相关请求组织在同一逻辑控制器下
执行顺序 深度优先,从上到下,父先子后 合理安排请求顺序,确保依赖关系正确
变量生命周期 作用域内有效,线程隔离 注意循环中的变量覆盖问题
调试 使用 Debug Sampler 和日志 每个提取步骤后验证变量值

掌握这些规则,你就能精准控制 JMeter 中的变量传递和执行流程!

团队协作

测试片段

这是一个非常重要的 JMeter 高级功能,特别是在处理复杂场景和团队协作时。

测试片段的核心作用

测试片段的核心作用可以概括为:实现 JMeter 脚本的模块化、复用和组件化,提升可维护性和协作效率。

它的作用类似于编程中的函数方法,或者建筑中的预制构件


一、主要作用详解

1. 模块化(代码组织)

作用:将大型、复杂的测试脚本分解为小型、功能单一的独立模块。

示例

一个完整的电商测试脚本可以被拆分为:

📁 完整测试计划 (难以维护)
└── 50个HTTP请求混杂在一起✅ 拆分为测试片段后:
📁 登录模块 (login.jmx)
📁 商品搜索模块 (search.jmx)  
📁 购物车模块 (cart.jmx)
📁 订单模块 (order.jmx)
📁 主组装脚本 (main.jmx)

2. 代码复用(避免重复)

作用:消除重复代码,实现"一次编写,多处使用"。

实际场景

  • "用户登录"功能在10个测试场景中都需要
  • 如果不使用测试片段:需要复制粘贴10次登录相关的请求
  • 使用测试片段:只维护一个登录片段,10个场景都调用它

效果:当登录接口变更时,只需修改一个文件,所有调用处自动更新。

3. 团队协作开发

作用:实现多人并行开发,解决版本冲突。

团队分工示例

👨‍💻 开发人员A:专门维护认证相关片段└── login.jmx, logout.jmx, token-refresh.jmx👩‍💻 开发人员B:专门维护商品相关片段  └── search.jmx, detail.jmx, category.jmx👨‍💻 开发人员C:专门维护订单相关片段└── create-order.jmx, pay-order.jmx, query-order.jmx👩‍💼 测试负责人:组装完整测试流程└── main-scenario.jmx (引用所有片段)

4. 版本控制和质量管理

作用:便于代码审查、版本管理和质量管控。

优势

  • 小文件更易审查:审查一个50行的片段比审查500行的完整脚本容易得多
  • 精准的版本记录:可以清晰看到"登录模块在v1.2版本进行了安全加固"
  • 独立的测试验证:每个片段可以单独测试验证,确保质量

5. 参数化接口测试

作用:创建可配置的、灵活的测试组件。

示例:创建一个参数化的搜索片段

// 搜索片段接受参数:
- keyword:搜索关键词
- category:商品分类  
- sort:排序方式// 不同调用场景:
1. 主计划A:调用搜索片段(keyword="手机", category="electronics")
2. 主计划B:调用搜索片段(keyword="笔记本电脑", category="computers")
3. 性能测试:调用搜索片段(keyword="${随机关键词}", category="all")

二、实际应用场景

场景1:微服务架构的测试

适合情况:系统由多个微服务组成,每个团队负责不同服务。

测试片段库/
├── 用户服务片段/
│   ├── user-login.jmx
│   ├── user-register.jmx
│   └── user-profile.jmx
├── 商品服务片段/
│   ├── product-search.jmx
│   ├── product-detail.jmx
│   └── product-category.jmx
├── 订单服务片段/
│   ├── order-create.jmx
│   ├── order-pay.jmx
│   └── order-query.jmx
└── 主集成测试/├── 完整业务流程.jmx (组合所有片段)└── 性能场景.jmx

场景2:不同环境的适配测试

适合情况:需要为开发、测试、预生产环境创建不同的测试组合。

环境适配测试/
├── 通用业务片段/ (所有环境共用)
│   ├── 登录片段.jmx
│   └── 基础操作片段.jmx
├── 开发环境测试/
│   └── 开发环境主计划.jmx (引用通用片段+开发专用片段)
├── 测试环境测试/
│   └── 测试环境主计划.jmx (引用通用片段+测试专用片段)
└── 生产环境监控/└── 生产监控主计划.jmx (引用通用片段+生产监控片段)

场景3:数据驱动测试

适合情况:同样的业务流程需要用不同的测试数据执行。

数据驱动测试/
├── 业务流程片段.jmx (通用的业务逻辑)
├── 测试数据/
│   ├── 正常流程数据.csv
│   ├── 边界值数据.csv
│   └── 异常数据.csv
└── 不同数据场景/├── 正常流程测试.jmx (引用片段+正常数据)├── 边界值测试.jmx (引用片段+边界数据)└── 异常测试.jmx (引用片段+异常数据)

三、测试片段 vs 传统单一脚本

对比分析表

方面 传统单一脚本 测试片段架构 优势
可维护性 ❌ 修改一处需要全文搜索 ✅ 修改模块,全局生效 易于维护
协作性 ❌ 多人编辑易冲突 ✅ 每人负责不同模块 便于协作
复用性 ❌ 大量复制粘贴 ✅ 真正意义上的复用 代码复用
可读性 ❌ 巨型文件难理解 ✅ 模块化,结构清晰 易于理解
测试性 ❌ 只能整体测试 ✅ 每个模块可单独测试 易于测试
版本控制 ❌ 大文件diff困难 ✅ 小文件,变更清晰 易于管理

四、最佳实践建议

何时使用测试片段?

  • 团队规模 ≥ 2人
  • 脚本规模 ≥ 10个HTTP请求
  • 有可复用的业务流程
  • 项目需要长期维护
  • 需要支持多环境、多场景

何时不需要?

  • ❌ 单人临时性测试
  • ❌ 简单的单接口验证
  • ❌ 一次性测试任务

设计原则

  1. 单一职责:每个片段只负责一个明确的业务功能
  2. 高内聚低耦合:片段内部紧密相关,片段之间依赖明确
  3. 参数化设计:通过变量接受参数,提高灵活性
  4. 文档完善:为每个片段编写使用说明和接口文档

总结

测试片段的核心作用可以总结为以下五大价值

  1. 🏗️ 模块化 - 将复杂脚本拆分为可管理的模块
  2. 🔄 可复用 - 避免重复代码,提高开发效率
  3. 👥 便协作 - 支持团队并行开发
  4. 📊 易维护 - 变更影响局部化,降低维护成本
  5. 🎯 高质量 - 便于代码审查和单元测试

简单来说,测试片段让 JMeter 脚本从"脚本"升级为"工程",是 JMeter 进阶使用的标志性功能。 当你和团队需要处理复杂、长期的性能测试项目时,测试片段是必不可少的工具。

常用的断言方式

好的,JMeter 提供了多种断言(Assertion)来验证服务器响应是否符合预期。以下是最常用的断言形式,按使用频率和重要性排序。


1. 响应断言 - 最常用、最通用

这是使用最广泛的断言,可以检查响应内容、响应代码、响应消息等。

适用场景:几乎任何需要验证的场合。

配置要点

  • 要测试的响应字段
    • 响应文本:检查响应正文(HTML, JSON, XML等)。
    • 响应代码:检查 HTTP 状态码(如 200, 404, 500)。
    • 响应信息:检查 HTTP 状态消息(如 OK, Not Found)。
    • Response Headers:检查响应头信息。
  • 模式匹配规则
    • 包含/匹配:响应中是否包含或完全匹配指定文本(支持正则表达式)。
    • Equals/Substring:字符串相等或子字符串匹配(不支持正则)。
    • :对检查结果取反。

常用示例

  • 验证登录成功(JSON响应):响应文本``包含``"success": true
  • 验证页面标题(HTML响应):响应文本``包含``<title>首页</title>
  • 验证HTTP状态码响应代码``等于``200
  • 验证操作失败响应代码``等于``400

2. JSON 断言 - 专用于JSON响应

当响应是JSON格式时,这是比响应断言更强大、更精确的选择。

适用场景:REST API 返回 JSON 格式数据。

配置要点

  • JSON Path expressions:填写JSONPath表达式来定位需要断言的字段(如 $.success, $.data.userId)。
  • Additional options
    • Validate against expected value:期望值,如 true, 100等。
    • Match as regular expression:期望值是否为正则表达式。

常用示例

  • 验证接口返回状态:JSONPath = $.success, 期望值 = true
  • 验证用户ID数据类型:JSONPath = $.data.id, 期望值 = \d+(正则,表示数字)
  • 验证数组长度:JSONPath = $.data.items.length(), 期望值 = 10

3. 持续时间断言 - 性能指标断言

用于验证响应时间是否在可接受的阈值内。

适用场景:性能测试中,确保接口响应时间不超过某个标准。

配置要点

  • Duration in milliseconds:设置允许的最大响应时间(毫秒)。

常用示例

  • 设置所有关键API的响应时间上限为 2 秒:Duration= 2000
    • 如果某个请求耗时超过2000毫秒,则该请求被标记为失败。

4. 大小断言 - 检查响应体大小

用于验证响应数据的大小是否符合预期。

适用场景:防止接口返回过大的冗余数据,或验证下载文件的大小。

配置要点

  • Size to assert:设置响应内容大小的阈值(字节)。
  • Type of comparison:选择比较类型(等于、大于、小于等)。

常用示例

  • 验证头像图片大小约为50KB:Size= 51200(字节),Type= 等于(可有一定容忍度)。

断言的最佳实践和技巧

  1. 精准断言:断言内容要足够具体,避免误判。

    • 不好:断言 响应文本``包含``success(字符串 "success" 可能出现在很多地方)。
    • :断言 响应文本``包含``"status": "success"或使用 JSON断言
  2. 将断言作为子元素:将断言添加为某个HTTP请求的子元素,这样它只检查该请求的响应。如果添加到线程组级别,则会检查该线程组下的所有请求。

  3. 合理使用“或”逻辑:有时一个请求可能有多种成功响应(如返回200或201都算成功)。可以在响应断言的模式中添加多行:

    模式:
    200
    201
    

    (规则选择匹配,相当于200 OR 201

  4. 性能考虑:断言会消耗一定的资源。在高并发负载测试时,确保断言的模式匹配不会过于复杂。可以考虑在调试阶段使用复杂断言,在正式压测时使用简单的状态码断言或去掉断言。

  5. 结合响应状态:即使有内容断言,也强烈建议同时添加一个基础的响应断言来检查HTTP状态码是否为20x(成功)。这可以快速捕获明显的错误。

总结:如何选择?

你的需求 推荐的断言
通用检查(文本、状态码、响应头) 响应断言
精确检查JSON响应中的特定字段 JSON 断言
确保接口响应速度够快 持续时间断言
检查响应数据量大小 大小断言
检查XML格式响应 XPath断言(未列出,用法类似JSON断言)

对于大多数API测试场景,响应断言JSON断言的组合已经可以覆盖95%以上的需求。

数据库断言

MySQL的JDBC连接配置

获取 JDBC 连接的 JAR 包有多种方式,具体取决于你要连接的数据库类型。下面是最常用的几种方法:


一、根据数据库类型选择对应的驱动

数据库类型 JDBC 驱动 JAR 包名称 官方下载地址
MySQL mysql-connector-java-x.x.x.jar MySQL Connector/J
Oracle ojdbcx.x.jar Oracle JDBC Driver
SQL Server mssql-jdbc-x.x.x.jrex.jar Microsoft JDBC Driver
PostgreSQL postgresql-x.x-xxx.jrex.jar PostgreSQL JDBC Driver
SQLite sqlite-jdbc-x.x.x.jar SQLite JDBC Driver

二、具体获取方法

方法1:直接从官网下载(推荐 ✅)

这是最安全、最可靠的方式。

以 MySQL 为例的详细步骤:

  1. 访问 MySQL 官网
    • 打开:MySQL Connector/J 下载页面
  2. 选择版本
    • 选择 Platform Independent(平台无关)
    • 点击下载压缩包格式(如:mysql-connector-j-8.0.33.zip
  3. 解压获取 JAR 文件
    • 解压下载的 zip 文件
    • 找到其中的 .jar文件(如:mysql-connector-j-8.0.33.jar

其他数据库类似,都是到各自的官方网站下载。


方法2:使用 Maven 仓库下载

如果你熟悉 Maven,可以从 Maven 中央仓库直接下载。

访问 Maven 仓库网站:

  • 网址:https://mvnrepository.com/

搜索步骤:

  1. 在搜索框输入你的数据库驱动名称,如:mysql connector java
  2. 选择正确的版本
  3. 点击版本号进入详情页
  4. 点击 "Files" 标签页
  5. 直接下载 .jar文件

常用数据库的 Maven 坐标:

<!-- MySQL -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency><!-- PostgreSQL -->
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.6.0</version>
</dependency><!-- SQL Server -->
<dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><version>12.4.1.jre11</version>
</dependency><!-- Oracle -->
<dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId><version>21.9.0.0</version>
</dependency>

方法3:从本地数据库安装目录获取

如果你的电脑上已经安装了相应的数据库软件,驱动 JAR 包可能已经存在。

常见位置:

  • MySQL:安装目录下的 lib文件夹
  • Oracle:安装目录下的 jdbc/lib文件夹
  • SQL Server:安装目录或 Visual Studio 相关路径

三、JAR 包放置位置

下载到 JAR 包后,需要将其放入 JMeter 的类路径中。

推荐位置:

  1. JMeter 的 lib目录(首选 ✅)
    • 路径:{JMETER_HOME}/lib/
    • 例如:C:\apache-jmeter-5.6\lib\mysql-connector-java-8.0.33.jar
  2. JMeter 的 lib/ext目录
    • 路径:{JMETER_HOME}/lib/ext/

操作步骤:

  1. 找到你的 JMeter 安装目录
  2. 进入 lib文件夹
  3. 将下载的 JDBC 驱动 JAR 包复制到此目录
  4. 重启 JMeter(重要!)

四、验证安装是否成功

方法1:在 JMeter 中查看

  1. 打开 JMeter
  2. 在测试计划中添加 配置元件 → JDBC 连接配置
  3. 点击 JDBC Driver class 的下拉箭头
  4. 如果能看到你的数据库驱动类,说明安装成功

方法2:查看 JMeter 日志

启动 JMeter 时观察日志,应该能看到类似信息:

... Loaded JDBC driver: com.mysql.cj.jdbc.Driver

五、常见数据库驱动类名和 URL 格式

数据库 驱动类名 JDBC URL 格式
MySQL com.mysql.cj.jdbc.Driver jdbc:mysql://主机:端口/数据库名
Oracle oracle.jdbc.OracleDriver jdbc:oracle:thin:@主机:端口:实例名
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://主机:端口;databaseName=数据库名
PostgreSQL org.postgresql.Driver jdbc:postgresql://主机:端口/数据库名
SQLite org.sqlite.JDBC jdbc:sqlite:数据库文件路径

六、实战示例:MySQL 连接配置

1. 下载并放置 JAR 包

  • 从 MySQL 官网下载 mysql-connector-java-8.0.33.jar
  • 复制到 {JMETER_HOME}/lib/目录
  • 重启 JMeter

2. 配置 JDBC 连接

测试计划
└── JDBC 连接配置├── 变量名: myDB├── 数据库URL: jdbc:mysql://localhost:3306/test_db├── JDBC Driver class: com.mysql.cj.jdbc.Driver├── 用户名: your_username└── 密码: your_password

3. 添加 JDBC 请求

线程组
└── JDBC 请求├── 变量名: myDB (与连接配置一致)├── SQL 查询: SELECT * FROM users WHERE id = ?└── 参数值: 1001

七、常见问题解决

❌ 问题1:找不到合适的驱动类

错误信息Cannot load JDBC driver class 'com.mysql.cj.jdbc.Driver'

解决方案

  • 确认 JAR 包已放入 lib目录
  • 确认 JAR 包版本与驱动类名匹配
  • 重启 JMeter

❌ 问题2:驱动版本不兼容

错误信息No suitable driver found

解决方案

  • 下载与你的数据库版本兼容的驱动
  • 检查 JDBC URL 格式是否正确

❌ 问题3:JAR 包冲突

错误信息ClassNotFoundException或版本冲突

解决方案

  • 删除 lib目录中重复或旧版本的 JAR 包
  • 只保留一个版本的驱动

总结

获取 JDBC 驱动 JAR 包的最佳实践

  1. ✅ 优先从数据库官网下载 - 最安全可靠
  2. ✅ 放置到 JMeter 的 lib目录 - 确保 JMeter 能识别
  3. ✅ 重启 JMeter - 使驱动生效
  4. ✅ 验证配置 - 在 JDBC 连接配置中检查驱动类

记住:不同的数据库需要不同的驱动 JAR 包,选择与你的数据库类型和版本匹配的驱动。

新建JDBC Connection Configration

好的,JDBC Connection Configuration 是 JMeter 中用于配置数据库连接的核心元件。下面详细讲解它的配置方法和最佳实践。


一、位置和作用

位置

  • 右键点击测试计划或线程组
  • 添加 → 配置元件 → JDBC Connection Configuration

作用

  • 管理数据库连接池:创建和管理到数据库的连接
  • 提高性能:避免每个 JDBC 请求都建立新连接
  • 集中配置:所有 JDBC 请求共享同一连接配置

二、核心配置参数详解

1. 基本连接配置

参数 说明 示例
Variable Name 连接池变量名(重要!JDBC请求通过此名引用连接) myDB
Database URL 数据库连接URL(格式因数据库而异) jdbc:mysql://localhost:3306/test_db
JDBC Driver class JDBC驱动类名(从下拉框选择或手动输入) com.mysql.cj.jdbc.Driver
Username 数据库用户名 root
Password 数据库密码 password123

2. 连接池配置

参数 说明 推荐值
Max Number of Connections 连接池最大连接数 10(根据并发用户数调整)
Max Wait (ms) 获取连接的最大等待时间 10000(10秒)
Time Between Eviction Runs (ms) 空闲连接检查间隔 60000(1分钟)
Auto Commit 是否自动提交事务 勾选(通常保持默认)
Transaction Isolation 事务隔离级别 DEFAULT(保持默认)
Test While Idle 是否测试空闲连接 勾选(推荐)
Soft Min Evictable Idle Time(ms) 连接最小空闲时间 300000(5分钟)
Validation Query 连接验证查询语句 SELECT 1(简单查询验证连接有效)

三、不同数据库的配置示例

1. MySQL 配置

// JDBC Connection Configuration - MySQL
Variable Name:              mysqlDB
Database URL:               jdbc:mysql://localhost:3306/test_db
JDBC Driver class:          com.mysql.cj.jdbc.Driver
Username:                   testuser
Password:                   testpass// 连接池配置
Max Number of Connections:  10
Validation Query:           SELECT 1

2. PostgreSQL 配置

// JDBC Connection Configuration - PostgreSQL
Variable Name:              postgresDB
Database URL:               jdbc:postgresql://localhost:5432/test_db
JDBC Driver class:          org.postgresql.Driver
Username:                   testuser
Password:                   testpassValidation Query:           SELECT 1

3. Oracle 配置

// JDBC Connection Configuration - Oracle
Variable Name:              oracleDB
Database URL:               jdbc:oracle:thin:@localhost:1521:ORCL
JDBC Driver class:          oracle.jdbc.OracleDriver
Username:                   system
Password:                   oracle123Validation Query:           SELECT 1 FROM DUAL

4. SQL Server 配置

// JDBC Connection Configuration - SQL Server
Variable Name:              sqlserverDB
Database URL:               jdbc:sqlserver://localhost:1433;databaseName=test_db
JDBC Driver class:          com.microsoft.sqlserver.jdbc.SQLServerDriver
Username:                   sa
Password:                   sql123Validation Query:           SELECT 1

5. SQLite 配置

// JDBC Connection Configuration - SQLite
Variable Name:              sqliteDB
Database URL:               jdbc:sqlite:/path/to/database.db
JDBC Driver class:          org.sqlite.JDBC
Username:                   (留空)
Password:                   (留空)Validation Query:           SELECT 1

四、完整配置示例

项目结构

测试计划
├── JDBC Connection Configuration (数据库连接配置)
├── 线程组
│   ├── JDBC Request (查询用户)
│   ├── JDBC Request (插入订单)
│   └── JDBC Request (更新库存)

详细配置步骤

1. 添加 JDBC Connection Configuration

配置元件 → JDBC Connection Configuration// 基本配置
Variable Name:              myDatabase
Database URL:               jdbc:mysql://localhost:3306/ecommerce
JDBC Driver class:          com.mysql.cj.jdbc.Driver
Username:                   jmeter_user
Password:                   jmeter123// 连接池配置
Max Number of Connections:  5
Max Wait (ms):              10000
Validation Query:           SELECT 1
Test While Idle:           true

2. 添加 JDBC 请求并引用连接

线程组
├── JDBC Request: 查询用户
│   ├── Variable Name: myDatabase  // 与连接配置的Variable Name一致
│   ├── SQL Query: SELECT * FROM users WHERE id = ?
│   └── Parameter values: 1001
├── JDBC Request: 插入订单
│   ├── Variable Name: myDatabase
│   ├── SQL Query: INSERT INTO orders(...) VALUES(?, ?, ?)
│   └── Parameter values: 1001, 50.00, "2024-01-01"
└── JDBC Request: 更新库存├── Variable Name: myDatabase├── SQL Query: UPDATE products SET stock = stock - ? WHERE id = ?└── Parameter values: 1, 5001

五、高级配置技巧

1. 参数化数据库连接

使用 用户定义的变量 实现环境无关配置:

测试计划
├── 用户定义的变量
│   ├── db.host=localhost
│   ├── db.port=3306
│   ├── db.name=ecommerce
│   ├── db.user=jmeter_user
│   └── db.password=jmeter123├── JDBC Connection Configuration
│   ├── Database URL: jdbc:mysql://${db.host}:${db.port}/${db.name}
│   ├── Username: ${db.user}
│   └── Password: ${db.password}

2. 多环境配置

为不同环境创建不同的连接配置:

测试计划
├── 如果控制器 (条件: ${__P(env, "dev")} == "dev")
│   └── JDBC Connection Configuration (开发环境)
│       ├── Database URL: jdbc:mysql://dev-db:3306/test
│       └── Variable Name: devDB
├── 如果控制器 (条件: ${__P(env, "dev")} == "test")
│   └── JDBC Connection Configuration (测试环境)
│       ├── Database URL: jdbc:mysql://test-db:3306/test
│       └── Variable Name: testDB
└── JDBC Request├── Variable Name: ${__P(env, "dev")}DB  // 动态选择连接└── SQL Query: SELECT ...

3. 连接池性能优化

根据并发用户数调整连接池:

// 低并发场景 (1-10用户)
Max Number of Connections: 5
Max Wait (ms): 5000// 中等并发场景 (10-50用户)  
Max Number of Connections: 10
Max Wait (ms): 10000// 高并发场景 (50+用户)
Max Number of Connections: 20-50(根据数据库承受能力调整)
Max Wait (ms): 15000

六、常见错误排查

❌ 错误1:ClassNotFoundException

现象Cannot load JDBC driver class 'com.mysql.cj.jdbc.Driver'

解决

  1. 检查驱动 JAR 包是否放在 jmeter/lib/目录
  2. 重启 JMeter
  3. 确认驱动类名拼写正确

❌ 错误2:Connection refused

现象Communications link failure

解决

  1. 检查数据库服务是否启动
  2. 确认主机名、端口号正确
  3. 检查防火墙设置

❌ 错误3:Access denied

现象Access denied for user 'username'@'host'

解决

  1. 检查用户名/密码是否正确
  2. 确认用户有远程连接权限
  3. 检查数据库权限设置

❌ 错误4:Too many connections

现象:连接数超过限制

解决

  1. 减小 Max Number of Connections
  2. 增加数据库的 max_connections设置
  3. 优化测试脚本,减少并发

七、最佳实践总结

一定要做的:

  1. 有意义的 Variable Name:使用描述性名称,如 userDB, orderDB
  2. 合适的连接池大小:根据并发用户数合理设置
  3. 使用 Validation Query:确保连接有效性
  4. 参数化敏感信息:密码等敏感信息使用变量
  5. 环境隔离:为不同环境配置不同的连接

避免的:

  1. 不要使用默认名称:避免使用 pool1, pool2等无意义名称
  2. 不要过度配置连接数:避免对数据库造成过大压力
  3. 不要硬编码连接信息:使用变量实现环境无关配置
  4. 不要忽略连接验证:确保连接池中的连接是有效的

八、配置检查清单

掌握 JDBC Connection Configuration 的配置,你就能够高效地进行数据库性能测试了!

关于JDBC Request启动报错

  1. 启动报错,DataSource为空:解决方案再JDBC Connection Configuration最后的Connection Properties中添加DataSource=jdbc/test0_db;这个test0_db自己命名的

    2025-11-29 19:27:27,635 ERROR o.a.j.e.StandardJMeterEngine: Unable to execute testStarted(null) for test element org.apache.jmeter.protocol.jdbc.config.DataSourceElement@5f76d05d
    java.lang.IllegalArgumentException: Name for DataSoure must not be empty in JDBC Connection Configurationat org.apache.jmeter.protocol.jdbc.config.DataSourceElement.testStarted(DataSourceElement.java:119) ~[ApacheJMeter_jdbc.jar:5.6.3]at org.apache.jmeter.engine.StandardJMeterEngine.notifyTestListenersOfStart(StandardJMeterEngine.java:247) [ApacheJMeter_core.jar:5.6.3]at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:432) [ApacheJMeter_core.jar:5.6.3]at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_341]at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_341]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_341]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_341]at java.lang.Thread.run(Thread.java:750) [?:1.8.0_341]
  2. 可以执行JDBC Request了,但是返回结果报错:JDBC Request的variable name没有添加,必须和JDBC Connection Configuration相等

    Name for DataSoure must not be empty in JDBC Request
    
  3. 重新执行报错,telnet也是这么返回的:3306可以连接,但是没有授权,

    Cannot create PoolableConnectionFactory (null,  message from server: "Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server")
    

    授权命令

    CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY '你的密码';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
  4. 重新执行继续报错:是否允许使用公共密钥,需添加Connection Properties配置;allowPublicKeyRetrieval=true;useSSL=false

    Cannot create PoolableConnectionFactory (Public Key Retrieval is not allowed)
    

    完整的配置

    DataSource=jdbc/test0_db;useUnicode=true;characterEncoding=UTF-8;serverTimezone=Asia/Shanghai;allowPublicKeyRetrieval=true;useSSL=false
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/981183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

散列表

有关散列表的真题 平均查找长度[解析] 可以构造得到如下的 HT: 下标 0 1 2 3 4 5 6 关键词 22 43 15 成功时的平均查找长度 = (1+2+3)/3 = 2。[解析] 构造 散列表 只有当遇到关键字为空的地址时才会查找失败,…

腾讯TBDS和Cloudera Data AI CMP 比较的缺陷在哪里?

腾讯TBDS和Cloudera Data AI CMP 比较的缺陷在哪里?腾讯TBDS和Cloud Data AI CMP 比较的缺陷在哪里?腾讯云 TBDS(Tencent Big Data Suite) 与 Cloud Data AI CMP(Cloud Data AI Platform) 的全面、结构化优劣势对…

python获取绝对路径复制文件

python获取绝对路径复制文件import shutil import sys import os def cur_file_dir():path = sys.path[0]if os.path.isdir(path):return pathelif os.path.isfile(path):return os.path.dirname(path) def path(p):re…

Task状态

1 Task task=null;2 private void button1_Click(object sender, EventArgs e)3 {4 task = Task.Factory.StartNew(() =>5 {6 while (true)7 …

实用指南:算法<C++>——二分查找

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 哈尔滨轴承品牌价值TOP10榜单

本次榜单联合黑龙江省轴承工业协会、哈尔滨市制造业创新中心共同制作,数据来源于 2024 年企业年报、第三方检测机构报告及市场调研问卷(样本量 1200 份),从技术硬实力、市场认可度、质量稳定性三大维度构建评估体系…

AI革命中的开源NLP工具与技术实践

本期播客探讨了工业级自然语言处理工具spaCy和标注工具Prodigy的应用实践,讨论了大型语言模型与专用模型的平衡、人类在环蒸馏技术、NLP领域的模块化与隐私挑战,以及AI监管对创新的影响。第34集:AI革命不会被垄断 H…

Python 潮流周刊#129:Pydantic 还能做些什么?

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 温馨提…

【论术】: 响应式布局——flex:1与calc的区别

莫说相公痴,更有痴似相公者。 —— 张岱《湖心亭看雪》 是什么 calc: 是css3新增的用于计算容器数值的计算函数,基于数学角度计算一个元素的数值 (flex:1):是flex布局对于剩余空间的声明,表示占据所有剩余空间 关联…

Git 误操作恢复指南:回退`reset --hard` 和 `push -f`

场景:误操作的后果 发生的操作(错误)您将本地分支回退到较旧的提交:git reset --hard [旧哈希 A] 您将此回退状态强制同步到远程仓库:git push origin -f [分支名]结果和风险本地: 提交 B 及之后的历史记录看似“…

详细介绍:算法 - 差分

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《程序员修炼之道:从小工到专家》观后感第六篇

笔记六:《自动化与工具 ——“自动化一切” 的效率革命》 核心观点:自动化是解放重复劳动的 “生产力工具”,从开发、测试到部署的全流程自动化,能大幅提升团队效能,让开发者聚焦创造性工作。 案例分析:某 SaaS …

Day6-20251129

摘要:本文介绍了JAVA基础语法中的注释使用,包括单行注释(//)、多行注释(/* /)和文档注释(/* */)三种形式。详细说明了在IDEA中创建JAVA项目、模块的基本步骤,以及如何修改注释的显示颜色和样式。通过HelloWorld示例…

详细介绍:反反爬虫实战:手撕某知名网站Webpack加密的JavaScript

详细介绍:反反爬虫实战:手撕某知名网站Webpack加密的JavaScript2025-11-29 19:50 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !im…

《程序员修炼之道:从小工到专家》观后感第五篇

笔记五:《协作与沟通 —— 技术人的 “软技能” 实效修炼》 核心观点:技术人的影响力不仅源于技术深度,更依赖协作沟通的 “软技能”。清晰的文档、高效的代码评审、精准的方案表达,是减少团队摩擦、提升整体效能的…

深入解析:Rust 迭代器的性能优化技巧

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20251129——读后感6

要积累知识,把解决的问题、学习的知识点记录下来。比如遇到Redis缓存击穿问题,记录下分析和解决步骤,下次遇到类似问题就能快速参考,就像医生的病历库,方便后续诊疗。

#20232408 2025-2026-1 《网络与系统攻防技术》实验七实验报告 - 20232408

1.实验内容 1.1使用SET工具建立冒名网站; 1.2使用Ettercap进行DNS欺骗;1.3结合SET与Ettercap技术实施DNS欺骗钓鱼攻击;1.4提高防范意识,并提出具体防范方法。2.实验目的 理解常用网络欺诈背后的原理,以提高防范意…

百科代做公司推荐,2025年12月权威发布百度百科/快懂百科代做公司信息

在数字化传播的当下,网络信息已成为公众了解企业的首要渠道,而百科词条作为兼具权威性与公信力的信息载体,逐渐成为企业品牌建设的核心阵地。百度百科与快懂百科凭借各自的平台优势,成为企业布局网络形象的关键选择…