【碎片化学习】 Apache JMeter 取样器指南:从入门到精通
【碎片化学习】 Apache JMeter 取样器指南:从入门到精通
工欲善其事必先利其器,对于做性能测试的小伙伴来说,手头有一款强大并且能够熟练使用的测试工具至关重要。Apache JMeter 就是这样的一款强大的开源性能测试工具,广泛应用于负载测试、压力测试、功能测试等场景。JMeter 通过多种取样器(Sampler)模拟不同的用户请求,测试目标应用的响应时间、吞吐量、稳定性等性能指标。每种取样器都有其独特的功能,本文将介绍 JMeter 中所有常见的取样器,包括取样器的英文名称、中文名称、用途、适用场景、配置参数及对应的 JMeter 版本。
一、取样器通用概念
在深入每个取样器之前,需要理解几个通用概念:
- 作用域:取样器必须被包含在一个线程组内。线程组控制着执行取样器的虚拟用户数量和行为。
- 执行顺序:在同一个线程组内,取样器会按照它们在测试树中从上到下的顺序依次执行。
- 配置元件:取样器通常与配置元件(如 HTTP 请求默认值、HTTP 信息头管理器、CSV 数据文件设置)配合使用,以简化配置和数据驱动测试。
- 监听器:为了查看取样器的结果,需要添加监听器(如查看结果树、聚合报告)来记录和展示响应数据与性能指标。
二、核心取样器详解
以下是 JMeter 主要内置取样器的详细介绍。除非特别说明,这些取样器在 JMeter 的近期版本(如 3.x, 4.x, 5.x)中均稳定存在。
1. HTTP 请求(HTTP Request)
- 中文名: HTTP 请求
- 用途: 模拟发送 HTTP/HTTPS 请求,是 Web 应用性能测试中最常用、最核心的取样器。
- 适用场景:
- 测试网站、RESTful API、SOAP Web Service 的性能。
- 模拟 GET, POST, PUT, DELETE, PATCH 等 HTTP 方法。
- 文件上传和下载测试。
- 关键配置参数:
- 协议:
http
或https
。 - 服务器名称或 IP: 目标服务器的主机名或 IP 地址。
- 端口号: 服务器的端口(如 80, 443, 8080)。
- HTTP 请求: 选择请求方法(GET, POST 等)。
- 路径: 请求的 URI 路径(如
/api/users
)。 - 参数: 添加 URL 参数或表单参数。
- 消息体数据: 用于 POST/PUT 等方法,发送 JSON、XML 等原始数据。
- 文件上传: 指定要上传的文件路径和参数名。
- 协议:
2. JDBC 请求(JDBC Request)
- 中文名: JDBC 请求
- 用途: 向数据库发送 SQL 查询或更新语句,用于直接测试数据库性能。
- 适用场景:
- 测试特定 SQL 语句的执行时间。
- 验证数据库架构的性能瓶颈。
- 在压力下测试存储过程。
- 关键配置参数:
- 变量名称: 必须与 JDBC 连接配置 元件中定义的名称一致。
- SQL Query: 输入要执行的 SQL 语句。支持使用
${变量}
进行参数化。 - 参数值: 如果 SQL 中使用
?
作为占位符,在此处提供参数值。 - 参数类型: 指定对应参数的数据类型(如
INTEGER
,VARCHAR
)。 - 查询类型: 选择语句类型(
Select Statement
,Update Statement
等),帮助 JMeter 处理结果。
3. TCP 取样器(TCP Sampler)
- 中文名: TCP 取样器
- 用途: 通过 TCP 协议向服务器发送消息并接收响应,用于测试非 HTTP 的定制化网络服务。
- 适用场景:
- 测试消息队列(如 RabbitMQ、ActiveMQ 的原始 TCP 接口)。
- 测试自定义的 Socket 服务器、游戏服务器、电信协议。
- 测试基于 Telnet, SSH 等的服务。
- 关键配置参数:
- TCPClient classname: 指定实现 TCP 协议的类(如
TCPClientImpl
,BinaryTCPClientImpl
)。 - 服务器名称或 IP: 目标服务器地址。
- 端口号: 目标端口。
- 文本/二进制消息: 要发送的请求数据。
- 重用连接: 是否在同一个线程内复用 TCP 连接。
- End of line (EOL) byte value: 指定行结束符,用于判断响应结束。
- TCPClient classname: 指定实现 TCP 协议的类(如
4. Java 请求(Java Request)
- 中文名: Java 请求
- 用途: 用于测试自定义的 Java 类(而非远程服务)。这些类需要实现特定的接口。
- 适用场景:
- 测试业务逻辑层或工具类的性能,无需启动整个应用服务器。
- 与 JMeter 深度集成,调用已有的 Java 测试代码。
- 关键配置参数:
- 类名称: 从下拉列表中选择一个已实现的 Java 类(JMeter 自带一些示例,如
SleepTest
)。 - 参数: 传递给该类的参数。
- 类名称: 从下拉列表中选择一个已实现的 Java 类(JMeter 自带一些示例,如
5. 调试取样器(Debug Sampler)
- 中文名: 调试取样器
- 用途: 它本身不向服务器发送请求,而是显示 JMeter 在运行时的变量和属性值。这是一个调试工具。
- 适用场景:
- 在脚本开发阶段,检查变量(如从 CSV 文件读取的、从正则表达式提取的)是否正确赋值。
- 验证配置元件的效果。
- 关键配置参数:
- JMeter 属性: 是否显示 JMeter 属性。
- JMeter 变量: 是否显示 JMeter 变量(最常用)。
- 系统属性: 是否显示系统属性。
6. 访问日志取样器(Access Log Sampler)
- 中文名: 访问日志取样器
- 用途: 通过解析 Web 服务器(如 Apache, Nginx)的访问日志文件,来动态生成 HTTP 请求。它可以非常真实地模拟用户流量。
- 适用场景:
- 根据真实的生产环境访问日志回放流量,进行压力测试。
- 生成高度逼真的混合请求场景(不同 URL、方法、参数)。
- 关键配置参数:
- 日志文件: 访问日志文件的路径。
- 日志格式: 指定日志的格式(如
Common
,Combined
或自定义格式)。
7. SMTP 取样器(SMTP Sampler)
- 中文名: SMTP 取样器
- 用途: 模拟一个电子邮件客户端,通过 SMTP 协议发送邮件。可以测试邮件服务器的性能。
- 适用场景:
- 测试邮件发送服务器的负载能力。
- 模拟大量用户注册、通知等邮件发送场景。
- 关键配置参数:
- 服务器设置: SMTP 服务器地址、端口、是否使用 SSL/TLS。
- 登录信息: 发件人邮箱的用户名和密码。
- 邮件内容: 发件人、收件人、抄送、主题、邮件正文。
8. FTP 请求(FTP Request)
- 中文名: FTP 请求
- 用途: 模拟 FTP 客户端,执行文件上传(
STOR
)、下载(RETR
)和删除(DELE
)等操作。 - 适用场景:
- 测试 FTP 服务器的文件传输性能。
- 模拟批量文件处理场景。
- 关键配置参数:
- 服务器信息: 服务器地址、端口、远程文件路径、本地文件路径。
- 登录信息: 用户名和密码。
- 操作: 选择
RETR
(下载)、STOR
(上传)等命令。
三、其他取样器(简要介绍)
英文名 | 中文名 | 用途简介 | 适用场景 |
---|---|---|---|
SOAP/XML-RPC Request | SOAP/XML-RPC 请求 | 专门用于测试 SOAP Web Service。 | 老旧的基于 SOAP 的 Web 服务。注意:现代 RESTful API 测试通常使用 HTTP 请求。 |
BeanShell Sampler | BeanShell 取样器 | 允许使用 BeanShell 脚本语言编写自定义逻辑。 | 需要复杂逻辑控制、数据处理或与 Java 代码交互的场景。 |
JMS Publisher/Subscriber | JMS 发布/订阅 | 用于测试 Java 消息服务。 | 测试消息中间件(如 ActiveMQ, IBM MQ)的性能。 |
JUnit Request | JUnit 请求 | 用于运行已有的 JUnit 测试用例。 | 将现有的单元测试转化为负载测试。 |
LDAP Request | LDAP 请求 | 测试 LDAP 目录服务的性能。 | 测试用户认证、目录查询等操作。 |
Mail Reader Sampler | 邮件读取取样器 | 通过 POP3 或 IMAP 协议读取邮件。 | 测试邮件接收服务器的性能。 |
四、版本说明与总结
- 版本兼容性: 上述核心取样器(如 HTTP 请求、JDBC 请求、TCP 取样器)在 JMeter 的长期发展中非常稳定,从较早的 2.x 版本到最新的 5.x 版本都得到了良好支持。
- 插件增强: JMeter 的强大之处在于其插件生态系统。通过安装 JMeter Plugins Manager,你可以获得更多第三方或社区开发的取样器,例如:
- MQTT 取样器: 用于测试 IoT 常用的 MQTT 协议。
- Selenium/WebDriver 取样器: 用于模拟真实浏览器的行为(但资源消耗较大)。
- 选择原则: 选择哪个取样器完全取决于你的测试目标。绝大多数现代 Web API 和微服务测试,使用
HTTP 请求
取样器就已足够。对于数据库、消息队列等特定协议,再选择对应的专用取样器。
写在最后
JMeter 的取样器提供了模拟各种协议和请求的能力,是构建真实负载测试场景的基石。熟练掌握它们的特点和配置方法,是成为一名优秀性能测试工程师的关键一步。