如何将JMeter聚合报告所有行合并为一行导出?
解决JMeter聚合报告导出为单行CSV的问题
你使用的--aggregate-rows参数对AggregateReport插件无效,这个参数是专门给PerfMon Metrics Collector插件设计的,用于聚合同一主机的多行性能指标,和AggregateReport的需求不匹配。要实现将所有请求的聚合结果合并为一行的格式,可以用以下两种方法:
方法一:用Groovy脚本直接从JTL生成单行CSV
通过Groovy调用JMeter的内置聚合逻辑,直接读取JTL文件并生成符合要求的单行CSV,步骤如下:
- 创建Groovy脚本文件(比如
generate-single-row-agg.groovy),内容如下:
import org.apache.jmeter.report.processor.AggregateConsumer import org.apache.jmeter.save.SaveService import org.apache.jmeter.reporters.ResultCollector import org.apache.jmeter.util.JMeterUtils import java.io.File // 初始化JMeter环境,替换为你的JMeter安装路径 JMeterUtils.setJMeterHome("/opt/apache-jmeter-5.6.3") JMeterUtils.loadJMeterProperties(JMeterUtils.getJMeterHome() + "/bin/jmeter.properties") JMeterUtils.initLocale() // 读取JTL文件,替换为你的结果文件路径 File jtlFile = new File("result.jtl") ResultCollector resultCollector = new ResultCollector() resultCollector.setSaveConfig(SaveService.loadProperties(JMeterUtils.getJMeterHome() + "/bin/jmeter.save.saveservice.properties")) def results = resultCollector.readFile(jtlFile) // 计算所有请求的聚合指标 AggregateConsumer aggregateConsumer = new AggregateConsumer() aggregateConsumer.consume(results) def aggregatedData = aggregateConsumer.getAggregateResult() // 构建单行CSV的表头和数据 def headers = [] def values = [] aggregatedData.each { sampleLabel, metrics -> // 添加当前请求的所有指标表头和值 headers.addAll([ "${sampleLabel}_样本数", "${sampleLabel}_平均值", "${sampleLabel}_中位数", "${sampleLabel}_90%线", "${sampleLabel}_95%线", "${sampleLabel}_99%线", "${sampleLabel}_最小值", "${sampleLabel}_最大值", "${sampleLabel}_错误率", "${sampleLabel}_吞吐量", "${sampleLabel}_接收KB/sec", "${sampleLabel}_发送KB/sec" ]) values.addAll([ metrics.getCount(), metrics.getMean(), metrics.getMedian(), metrics.getPercentile90(), metrics.getPercentile95(), metrics.getPercentile99(), metrics.getMin(), metrics.getMax(), metrics.getErrorPercentage(), metrics.getThroughput(), metrics.getReceivedKBPerSec(), metrics.getSentKBPerSec() ]) } // 写入输出文件,替换为你的目标文件路径 File outputFile = new File("agg-single-row.csv") outputFile.withWriter { writer -> writer.writeLine(headers.join(",")) writer.writeLine(values.join(",")) }
- 替换脚本中的JMeter路径、JTL文件路径和输出文件路径;
- 在命令行执行脚本:
groovy generate-single-row-agg.groovy
方法二:用Python脚本转换现有多行CSV
如果已经用JMeterPluginsCMD导出了多行格式的CSV,可以用Python脚本将其转换为单行:
- 创建Python脚本(比如
convert-to-single-row.py),内容如下:
import csv # 替换为你的输入和输出文件路径 input_csv_path = "agg-cmd2.csv" output_csv_path = "agg-single-row.csv" headers = [] values = [] with open(input_csv_path, 'r', encoding='utf-8') as input_file: reader = csv.DictReader(input_file) for row in reader: sample_label = row['Label'] # 遍历当前请求的所有指标,跳过Label列 for key, value in row.items(): if key == 'Label': continue headers.append(f"{sample_label}_{key}") values.append(value) # 写入单行CSV with open(output_csv_path, 'w', newline='', encoding='utf-8') as output_file: writer = csv.writer(output_file) writer.writerow(headers) writer.writerow(values)
- 替换脚本中的输入输出文件路径;
- 执行脚本:
python convert-to-single-row.py
如果你的需求是生成整个测试的总聚合数据(而非每个请求的指标合并),可以在JMeter GUI的AggregateReport中勾选「汇总行」,再导出CSV,此时会包含一行总统计数据。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

