JMeter汇总报告自定义问题:添加response Body列并导出含异常的CSV
JMeter自定义报告问题解决办法
问题1:能不能把结果树里的Response Body加到汇总报告里?
默认的JMeter汇总报告是用来统计请求聚合数据的(比如平均响应时间、错误率、吞吐量这些),不会保存单个请求的具体响应内容(比如Response Body)。如果要在报告里加Response Body,得自己写自定义监听器实现:
- 用JSR223 Listener(建议选Groovy语言,性能比其他脚本语言好),写代码抓每个请求的Response Body,再结合聚合逻辑生成带这个字段的自定义报告。大概思路是:
- 先创建CSV文件,写好表头(比如Label、Average、Response Body、Error这些)
- 把同一个Label下的所有请求响应时间收集起来,算平均值
- 抓Response Body和错误信息,测试跑完后把聚合结果加响应内容写入CSV
注意:硬往默认汇总报告里加Response Body会破坏它“统计整体数据”的定位,不如直接做一份包含单条请求详情的自定义报告更合适。
问题2:生成包含Average、Label、Error字段的简易报告,出错时把完整异常信息写入CSV
用JSR223 Listener加Groovy代码就能实现,步骤如下:
- 给测试计划加一个JSR223 Listener,设置语言为
Groovy - 在脚本框里写下面的代码(可以根据自己的需求改):
// 测试开始时初始化CSV文件,只执行一次 if (!vars.get("csvInitialized")) { def csvFile = new File("test_report.csv") csvFile.write("Label,Average,Error,Exception_Details\n") vars.put("csvInitialized", "true") // 存每个Label对应的所有响应时间 props.put("responseTimes", new HashMap<String, List<Long>>()) } // 获取当前请求的信息 def label = sampler.getLabel() def responseTime = ctx.getPreviousResult().getTime() def isError = ctx.getPreviousResult().isSuccessful() ? "No" : "Yes" def exceptionDetails = isError == "Yes" ? ctx.getPreviousResult().getResponseMessage() + "\n" + ctx.getPreviousResult().getResponseDataAsString() : "" // 把当前响应时间加到对应Label的列表里 def responseTimes = props.get("responseTimes") if (!responseTimes.containsKey(label)) { responseTimes.put(label, new ArrayList<Long>()) } responseTimes.get(label).add(responseTime) // 测试结束时计算平均值并写入CSV if (ctx.getThreadNum() == 0 && ctx.getPreviousResult().isTestEnded()) { def csvFile = new File("test_report.csv") responseTimes.each { entry -> def labelKey = entry.key def times = entry.value def average = times.sum() / times.size() // 判断该Label下是否有错误请求 def errorStatus = times.any { t -> !ctx.getPreviousResult().isSuccessful() } ? "Yes" : "No" def exception = errorStatus == "Yes" ? exceptionDetails : "" csvFile.append("${labelKey},${average},${errorStatus},${exception}\n") } }
- 跑测试后,指定路径下会生成
test_report.csv,直接导入Excel就行。
补充说明:
- 代码会自动把同一个Label的请求响应时间汇总,算出平均值(Average)
- 请求出错时,会把完整的响应消息和响应内容作为异常详情写到CSV里
- 如果不想要聚合平均值,要单个请求的响应时间,改改代码逻辑,直接写每条请求的响应时间就行
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

