如何在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 # 控制台实时显示测试趋势
二、关键实现说明
循环逻辑修正:
- 调整while循环条件为判断
status是否为InProgress(或初始为空),避免因请求成功但任务已完成而无效轮询 - 关闭轮询请求的断言验证,防止任务状态变为
Done时请求被标记为失败,确保循环正常终止
- 调整while循环条件为判断
时间提取与差值计算:
- 在触发任务的请求中提取
CreateTime,在轮询和最终确认请求中提取UpdateTime,确保获取到准确的起止时间 - 使用Groovy脚本(性能优于其他脚本语言)完成时间字符串到时间戳的转换,计算时间差并存储为变量
- 在触发任务的请求中提取
统计与输出:
- 通过
sampleResult.setSampleVariable将时间差标记为样本变量,JMeter会自动收集该变量的平均值、最小值、最大值等统计指标 - 配置Taurus的
reporting模块,将时间差统计结果输出到CSV文件,同时在控制台实时展示汇总数据
- 通过
三、验证方式
- 测试运行时,控制台会实时打印包含时间差平均值在内的统计数据
- 测试结束后,CSV文件中会记录所有用户的时间差明细,以及整体的平均值、标准差等汇总指标
- 若需更细致分析,可通过Taurus生成的JMX文件,在JMeter GUI中添加聚合报告组件,查看时间差的分布情况
内容的提问来源于stack exchange,提问作者Sagar Kovi
相关产品推荐
相关产品推荐

