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

如何在Taurus+JMeter中处理异步API并计算响应时间差

实现异步API时间差统计与输出

一、修正并完善Taurus YAML脚本

先修复原脚本的语法错误,同时添加时间提取、循环终止逻辑和时间差计算逻辑:

execution:
- concurrency: 10  # 替换为你的目标并发用户数
  ramp-up: 1m      # 替换为你的加压时长
  hold-for: 5m     # 替换为你的持续测试时长
  scenario: async-api-test

scenarios:
  async-api-test:
    requests:
      - label: Step One - 触发异步任务
        url: ${__V(First_API, '')}
        method: POST
        headers:
          Content-Type: application/json
          Authorization: ${token}
        body: |  # 替换为实际请求体内容
          {
            "key": "placeholder-value"
          }
        extract-jsonpath:
          Value: $.value
          CreateTime: $.CreateTime  # 提取任务创建时间

      - while: ${__jexl3("${status}" == "InProgress" || "${status}" == "",)}  # 初始无状态时进入循环,状态为InProgress时持续轮询
        do:
          - label: Step One - 轮询任务状态
            url: ${__V(Second_API, '')}/${Value}
            method: GET
            headers:
              Content-Type: application/json
              Authorization: ${token}
            extract-jsonpath:
              status: "$.status"
              UpdateTime: "$.UpdateTime"  # 提前提取更新时间,状态变为Done时会返回该值
            assert-jsonpath:
              - jsonpath: $.status
                validate: false  # 关闭断言,避免状态变为Done时请求被标记为失败
                expected-value: "InProgress"
            think-time: 2s  # 轮询间隔,避免高频请求压垮服务

      - label: Step Two - 确认任务完成
        url: ${__V(messages, '')}/${Id}
        method: GET
        headers:
          Content-Type: application/json
          Authorization: ${token}
        assert-jsonpath:
          - jsonpath: $.status
            validate: true
            expected-value: "Done"
        extract-jsonpath:
          UpdateTime: $.UpdateTime  # 确保提取到最终的任务完成时间
        jsr223-postprocessor:
          language: groovy
          script: |
            // 转换时间字符串为时间戳(假设时间格式为ISO8601,如"2024-05-20T12:34:56.789Z",格式需和实际返回匹配)
            def createTime = Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", vars.get("CreateTime"))
            def updateTime = Date.parse("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", vars.get("UpdateTime"))
            // 计算时间差(单位:毫秒,如需秒则除以1000)
            def timeDiff = updateTime.time - createTime.time
            vars.put("timeDiff", timeDiff.toString())
            // 将时间差设为样本变量,用于后续统计
            sampleResult.setSampleVariable("timeDiff", timeDiff.toString())

reporting:
- module: jmeter
  summary: true  # 在控制台显示汇总统计数据
  output-file: ./load-test-time-diff-results.csv  # 将结果输出到CSV文件
  csv:
    fields: timeDiff  # 指定要统计的时间差变量
- module: console
  disable: false
  show-trends: true  # 控制台实时显示测试趋势

二、关键实现说明

  1. 循环逻辑修正:

    • 调整while循环条件为判断status是否为InProgress(或初始为空),避免因请求成功但任务已完成而无效轮询
    • 关闭轮询请求的断言验证,防止任务状态变为Done时请求被标记为失败,确保循环正常终止
  2. 时间提取与差值计算:

    • 在触发任务的请求中提取CreateTime,在轮询和最终确认请求中提取UpdateTime,确保获取到准确的起止时间
    • 使用Groovy脚本(性能优于其他脚本语言)完成时间字符串到时间戳的转换,计算时间差并存储为变量
  3. 统计与输出:

    • 通过sampleResult.setSampleVariable将时间差标记为样本变量,JMeter会自动收集该变量的平均值、最小值、最大值等统计指标
    • 配置Taurus的reporting模块,将时间差统计结果输出到CSV文件,同时在控制台实时展示汇总数据

三、验证方式

  • 测试运行时,控制台会实时打印包含时间差平均值在内的统计数据
  • 测试结束后,CSV文件中会记录所有用户的时间差明细,以及整体的平均值、标准差等汇总指标
  • 若需更细致分析,可通过Taurus生成的JMX文件,在JMeter GUI中添加聚合报告组件,查看时间差的分布情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:52:28