如何将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(); } } } }
关键代码解释
提取统计指标:利用
Summariser的内置方法直接获取所需数据:getSampleCount():返回测试的总样本数getErrorCount():返回执行失败的样本数getAverage():返回所有样本的平均响应时间getMax()/getMin():返回响应时间的最大值和最小值- 错误率通过
(错误样本数/总样本数)*100计算,同时处理了总样本数为0的边界场景
写入文件:使用
FileWriter的追加模式(第三个参数设为true)打开.jtl文件,将统计内容以CSV格式写入。我们用#开头标记统计行,这样既方便人工查看,又不会破坏JMeter对原有样本数据的解析逻辑。格式兼容:统计行的结构和原始样本保持一致的CSV风格,确保文件整体格式统一,后续如果需要用JMeter重新导入.jtl文件,也不会出现格式错误。
注意事项
- 确保你的项目依赖的JMeter包版本和代码中指定的
apache-jmeter-3.3一致,避免版本兼容问题 - 如果你的.jtl文件配置为XML格式(而非默认的CSV),需要调整写入内容为XML节点格式,不过大部分场景下.jtl默认是CSV格式
jmeter.run()是同步执行方法,测试完全结束后才会执行后续的统计写入逻辑,无需额外等待
内容的提问来源于stack exchange,提问作者Subham Mohapatra
相关产品推荐
相关产品推荐

