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

如何将JMeter Summariser统计数据写入.jtl文件?

如何将JMeter Summariser统计数据追加到.jtl文件

你的需求很明确——希望把Summariser在控制台输出的Avg、Max、Min、错误率这些统计数据,和原始样本数据一起写入到.jtl文件里。下面是基于你现有代码的修改方案:

核心思路

原代码中Summariser已经在后台收集测试的统计数据了,我们只需要在测试执行完成后,提取这些统计值,然后以CSV格式追加到.jtl文件的末尾即可。因为.jtl默认是CSV格式,所以追加的内容要保持格式一致,同时避免破坏原有样本数据的结构。

修改后的完整代码

import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.reporters.ResultCollector;
import org.apache.jmeter.reporters.Summariser;
import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class ResultExtractor {
    public static void main(String[] args) {
        StandardJMeterEngine jmeter = new StandardJMeterEngine();
        System.out.println("::>>>>>>>>>>>>>>JMETER engine intialized");
        JMeterUtils.loadJMeterProperties("./jmeter_project_data/apache-jmeter-3.3/bin/jmeter.properties");
        JMeterUtils.setJMeterHome("./jmeter_project_data/apache-jmeter-3.3");
        JMeterUtils.initLogging();
        JMeterUtils.initLocale();
        try {
            SaveService.loadProperties();
        } catch (IOException e) {
            e.printStackTrace();
        }
        File in=new File("./jmeter_project_data/JMXtestdata/test.jmx");
        System.out.println("::>>>>>>>>>>>>>>JMX file is passed");
        HashTree testPlanTree =null;
        try {
            testPlanTree = SaveService.loadTree(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        jmeter.configure(testPlanTree);
        System.out.println("::>>>>>>>>>>>>>>Confgurd test in jmeter");
        Summariser summer = null;
        String summariserName = JMeterUtils.getPropDefault("summariser.name", "summary");//$NON-NLS-1$
        if (summariserName.length() > 0) {
            summer = new Summariser(summariserName);
        }
        String logFile = "./jmeter_project_data/Result/jmeterresult.jtl";
        ResultCollector logger = new ResultCollector(summer);
        logger.setFilename(logFile);
        testPlanTree.add(testPlanTree.getArray()[0], logger);
        System.out.println("::>>>>>>>>>>>>>> Test Started");
        jmeter.run();
        System.out.println("::>>>>>>>>>>>>>> Test Finished");

        // 新增部分:提取Summariser统计数据并追加到.jtl文件
        if (summer != null) {
            // 提取核心统计指标
            long totalSamples = summer.getSampleCount();
            long errorSamples = summer.getErrorCount();
            double avgResponseTime = summer.getAverage();
            long maxResponseTime = summer.getMax();
            long minResponseTime = summer.getMin();
            // 计算错误率,避免除以0的情况
            double errorRate = totalSamples > 0 ? (errorSamples * 100.0) / totalSamples : 0.0;

            // 构建CSV格式的统计内容,用#标记为注释,不影响JMeter解析原有数据
            String statsHeader = "\n# Summary Statistics,Average(ms),Max(ms),Min(ms),Error Rate(%),Total Samples,Error Samples";
            String statsRow = String.format("\nSummary,%f,%d,%d,%f,%d,%d",
                    avgResponseTime, maxResponseTime, minResponseTime, errorRate, totalSamples, errorSamples);

            // 追加到.jtl文件末尾
            try (BufferedWriter writer = new BufferedWriter(
                    new FileWriter(logFile, StandardCharsets.UTF_8, true))) {
                writer.write(statsHeader);
                writer.write(statsRow);
                System.out.println("::>>>>>>>>>>>>>> 统计数据已成功追加到.jtl文件");
            } catch (IOException e) {
                System.err.println("写入统计数据失败:" + e.getMessage());
                e.printStackTrace();
            }
        }
    }
}

关键代码解释

  1. 提取统计指标:利用Summariser的内置方法直接获取所需数据:

    • getSampleCount():返回测试的总样本数
    • getErrorCount():返回执行失败的样本数
    • getAverage():返回所有样本的平均响应时间
    • getMax()/getMin():返回响应时间的最大值和最小值
    • 错误率通过(错误样本数/总样本数)*100计算,同时处理了总样本数为0的边界场景
  2. 写入文件:使用FileWriter的追加模式(第三个参数设为true)打开.jtl文件,将统计内容以CSV格式写入。我们用#开头标记统计行,这样既方便人工查看,又不会破坏JMeter对原有样本数据的解析逻辑。

  3. 格式兼容:统计行的结构和原始样本保持一致的CSV风格,确保文件整体格式统一,后续如果需要用JMeter重新导入.jtl文件,也不会出现格式错误。

注意事项

  • 确保你的项目依赖的JMeter包版本和代码中指定的apache-jmeter-3.3一致,避免版本兼容问题
  • 如果你的.jtl文件配置为XML格式(而非默认的CSV),需要调整写入内容为XML节点格式,不过大部分场景下.jtl默认是CSV格式
  • jmeter.run()是同步执行方法,测试完全结束后才会执行后续的统计写入逻辑,无需额外等待

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:05:03