Blazemeter:如何在YAML脚本中实现异步API调用?
问题描述
我有两个API接口,分别为POST和GET请求。向POST请求发送JSON数据后,接口会返回一个id,我需要使用该id发起GET请求。由于测试的是大数据场景(如10k-15k行数据),必须等待id对应的任务生成完成才能执行GET请求。
当前使用的Blazemeter(Taurus)YAML脚本如下:
--- execution: - concurrency: 30 ramp-up: 1m hold-for: 10m scenario: 5K_Export Excel scenarios: 5K_Export Excel: store-cache: false store-cookie: false use-dns-cache-mgr: false variables: calcEngineId: ${calcEngineId} url: ${url} data-sources: # path of .csv files for ${calcEngineId}, ${url} and ${bearerToken} requests: - label: Post Pivot Data url: ${url}/${calcEngineId}/exportPivotDataToExcel follow-redirects: true method: POST headers: Content-Type: application/json User-Agent: ApacheJMeter Authorization: Bearer ${bearerToken1} content-encoding: UTF-8 think-time: 30s timeout: 2m extract-jsonpath: jobId: $.id body: # body of POST request - label: Export To Excel url: ${url}/${calcEngineId}/exportPivotDataToExcel/${jobId} follow-redirects: true method: GET headers: Content-Type: application/octet-stream User-Agent: ApacheJMeter Authorization: Bearer ${bearerToken1} content-encoding: UTF-8 think-time: 1m timeout: 2m
我通过extract-jsonpath提取id并存储到jobId变量中,随后将jobId用于GET请求的URL。但在Blazemeter中运行时,GET请求返回Bad Request,推测是发起GET请求时jobId对应的任务尚未生成完成。尝试在POST和GET请求之间添加60秒固定等待,仅小数据量场景正常,大数据量场景问题依旧。
请问如何在YAML脚本中实现异步调用的等待逻辑?还有其他解决方法吗?
解决方案
固定等待时间无法适配大数据量下的任务处理波动,最优方案是主动轮询任务状态,直到任务完成后再执行GET请求。以下是两种可行的实现方式:
方式1:基于任务状态接口的轮询(推荐)
如果有查询任务状态的API,通过轮询该接口判断任务是否完成:
requests: - label: Post Pivot Data url: ${url}/${calcEngineId}/exportPivotDataToExcel follow-redirects: true method: POST headers: Content-Type: application/json User-Agent: ApacheJMeter Authorization: Bearer ${bearerToken1} content-encoding: UTF-8 think-time: 30s timeout: 2m extract-jsonpath: jobId: $.id body: # body of POST request # 新增轮询任务状态的请求 - label: Poll Job Status url: ${url}/${calcEngineId}/exportPivotDataToExcel/${jobId}/status method: GET headers: Content-Type: application/json User-Agent: ApacheJMeter Authorization: Bearer ${bearerToken1} extract-jsonpath: jobStatus: $.status # 假设接口返回的状态字段为status,值为completed表示完成 repeat: while: ${jobStatus} != "completed" # 状态未完成则继续轮询 delay: 10s # 每次轮询间隔10秒 max-times: 30 # 最大轮询30次(共5分钟),避免无限循环 - label: Export To Excel url: ${url}/${calcEngineId}/exportPivotDataToExcel/${jobId} follow-redirects: true method: GET headers: Content-Type: application/octet-stream User-Agent: ApacheJMeter Authorization: Bearer ${bearerToken1} content-encoding: UTF-8 timeout: 2m
方式2:直接重试GET请求(无状态接口时使用)
如果没有任务状态接口,直接重试GET请求直到返回成功响应:
requests: - label: Post Pivot Data # 原POST请求配置不变... extract-jsonpath: jobId: $.id - label: Export To Excel url: ${url}/${calcEngineId}/exportPivotDataToExcel/${jobId} follow-redirects: true method: GET headers: Content-Type: application/octet-stream User-Agent: ApacheJMeter Authorization: Bearer ${bearerToken1} content-encoding: UTF-8 timeout: 2m repeat: while: ${response-code} != 200 # 响应码不是200则重试 delay: 10s max-times: 30
关键说明
- 轮询间隔(
delay)和最大次数(max-times)可根据实际任务处理时长调整,平衡等待效率和资源消耗。 - Taurus的
repeat结合while条件支持动态控制请求执行逻辑,完美适配异步任务的等待场景,比固定think-time更可靠。
内容的提问来源于stack exchange,提问作者Sravan
相关产品推荐
相关产品推荐

