1. 概述
Apache JMeter 是一款基于Java的开源性能测试工具,主要用于分析和测量Web应用的性能表现。简单来说,它能帮我们模拟不同负载条件,测试服务器的整体性能表现。
JMeter提供了直观的GUI界面,方便我们定义测试计划、执行测试并查看报告。同时它也支持非GUI模式,允许我们通过命令行直接运行测试脚本。
本文将详细介绍如何通过命令行运行JMeter的.jmx文件,并灵活配置报告输出格式。
2. 环境准备
开始前,我们先准备一个用于演示的JMeter脚本。这里使用 https://postman-echo.com 提供的模拟REST接口作为测试目标。
主要步骤包括:
- 创建测试计划(Test Plan)和线程组(Thread Group)
- 配置HTTP请求采样器(HTTP Request Sampler)
- 添加汇总报告监听器(Summary Report Listener)
下面详细说明每个步骤:
2.1. 创建JMeter测试计划和线程组
通过JMeter GUI创建测试计划,首先添加线程组:
配置线程组参数:
- 线程数:5
- 启动时间(Ramp-Up Period):1秒
- 循环次数:10
2.2. 配置HTTP请求采样器
在线程组中添加HTTP请求采样器:
配置采样器使用Postman Echo服务的GET接口:
- 协议:https
- 服务器名:postman-echo.com
- 路径:/get
- 参数:foo1=bar1&foo2=bar2
2.3. 配置汇总报告监听器
最后添加汇总报告监听器,用于生成测试结果摘要:
在GUI中运行测试,查看生成的汇总报告:
将此脚本保存为 "Summary-Report.jmx",后续将用于命令行测试。
3. 通过命令行运行.jmx文件
现在我们已准备好包含测试计划的JMX文件。JMeter支持通过命令行以非GUI模式运行测试脚本,核心命令是 jmeter
,需在JMeter安装目录的bin文件夹下执行。
运行测试并生成报告的基本命令:
$ jmeter -n -t Summary-Report.jmx -l Summary-Report.jtl
执行后控制台输出:
Creating summariser <summary>
Created the tree successfully using /Users/baeldung/Summary-Report.jmx
Starting standalone test @ 2023 Jun 3 13:32:11 IST (1685779331706)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary = 50 in 00:00:08 = 6.6/s Avg: 499 Min: 193 Max: 3601 Err: 0 (0.00%)
Tidying up ... @ 2023 Jun 3 13:32:19 IST (1685779339273)
... end of run
该命令执行测试脚本并生成 "Summary-Report.jtl" 结果文件。关键参数说明:
-n
:指定非GUI模式运行-t
:指定JMX测试脚本路径-l
:指定JTL(JMeter测试日志)输出路径
查看生成的JTL文件内容(CSV格式):
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect
1685779331808,978,HTTP Request,200,OK,Thread Group 1-1,text,true,,681,143,5,5,https://postman-echo.com/get?foo1=bar1&foo2=bar2,974,0,780
1685779331959,827,HTTP Request,200,OK,Thread Group 1-2,text,true,,679,143,5,5,https://postman-echo.com/get?foo1=bar1&foo2=bar2,823,0,625
1685779332163,786,HTTP Request,200,OK,Thread Group 1-3,text,true,,681,143,5,5,https://postman-echo.com/get?foo1=bar1&foo2=bar2,785,0,589
1685779332787,194,HTTP Request,200,OK,Thread Group 1-2,text,true,,681,143,5,5,https://postman-echo.com/get?foo1=bar1&foo2=bar2,194,0,0
JTL文件以CSV格式记录了每个请求的详细数据。
4. 配置JMeter汇总报告
我们可以自定义汇总报告的输出字段和格式,主要有两种方式:
- 修改JMeter属性文件
- 通过命令行参数覆盖
4.1. 修改JMeter属性文件
JMeter属性文件 jmeter.properties
位于安装目录的bin文件夹下。汇总报告相关属性以 jmeter.save.saveservice.
为前缀:
#jmeter.save.saveservice.output_format=csv
#jmeter.save.saveservice.response_code=true
#jmeter.save.saveservice.latency=true
默认这些属性被注释,取消注释并修改值:
jmeter.save.saveservice.response_code=false
jmeter.save.saveservice.latency=false
jmeter.save.saveservice.output_format=xml
重新运行测试后生成XML格式结果:
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
<httpSample t="801" it="0" ct="593" ts="1685791090172" s="true" lb="HTTP Request" rm="OK" tn="Thread Group 1-3" dt="text" by="679" sby="143" ng="5" na="5">
<java.net.URL>https://postman-echo.com/get?foo1=bar1&foo2=bar2</java.net.URL>
</httpSample>
<httpSample t="1004" it="0" ct="782" ts="1685791089969" s="true" lb="HTTP Request" rm="OK" tn="Thread Group 1-2" dt="text" by="679" sby="143" ng="5" na="5">
<java.net.URL>https://postman-echo.com/get?foo1=bar1&foo2=bar2</java.net.URL>
</httpSample>
</testResults>
输出格式已变为XML,且响应码和延迟字段被移除。
4.2. 通过命令行参数覆盖属性
更灵活的方式是通过命令行参数覆盖属性文件配置:
$ jmeter -Jjmeter.save.saveservice.output_format=csv -n -t Summary-Report.jmx -l Summary-Report.jtl
使用 -J
参数动态覆盖属性值。执行后生成CSV格式结果:
timeStamp,elapsed,label,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,IdleTime,Connect
1685792003144,961,HTTP Request,OK,Thread Group 1-1,text,true,,685,143,5,5,https://postman-echo.com/get?foo1=bar1&foo2=bar2,0,741
1685792003306,799,HTTP Request,OK,Thread Group 1-2,text,true,,681,143,5,5,https://postman-echo.com/get?foo1=bar1&foo2=bar2,0,599
1685792004106,200,HTTP Request,OK,Thread Group 1-2,text,true,,681,143,5,5,https://postman-echo.com/get?foo1=bar1&foo2=bar2,0,0
成功通过命令行参数将输出格式从XML切换回CSV。
5. 总结
本文详细介绍了如何通过命令行运行JMeter测试脚本并配置报告输出:
✅ 核心操作流程:
- 使用
jmeter -n -t <脚本> -l <结果文件>
基础命令运行测试 - 通过修改
jmeter.properties
永久改变报告格式 - 使用
-J
参数临时覆盖属性配置
⚠️ 踩坑提醒:
- 命令行运行时需确保在JMeter的bin目录下执行
- 属性修改后需重启JMeter才能生效
- XML格式虽然结构化但体积较大,CSV更适合大数据量场景
命令行运行的优势:
- 节省GUI资源消耗
- 便于集成到CI/CD流程
- 支持参数化配置不同测试环境
所有示例代码已上传至GitHub仓库,可直接复用。