Postman中如何确保异步循环填充数组后再执行测试?
解决Postman中异步请求完成后执行测试用例的可靠方案
你的问题出在pm.sendRequest的使用方式上:当传入回调函数时,它不会返回Promise,导致代码里的await并没有真正等待请求完成,测试用例经常在transitionNamesArray还没填充完毕就提前执行,最终引发偶发失败。
以下是修复后的完整脚本,核心是改用pm.sendRequest的Promise返回形式,确保所有异步请求完成后再执行测试:
var jsonData = pm.response.json(); var getStateByIdUrl = pm.environment.get("host") + "/" + pm.environment.get("project-key") + "/states/"; var authToken = pm.environment.get("ctp_access_token"); let transitionsArray = jsonData.transitions; let transitionNamesArray = []; let transitionIdsArray = []; for (let i = 0; i < jsonData.transitions.length; i++) { transitionIdsArray.push(jsonData.transitions[i].id); } console.log(transitionIdsArray); async function getTransitionNames() { // 遍历所有transition ID,逐个发送请求并等待完成 for (let t = 0; t < transitionIdsArray.length; t++) { const getRequestTransitions = { url: getStateByIdUrl + transitionIdsArray[t], method: 'GET', header: { 'Authorization': 'Bearer ' + authToken } }; // 关键:不传回调函数,直接用pm.sendRequest返回的Promise,await会等待请求完成 const res = await pm.sendRequest(getRequestTransitions); const resJson = res.json(); transitionNamesArray.push(resJson.name['en']); console.log(transitionNamesArray); } // 所有请求完成后,再执行测试用例 pm.test("Transitions contain 'Partially Delivered' and 'Delivered'", () => { pm.expect(transitionNamesArray).to.include("Delivered"); pm.expect(transitionNamesArray).to.include("Partially Delivered"); }); } // 调用异步函数,捕获可能的错误避免静默失败 getTransitionNames().catch(err => { console.error("请求执行失败:", err); pm.test("异步请求执行失败", () => { pm.expect.fail("请求过程中出现错误: " + err.message); }); });
关键改动说明
- 移除回调函数:
pm.sendRequest在不传回调时会返回一个Promise,此时await才能真正等待请求响应返回,保证循环按顺序执行且每个请求都完成后再进入下一次迭代 - 添加错误捕获:异步函数调用后添加
.catch,避免请求出错时测试用例静默失败,同时主动标记测试失败,便于排查问题 - 测试用例后置:确保测试用例逻辑在所有请求完成、
transitionNamesArray完全填充后才执行
内容的提问来源于stack exchange,提问作者Hassan Shaikh
相关产品推荐
相关产品推荐

