JMeter不仅可以用GUI来调试和录制,推荐在命令行下执行真正的负载测试,因为命令行方式占用的资源少得多,避免了GUI 渲染对测试结果的干扰。
基本命令
最常见的执行方式就是在JMeter的bin目录下运行:
bash
jmeter -n -t 测试计划.jmx -l 结果.jtl -e -o 报告目录
各参数作用:
-n:非 GUI 方式,这是命令行运行的基础参数,必须加上。
-t:指定测试计划文件(.jmx)。
-l:指定测试结果日志文件(一般为 .jtl 或 .csv)。
-e:测试结束后自动生成 HTML 报告。
-o:HTML 报告的输出目录(必须为空或不存在,JMeter 会自动创建)。
常用命令行参数详解
运行控制类
-n:切换到非 GUI 方式,无图形界面,内存和 CPU 开销更小。
-t [文件途径]:加载 .jmx 测试计划。
-l [结果文件]:将原始测试结果写入指定文件。如果文件已存在,会被包括;要想追加,用 -j 参数(但一般不推荐,因为可能导致统计混乱)。如果文件名以 .csv 结尾,默认保存为 CSV 格式,否则为 XML。
-e:在测试结束后根据 -l 指定的结果文件生成 HTML 仪表盘报告。
-o [目录]:HTML 报告的输出目录,必须是一个不存在或空文件夹。
-f:强制删除已有报告目录后再生成报告,等同于先手动清空再执行 -e -o。
日志和调试
-j [日志文件]:指定 JMeter 自身的运行日志文件(如 jmeter.log)。如果不指定,默认写到 jmeter.log。
-L [日志级别]:设置 JMeter 日志级别,如 ERROR、WARN、INFO、DEBUG。可配合日志组件排查问题。
-r 或 -R:远程测试相关,稍后说明。
属性和变量包括
-J[属性名]=[值]:在命令行直接设置 JMeter 属性,如 -Jusers=100。这很常用,可以在不改动 .jmx 的情况下动态控制线程数、循环次数等。
-G[属性名]=[值]:向所有远程服务端发送全局属性,用于分布式测试。
-D[系统属性]=[值]:设置 Java 系统属性,如 -Djava.rmi.server.hostname=127.0.0.1。
-S[系统属性]:等同于 -D。
-q [属性文件]:额外加载一个属性配置文件,可以批量补充自定义属性。
远程执行和分布式测试
-r:启动所有在 jmeter.properties 中 remote_hosts 里定义的远程服务端并执行测试(不启动本地)。
-R [主机1],[主机2]:启动指定的远程服务端执行测试,不依赖 remote_hosts 的配置。
-X:退出远程服务端,较少用到。
其他辅助
-v:显示 JMeter 版本号。
-h:打印完整的命令行帮助信息。
-d [目录]:指定额外 JAR 包目录,用于添加插件或自定义函数。
-s:以服务端方式启动,用于分布式测试中的远程节点监听请求。
-H [代理主机] 和 -P [代理端口]:设置代理,一般用不着,因为测试计划里可配置。
场景示例
1. 基础执行并生成报告
bash
jmeter -n -t testplan.jmx -l result.jtl -e -o ./report
测试完成后会在 ./report 里生成丰富的 HTML 报告,包括响应时间、吞吐量、错误统计图表。
2. 不生成报告,只保存结果
bash
jmeter -n -t test.jmx -l results.csv
去掉 -e -o 即可。
3. 动态设置线程数、不断时间
bash
jmeter -n -t test.jmx -Jthreads=50 -Jduration=300 -l result.jtl
在 .jmx 中使用 ${__P(threads, 10)} 引用属性,命令行传值即可包括默认值 10。
4. 先执行,后续单独生成报告
bash
jmeter -n -t test.jmx -l result.jtl
jmeter -g result.jtl -o ./report
先用 -g 参数把已有的 .jtl 结果文件转为 HTML 报告(注意 -g 和 -e -o 类似,但 -g 只生成报告而不执行测试)。
5. 分布式测试
在一台控制机上编辑好 jmeter.properties 中的 remote_hosts,然后执行:
bash
jmeter -n -t script.jmx -r -l result.jtl
这会命令所有远程代理机同时向目的服务器施压,结果汇总回控制机。