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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:47:22