如何在JMeter中统计创建100条记录的总耗时及避免无限循环
问题描述
我需要统计应用创建100条记录的总耗时:首先调用接口触发100条记录计算的消息并传入相关请求体,之后系统执行耗时的后台计算,在未知时长后创建这些记录。我初步设想的方案如下:
--simple controller -- http request for triggering message for 100 records creation -- beanshell assertion (set total number of items created as 0) --while controller(number of total items is smaller than 100 records) -- http request to check number of items created so far -- JSON Extractor to extract total number of items -- beanshell assertion (set total number of items)
我希望统计100条记录创建完成的总耗时,同时需处理应用可能崩溃导致无法创建100条记录的情况,避免陷入无限循环。请问最优实现方式是什么?
最优实现方案
基于JMeter特性,结合你的需求,推荐以下落地性强的优化方案:
1. 初始化核心变量
在触发创建请求前,用User Defined Variables组件初始化3个关键变量:
targetCount = 100:目标创建记录数maxRetryTimes = 30:最大重试次数(根据后台平均处理能力设置,比如每次间隔10秒,30次对应5分钟,可按需调整)startTime = ${__time(,)}:用JMeter内置函数__time记录触发请求的毫秒级时间戳
2. 触发记录创建请求
保留原HTTP请求,调用接口触发100条记录的创建消息。
3. 重构While控制器终止条件
将原While控制器的判断条件替换为:
${__jexl3(${currentCount} < ${targetCount} && ${retryTimes} < ${maxRetryTimes},)}
- 新增
retryTimes变量,每次循环后自增1,达到最大重试次数则强制终止循环 currentCount为从检查接口获取的已创建记录数
4. 循环检查逻辑优化
循环内的步骤调整为:
- HTTP请求:调用查询已创建记录数的接口
- JSON Extractor:提取返回的已创建记录数,赋值给
currentCount(默认值设为0) JSR223 PostProcessor:用vars.put("retryTimes", String.valueOf(Integer.parseInt(vars.get("retryTimes")) + 1))实现重试次数自增Constant Timer:设置每次检查的间隔时间(比如10000毫秒,避免频繁请求压垮服务)
5. 统计总耗时与结果判定
循环结束后,用JSR223 PostProcessor做最终处理:
def endTime = System.currentTimeMillis() def totalTime = endTime - vars.get("startTime") as long def currentCount = vars.get("currentCount") as int def targetCount = vars.get("targetCount") as int if (currentCount == targetCount) { log.info("100条记录创建完成,总耗时:" + totalTime + "毫秒") vars.put("totalCost", totalTime.toString()) } else { log.error("达到最大重试次数,仅创建" + currentCount + "条记录,耗时:" + totalTime + "毫秒") AssertionResult.setFailure(true) AssertionResult.setFailureMessage("记录未全部创建,仅完成" + currentCount + "条") }
- 用Groovy替代BeanShell,执行效率更高、语法更简洁
- 同时覆盖成功创建和超时/崩溃两种场景的耗时统计
6. 额外优化点
- 所有BeanShell组件替换为
JSR223组件:JMeter对Groovy支持更完善,避免BeanShell的性能瓶颈 - 给检查接口的HTTP请求添加响应断言:若返回5xx等错误,直接标记异常终止循环,减少无效重试
- 通过
Summary Report或View Results Tree查看totalCost变量,获取最终耗时数据
内容的提问来源于stack exchange,提问作者newnick988888
相关产品推荐
相关产品推荐

