k6异步请求队列处理:如何实现逐个等待响应再执行下一个请求
修正k6队列任务处理代码的问题
核心问题分析
你的代码存在几个关键错误,导致长耗时任务未正确等待、测试提前结束:
- 配置拼写错误:
optons应该是options,这会导致你设置的duration等配置完全不生效,测试会遵循默认规则提前结束。 - URL模板未替换:
{id}没有用模板语法替换为实际ID,请求的是错误的固定URL。 - 等待逻辑缺失:仅在收到非200状态时sleep60秒就推进到下一个任务,没有循环等待直到任务完成或超时。
- 超时配置不匹配需求:任务最长允许7分钟(420秒),但你设置的异步请求超时是780秒,测试总时长也未按需求设为30分钟。
- 断言逻辑错误:强制要求响应状态为200,但需求中任务超时应返回400,这会把合法的400判定为测试失败。
修正后的代码
import http from 'k6/http'; import { expect } from 'https://jslib.k6.io/k6chaijs/4.3.4.3/index.js'; import { check, sleep } from 'k6'; // 按需求处理4个目标任务ID const targetIds = ['1', '2', '3', '4']; // 任务最长允许执行时间:7分钟=420秒 const MAX_TASK_DURATION = 420; // 轮询任务状态的间隔:60秒,可按需调整 const POLL_INTERVAL = 60; const params = { timeout: `${MAX_TASK_DURATION}s`, // 异步请求超时匹配任务最长允许时间 }; export const options = { vus: 1, maxRedirects: 0, timeout: `${MAX_TASK_DURATION + 10}s`, // 单迭代超时略长于任务超时 duration: '30m', // 测试总时长设为需求的30分钟 }; export default async function () { for (const id of targetIds) { const url = `https://pagequeue.com/task/${id}`; console.info(`开始处理任务ID: ${id}`); let res; let elapsedTime = 0; let isTaskCompleted = false; // 循环轮询直到任务完成或超时 while (elapsedTime < MAX_TASK_DURATION) { res = await http.asyncRequest('GET', url, null, params); if (res.status === 200) { console.info(`任务ID ${id} 执行完成,耗时 ${elapsedTime}秒`); isTaskCompleted = true; break; } else if (res.status === 400) { console.warn(`任务ID ${id} 执行超时,返回400`); isTaskCompleted = true; break; } else { // 任务仍在处理中,等待后重试 console.info(`任务ID ${id} 处理中,当前状态: ${res.status},已耗时 ${elapsedTime}秒,继续等待...`); sleep(POLL_INTERVAL); elapsedTime += POLL_INTERVAL; } } // 处理超时未完成的情况 if (!isTaskCompleted) { console.error(`任务ID ${id} 超过最长允许时间(${MAX_TASK_DURATION}秒),强制标记为超时`); check({ status: 400 }, { '任务超时返回400': (r) => r.status === 400, }); continue; } // 验证响应状态为合法的200或400 check(res, { '响应状态合法': (r) => r.status === 200 || r.status === 400, }); // 断言允许200(成功)和400(超时)两种状态 expect(res.status).to.be.oneOf([200, 400]); } }
关键修正点说明
- 修正
options拼写错误,确保测试时长、超时等配置正常生效。 - 改用明确的目标ID数组,严格匹配需求的4个任务处理。
- 实现循环轮询逻辑,持续检查任务状态直到完成或达到最长允许时间。
- 对齐超时配置与需求:任务最长7分钟,测试总时长30分钟。
- 调整断言逻辑,允许200(任务成功完成)和400(任务超时)两种合法状态。
- 修复URL模板错误,正确替换ID参数。
内容的提问来源于stack exchange,提问作者Dariusz Andryskowski
相关产品推荐
相关产品推荐

