You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将JMeter聚合报告所有行合并为一行导出?

解决JMeter聚合报告导出为单行CSV的问题

你使用的--aggregate-rows参数对AggregateReport插件无效,这个参数是专门给PerfMon Metrics Collector插件设计的,用于聚合同一主机的多行性能指标,和AggregateReport的需求不匹配。要实现将所有请求的聚合结果合并为一行的格式,可以用以下两种方法:

方法一:用Groovy脚本直接从JTL生成单行CSV

通过Groovy调用JMeter的内置聚合逻辑,直接读取JTL文件并生成符合要求的单行CSV,步骤如下:

  1. 创建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(","))
}
  1. 替换脚本中的JMeter路径、JTL文件路径和输出文件路径;
  2. 在命令行执行脚本:
groovy generate-single-row-agg.groovy

方法二:用Python脚本转换现有多行CSV

如果已经用JMeterPluginsCMD导出了多行格式的CSV,可以用Python脚本将其转换为单行:

  1. 创建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)
  1. 替换脚本中的输入输出文件路径;
  2. 执行脚本:
python convert-to-single-row.py

如果你的需求是生成整个测试的总聚合数据(而非每个请求的指标合并),可以在JMeter GUI的AggregateReport中勾选「汇总行」,再导出CSV,此时会包含一行总统计数据。

内容的提问来源于stack exchange,提问作者coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:55:15