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

JMeter使用Transaction Controller时汇总报告平均响应时间异常咨询

JMeter汇总/聚合报告总平均计算逻辑及修正方案

为什么Transaction Controller会被纳入总平均计算?

JMeter的汇总、聚合报告默认会把所有生成采样结果的组件都纳入统计,包括Transaction Controller——它本质是一个特殊采样器,默认会输出自身的聚合耗时(即该控制器下所有请求的总执行时间)。所以你的测试里实际有8个采样数据:6个请求采样器 + 2个Transaction Controller采样器,总平均就是这8个数据的总和除以8,这就是你看到85ms的原因。

如何修正总平均计算逻辑(同时保留控制器和请求的统计)

因为你需要同时展示Transaction Controller的整体加载时间和单个请求的响应时间,不能用Generate Parent Sampler(开启后控制器不会生成自身采样结果,也就看不到整体统计),可以用以下几种方案:

方案1:用报告过滤器拆分统计

  • 新建两个聚合/汇总报告:
    • 第一个报告:设置排除模式为^你的Transaction Controller名称前缀.*(比如控制器叫“页面加载流程1”“页面加载流程2”,就填^页面加载流程.*),这样这个报告的总平均就只计算6个请求的响应时间;
    • 第二个报告:设置包含模式为^你的Transaction Controller名称前缀.*,专门展示两个控制器的整体加载时间及平均;
  • 这种方法简单直接,能同时满足两种统计需求。

方案2:用JSR223脚本自定义计算正确平均

如果需要在同一报告里展示自定义的总平均,可以通过脚本收集数据:

  1. 在测试计划根节点添加JSR223 Sampler(放在最前面),初始化变量:
    vars.put('totalRequestTime', '0')
    vars.put('requestCount', '0')
    
  2. 在每个请求采样器(注意是请求,不是控制器)下面添加JSR223 PostProcessor,写入:
    def time = prev.getResponseTime()
    def total = vars.get('totalRequestTime') as int
    def count = vars.get('requestCount') as int
    vars.put('totalRequestTime', (total + time).toString())
    vars.put('requestCount', (count + 1).toString())
    
  3. 测试结束后,添加JSR223 Listener,计算并输出正确平均:
    def avg = (vars.get('totalRequestTime') as int) / (vars.get('requestCount') as int)
    log.info("所有请求的正确平均响应时间:" + avg + "ms")
    // 如果要在报告里展示,可以把值存入属性,再通过自定义报告列调用
    props.put('correctAvg', avg.toString())
    

方案3:自定义HTML Dashboard模板

如果用JMeter的HTML Dashboard报告,可以修改模板文件(默认在JMeter安装目录/bin/report-template下):

  • 找到统计总平均的逻辑代码,添加过滤条件,排除Transaction Controller的采样器后再计算总平均;
  • 这种方法适合需要定制化报告的场景,修改后生成的Dashboard会自动展示正确的总平均,同时保留控制器的统计模块。

关于你的预期计算方式

  • 如果你要的是所有请求的平均:用方案1的第一个报告,或者方案2的脚本计算,结果就是6个请求的时间总和除以6;
  • 如果你要的是两个控制器的平均:用方案1的第二个报告,直接取两个控制器时间的平均值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:51:12