JMeter5.4.1 HTTP采样器固定线程/循环数下仅运行14次迭代排查
测试环境与问题背景
测试基于JMeter 5.4.1版本开展,在线程组A下仅配置单个HTTP采样器执行压测。
参数配置规则
线程数、循环数通过JMeter Properties传参,未配置测试持续时长、线程生命周期相关参数,仅单独配置Ramp-up参数;参数初始值可定义在测试计划UDV或外部user.properties文件中,在业务线程组正式启动前由setUp Thread Group运行时动态修改参数值,具体配置项如下:
- 线程数:
${__P(My_Number_Of_Threads)},支持setUp Thread Group运行时调整 - Ramp-up时间:
${My_Ramp_Up_Time},本次测试固定设置为0 - 循环次数:
${__P(My_Loop_Count)},支持setUp Thread Group运行时调整
异常现象
结果标识规则为「线程号-采样序号」,例:1-2代表1号线程执行的第2次采样
设置My_Loop_Count=5时各场景表现:
- 1线程场景:运行结果为1-1至1-5,共5次迭代,符合预期
- 2线程场景:运行结果为1-1至1-5、2-1至2-5,共10次迭代,符合预期
- 3线程场景:运行结果为1-1至1-5、2-1至2-4(缺失2-5采样)、3-1至3-5,共14次迭代,较预期15次少1次,不符合预期
- 4线程场景:运行结果为1-1至1-4(缺失1-5采样)、2-1至2-3(缺失2-4、2-5采样)、3-1至3-4(缺失3-5采样)、4-1至4-3,共14次迭代,较预期20次少6次,不符合预期
后续将My_Loop_Count调整为25时,测试仍仅执行14次迭代,与配置值偏差极大。
根因定位
前期通过记事本排查.jmx文件中值为14的配置项未找到匹配项,最终定位根因:测试计划中配置的CSV数据文件元件仅包含14条测试数据,且未开启**rewind on end of file(文件结束时倒回)**选项,触发异常org.apache.jorphan.util.JMeterStopThreadException: All records in the CSV file have been passed,导致线程提前终止。
运行时线程属性实际生效值查看方法
可通过两种方式在控制台输出线程组运行时实际生效的Thread Properties配置值,无需额外安装插件:
- JSR223元件+Groovy脚本打印
在线程组下添加任意JSR223元件(采样器/前置处理器/后置处理器均可),选择Groovy作为脚本语言,写入如下代码即可在JMeter控制台输出当前线程组的实际生效配置:
如需在所有业务线程启动前就打印全量配置,可将该JSR223元件添加到setUp Thread Group中,在正式逻辑启动前完成配置值输出校验。import org.apache.jmeter.threads.JMeterContextService def threadGroup = ctx.getThreadGroup() println "===== 线程组运行时实际配置 =====" println "线程组名称:" + threadGroup.getName() println "当前活跃线程总数:" + JMeterContextService.getNumberOfThreads() println "当前线程编号:" + ctx.getThreadNum() println "当前线程已执行迭代次数:" + ctx.getVariables().getIteration() println "线程组配置的单线程循环次数:" + threadGroup.getLoopController().getLoops() println "Ramp-up时间(秒):" + threadGroup.getRampUp() println "==============================" - 开启JMeter线程模块调试日志
修改JMeter安装目录下bin/log4j2.xml文件,添加如下日志配置,重启JMeter后即可在控制台和jmeter.log文件中看到线程组初始化时加载的实际参数值:
该日志会在线程组启动阶段输出每个线程的初始化参数、循环配置、调度配置等全量运行时信息,可直接比对传参值与实际加载值是否一致。<Logger name="org.apache.jmeter.threads" level="debug" />
内容的提问来源于stack exchange,提问作者Gribbet4Eva
相关产品推荐
相关产品推荐

