1. 概述

Apache JMeter 是一款基于Java的开源性能测试工具,主要用于分析和测量Web应用的性能表现。简单来说,它能帮我们模拟不同负载条件,测试服务器的整体性能表现。

JMeter提供了直观的GUI界面,方便我们定义测试计划、执行测试并查看报告。同时它也支持非GUI模式,允许我们通过命令行直接运行测试脚本。

本文将详细介绍如何通过命令行运行JMeter的.jmx文件,并灵活配置报告输出格式。

2. 环境准备

开始前,我们先准备一个用于演示的JMeter脚本。这里使用 https://postman-echo.com 提供的模拟REST接口作为测试目标。

主要步骤包括:

  1. 创建测试计划(Test Plan)和线程组(Thread Group)
  2. 配置HTTP请求采样器(HTTP Request Sampler)
  3. 添加汇总报告监听器(Summary Report Listener)

下面详细说明每个步骤:

2.1. 创建JMeter测试计划和线程组

通过JMeter GUI创建测试计划,首先添加线程组:

线程组配置

配置线程组参数:

  • 线程数:5
  • 启动时间(Ramp-Up Period):1秒
  • 循环次数:10

线程组参数设置

2.2. 配置HTTP请求采样器

在线程组中添加HTTP请求采样器:

HTTP请求采样器

配置采样器使用Postman Echo服务的GET接口:

  • 协议:https
  • 服务器名:postman-echo.com
  • 路径:/get
  • 参数:foo1=bar1&foo2=bar2

HTTP请求配置

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汇总报告

我们可以自定义汇总报告的输出字段和格式,主要有两种方式:

  1. 修改JMeter属性文件
  2. 通过命令行参数覆盖

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&amp;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&amp;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测试脚本并配置报告输出:

核心操作流程

  1. 使用 jmeter -n -t <脚本> -l <结果文件> 基础命令运行测试
  2. 通过修改 jmeter.properties 永久改变报告格式
  3. 使用 -J 参数临时覆盖属性配置

⚠️ 踩坑提醒

  • 命令行运行时需确保在JMeter的bin目录下执行
  • 属性修改后需重启JMeter才能生效
  • XML格式虽然结构化但体积较大,CSV更适合大数据量场景

命令行运行的优势

  • 节省GUI资源消耗
  • 便于集成到CI/CD流程
  • 支持参数化配置不同测试环境

所有示例代码已上传至GitHub仓库,可直接复用。


原始标题:Run JMeter .jmx File From the Command Line and Configure the Report File