JMeter 性能测试实战笔记
JMeter 性能测试实战笔记
本文档是一份详细的 JMeter 指南,涵盖了从创建测试计划、执行测试到解读性能结果的全过程。
一、创建测试计划
一个完整的测试计划是执行性能测试的基础。下面将分步介绍如何创建一个针对文件上传接口的测试场景。
第一步:添加线程组 (定义并发用户)
“线程组”是用来模拟并发用户的核心元件。它决定了有多少个“虚拟用户”同时去请求您的服务。
- 在左侧的树状视图中,用鼠标右键点击
▲ Test Plan
。 - 在弹出的菜单中,依次选择
添加 (Add)
->线程 (Users)
->线程组 (Thread Group)
。 - 点击新创建的
线程组
,您会在右侧看到它的配置选项。请按照如下计划来填写:- 线程数 (Number of Threads):
20
(模拟20个并发用户) - Ramp-up Period (in seconds):
10
(在10秒内让这20个用户全部启动) - 循环次数 (Loop Count):
100
(每个用户重复请求100次) - 也可以设置一段时间
- 线程数 (Number of Threads):
第二步:添加 HTTP 请求 (定义要测试的接口)
现在我们需要告诉 JMeter,这些虚拟用户具体要请求哪个接口。
- 在左侧的树状视图中,右键点击您刚刚创建的
线程组
。 - 依次选择
添加 (Add)
->取样器 (Sampler)
->HTTP 请求 (HTTP Request)
。 - 点击新创建的
HTTP 请求
,在右侧面板中进行核心配置:- Web 服务器 (Web Server)
- 服务器名称或IP (Server Name or IP):
localhost
- 端口号 (Port Number):
8080
- 服务器名称或IP (Server Name or IP):
- HTTP 请求 (HTTP Request)
- 方法 (Method): 选择
POST
- 路径 (Path):
/api/convert/JODConverter
- 重要: 如果要上传文件,记得勾选
Use multipart/form-data for POST
复选框。
- 方法 (Method): 选择
- Web 服务器 (Web Server)
- 如果要配置上传文件:
- 切换到下方的
Files Upload
标签页。 - 点击
添加 (Add)
按钮。 - 填写文件信息:
- 文件路径 (File Path): 点击
Browse...
选择您准备好的测试Word文档。 - 参数名称 (Parameter Name):
file
(必须和后端接口的@RequestParam("file")
一致) - MIME 类型 (MIME Type):
application/vnd.openxmlformats-officedocument.wordprocessingml.document
- 文件路径 (File Path): 点击
- 切换到下方的
第三步:添加监听器 (查看测试结果)
没有监听器,我们就看不到任何测试结果。
- 再次右键点击
线程组
。 - 依次选择
添加 (Add)
->监听器 (Listener)
->聚合报告 (Aggregate Report)
。- 这个监听器会在测试运行时,以表格形式实时汇总和展示平均响应时间、吞吐量、错误率等核心性能指标。
- (可选,推荐用于调试) 右键点击
线程组
->添加 (Add)
->监听器 (Listener)
->查看结果树 (View Results Tree)
。- 这个监听器可以看到每一次请求的详细信息。注意:在正式进行大并发量测试时,请禁用它(右键点击 -> 禁用),因为它会消耗较多内存。
二、执行测试与保存结果
测试计划创建好后,下一步就是执行它并保存结果以供分析。推荐使用命令行模式执行正式的压测。
方法一:通过 GUI 保存结果
此方法适用于快速查看和调试,不推荐用于正式压测。
- 在 JMeter 图形界面中,选中您的
聚合报告 (Aggregate Report)
监听器。 - 在右侧的配置面板中,找到
文件名 (Filename)
输入框。 - 点击
浏览 (Browse)...
按钮,选择一个路径并输入一个文件名,例如/Users/sunyuan/develop/project/word2pdf/performance_results/jmeter_results.csv
。 每次运行测试时,结果会自动追加到这个文件中。
方法二:使用命令行执行压测(推荐的最佳实践)
虽然图形化界面便于设计脚本,但官方强烈建议使用命令行模式来执行真正的压力测试。这样做可以避免 GUI 带来的额外性能开销,确保测试结果的纯净和准确。
-
保存您的 JMeter 测试计划:
- 在 JMeter 图形界面中,点击
文件 (File)
->保存测试计划为 (Save Test Plan as)
。 - 将测试计划保存为一个
.jmx
文件,例如/Users/sunyuan/develop/project/word2pdf/shell/test_plan.jmx
。
- 在 JMeter 图形界面中,点击
-
通过命令行执行:
- 打开一个新的终端窗口。
- 使用以下命令来执行测试。这个命令会自动处理结果文件的保存和后续的 HTML 报告生成。
Bash
# 定义变量,方便管理 BASE_DIR="/Users/sunyuan/develop/project/word2pdf" TEST_PLAN="${BASE_DIR}/shell/test_plan.jmx" RESULT_FILE="${BASE_DIR}/performance_results/jmeter_results.csv" REPORT_DIR="${BASE_DIR}/performance_results/html_report"# 确保结果文件和报告目录是干净的 (JMeter要求报告目录为空) rm -f $RESULT_FILE rm -rf $REPORT_DIR mkdir -p $REPORT_DIR# 执行 JMeter 命令行压测 jmeter -n -t $TEST_PLAN -l $RESULT_FILE -e -o $REPORT_DIR
命令参数解析:
-n
: non-GUI mode,以无图形界面模式运行。-t <file.jmx>
: test plan,指定要运行的测试计划文件。-l <file.csv>
: log file,指定用于记录测试结果的日志文件。-e
: end,表示在测试结束后生成 HTML 报告。-o <directory>
: output directory,指定存放 HTML 报告的输出目录。此目录必须为空或不存在。
三、结果分析
测试完成后,需要对结果数据进行详细解读,以评估系统性能。
聚合报告 (Aggregate Report) 结果解读
-
Label
:是我们测试的请求的标签或名称。 -
# Samples
(样本数): 总共完成了 200 次请求。 -
Average
(平均响应时间): 所有请求的平均响应时间是 1808 毫秒 (约 1.81 秒)。这是评估服务处理速度最核心、最直观的指标。 -
Median
(中位数): 50% 的用户响应时间低于 1754 毫秒。比平均值更能抵抗极端值的影响。 -
90% Line
(90百分位): 90% 的请求响应时间都在 2060 毫秒 (2.06 秒) 以内。 -
95% Line
(95百分位): 95% 的请求响应时间都在 2183 毫秒 (2.18 秒) 以内。这是衡量服务稳定性的一个常用指标 (SLI/SLO)。 -
99% Line
(99百分位): 99% 的请求响应时间都在 2420 毫秒 (2.42 秒) 以内,帮助我们了解最慢请求的情况。 -
Min
/Maximum
(最小/最大响应时间): 最快的一次花费了 1.58 秒,最慢的一次花费了 2.83 秒。 -
Error %
(错误率): 0.00% 是一个完美的指标!说明在当前并发压力下,服务非常稳定。 -
Throughput
(吞吐量): 服务器每秒钟能成功处理 1.1 个转换请求。这是衡量服务器处理能力的核心指标,通常也称为 QPS (Queries Per Second)。 -
Received/Sent KB/sec
: 每秒接收和发送的数据量。发送 (Sent
) 远大于接收 (Received
),符合上传大文件的场景。
jmeter_results.csv
文件列名分析
CSV 文件记录了每一次请求的详细数据,便于进行更深入的分析。
列名 | 示例值 | 含义 |
---|---|---|
responseCode | 200 | HTTP 响应状态码。200 代表 OK (成功)。 |
threadName | word2pdf thread group 1-1 | 发出请求的具体虚拟用户(线程)的名称。 |
dataType | text | 响应数据的类型。 |
success | true | 请求是否成功。错误率 (Error % ) 就是根据此列计算的。 |
bytes | 740 | 响应数据的大小(字节)。成功后只返回小段 JSON,所以值很小。 |
sentBytes | 1691146 | 发送数据的大小(字节)。此值很大,代表上传的 Word 文档大小。 |
grpThreads | 2 | 请求发生时,其所在线程组内的活跃线程数。 |
allThreads | 2 | 请求发生时,整个测试计划中的总活跃线程数。 |
URL | http://127.0.0.1:8080/... | 请求的完整 URL 地址。 |
Latency | 1792 | (重要指标) 从发出请求到接收到响应第一个字节的时间 (ms),主要衡量服务器端处理时间。 |
Connect | 0 | 建立 TCP 连接的时间 (ms)。通常只有首个请求耗时,后续复用连接,时间为 0。 |
四、常见问题与技巧
Q: 点击绿色启动按钮时,应该选中哪个元件?
A: 您不需要选中任何特定的元件。
JMeter 的启动按钮(绿色的三角箭头 ▶
)是针对整个测试计划 (Test Plan) 生效的。无论您当前在左侧的树状视图中选中了哪个元件,当您点击启动按钮时,JMeter 都会从最顶层的 Test Plan
开始,执行其中所有未被禁用的元件。
如果不测试的元件,要禁用
关于启动和停止的额外提示
- 启动 (Start): 绿色的
▶
按钮。 - 停止 (Stop): 红色的
■
按钮。这会立即停止所有线程,可能会中断正在进行的请求。 - 优雅地停止 (Shutdown):
停止
按钮旁边的那个灰色■
按钮。这会允许当前正在执行的请求完成后再停止所有线程,是更推荐的停止方式。 - 清除结果 (Clear All): 工具栏上的扫帚图标
🧹
。点击它会清除所有监听器(如聚合报告
、查看结果树
)中已有的测试结果,方便您开始一次全新的测试。