深度分析JMeter生成的HTML报告存在的Bug

一、介绍

最近在给公司压测前端灰度这个案例发现了对于HTTP重定向请求,JMeter原生生成HTML报告结果统计与聚合报告结果对不上,细看JMeter这块源码发现对于重定向请求,JMeter生成HTML报告的确存在BUG,话不多说我们一步一步往下分析吧

二、分析案例

摸底清楚302请求,为什么客户端发起两次请求,聚合报告只有一次

  1. 首先我们先模拟出故障进行比对一下,

线程组配置:线程数1、循环次数1 ,理论上该配置jmeter客户端只会发出一次请求

在这里插入图片描述

  1. 如果上述HTTP请求配置对应的是重定向(302)请求,jmeter客户端会发出几次请求呢?,答案理所当然肯定是两次,为什么这么说,因为查看结果树统计到了两次请求,如下图
    在这里插入图片描述

  2. 那么问题来了,为什么聚合报告与查看结果树统计结果会存在差异呢?接下来我们通过JMeter源码来找出问题所在
    在这里插入图片描述

  3. 接下来我们将上述操作放行,后会如何?答案是还会再次执行executeRequest()方法发出第二次请求,看第二次请求的返回结果,如下图

由于整个链路其实很绕(怕讲述把大家绕晕),简单描述就是,对于302返回结果的请求,会在该类方法下面进行校验如果是302就会对最终目标结果发出第二次请求,大家断点定在这儿就行

在这里插入图片描述

  1. 所以上面的操作其实与我们查看结果树得到结果其实是相一致的,先是302请求,在是最后200的目标结果请求

  2. 但是大家可能会有疑问,为什么聚合报告只会统计一条请求数据呢?接下来我们分析重点部分

  3. 同样我们先执行302请求,请求完毕之后在sample()方法中会对该次结果进行校验,是否是重定向,如果是久获取到重定向请求获取到的“Location” ,这个会在响应头中体现 ,这个“Location”的作用就是第二次请求发起的目标地址了
    在这里插入图片描述

  4. 当执行到res = resultProcessing(areFollowingRedirect, frameDepth, res);该代码段时,就会对请求结果进行处理,通过HTTPSamplerBase类resultProcessing()方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  1. 从上面图大家可能会有疑问totalRes具体是哪一块?其实就是聚合报告的统计的那一条数据,也同样是查看结果树最外层统计的数据
    在这里插入图片描述

  2. 回过头看这就是为什么查看结果树发出两次请求,聚合报告则只有一次的原因

HTML报告存在的Bug分析

  1. 针对上面的请求,我们通过终端命令执行获取到HTML报告观察一下
    在这里插入图片描述
    在这里插入图片描述

  2. 从Statistics截图我们可以看出,total统计了请求次数是3次,这明显是一个Bug,那为啥会统计三次,是由于HTML报告都是通过jtl文件获得的,这也是为什么命令行要加上-l res.jtl这个参数,接下来我们看下res.jtl的内容吧
    在这里插入图片描述

  3. 所以由于res.jtl文件写入的就是三条导致Statistics统计的total对应的就是三条,那么为什么res.jtl会写入三条数据呢?大家是不是想到了之前分析的totalRes了,对了就是把查看结果树的数据写入了res.jtl了,ResultCollector调用sampleOccurred()方法
    在这里插入图片描述

  4. 通过CSVSaveService.saveSampleResult(event, out);代码段将结果写入jtl中
    在这里插入图片描述

  5. 接下来我们查看生成的jtl文件,对应的数据写入顺序是否与步骤4预期的一样
    在这里插入图片描述

  6. 由此我们可以推断对于重定向请求,生成的jtl文件是有问题的,这个问题会影响到HTML报告的统计数据准确性

目前已向apache JMeter提交了此issue,希望有用到HTML报告功能的小伙伴注意这块,避免入坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值