Postman预请求脚本无法修改集合变量问题排查求助
Postman预请求脚本修改集合变量不生效问题解决
我在Postman中编写了预请求脚本,试图根据发送请求的响应状态码修改集合变量status_code,同时编写测试脚本验证响应状态码,但实际运行时,即使响应码为200,脚本仍读取之前的403旧值,集合变量未被成功修改。
预请求脚本(Pre-Request Script)
let user_id = pm.collectionVariables.get("user_id"); pm.sendRequest(`http://security.postman-breakable.com/account/${user_id}/summary`, function (err, response) { if(response.status == "FORBIDDEN") pm.collectionVariables.set("status_code", 403); else if(response.status == "OK") pm.collectionVariables.set("status_code",200); });
测试脚本(Test)
let status_code = parseInt(pm.collectionVariables.get("status_code")); pm.test(`Status code is ${status_code}`, function () { pm.response.to.have.status(status_code); });
问题原因
pm.sendRequest默认是异步执行的——预请求脚本不会等待该请求的回调函数执行完毕就会结束,而测试脚本在主请求完成后立即运行,此时回调里的集合变量赋值操作还未执行,因此读取到的是之前的旧值。
解决方法
将异步请求改为同步执行,使用async/await语法确保变量赋值完成后再执行后续流程。修改后的预请求脚本如下:
(async () => { let user_id = pm.collectionVariables.get("user_id"); const response = await pm.sendRequest(`http://security.postman-breakable.com/account/${user_id}/summary`); if (response.status === "FORBIDDEN") { pm.collectionVariables.set("status_code", 403); } else if (response.status === "OK") { pm.collectionVariables.set("status_code", 200); } })();
通过自执行异步函数包裹代码,用await等待请求响应返回后再执行变量赋值,这样预请求脚本结束前status_code已经被更新为最新值,测试脚本就能读取到正确的状态码了。
内容的提问来源于stack exchange,提问作者semih
相关产品推荐
相关产品推荐

