Postman变量需按生命周期、API和作用域正确使用:环境变量须选中有效环境且名合规;全局变量跨请求有效但UI不显示;data仅Collection Runner注入;局部变量仅当前请求内有效,优先级最低。

Postman 脚本中设置变量不是“写完就生效”,关键看你在哪个生命周期阶段操作、用哪个 API、作用域是否匹配——多数失败都卡在这三点上。
Pre-request Script 里设环境变量,为什么 {{xxx}} 不解析?
常见现象:脚本里写了 pm.environment.set("token", "abc123"),但 URL 或 Header 里写 {{token}} 仍报错或为空。
- 必须确保当前已选中一个有效环境(右上角环境切换器不显示 “No environment”)
-
pm.environment.set()设置的是 当前环境 的变量,不是全局或集合变量,别混用pm.globals.set() - 变量名不能含空格或特殊字符(如
auth token),否则{{auth token}}会解析失败;改用auth_token或在脚本中用方括号取值:pm.environment.get("auth token") - 如果脚本执行后仍不生效,打开 Console(底部标签页)检查是否有报错,比如
Cannot read property 'set' of null—— 这说明环境未加载,不是代码问题
Tests 脚本里提取响应数据并存为全局变量,后续请求却拿不到?
典型场景:登录接口返回 {"token": "xyz"},你想在 Tests 里存成全局变量供其他请求用,但下个请求的 {{token}} 是空的。
- 必须用
pm.globals.set("token", jsonData.token),而不是pm.variables.set()(后者是局部变量,只在当前脚本内有效) - 确保响应确实是 JSON 格式,否则
pm.response.json()会抛错;加 try/catch 或先判断pm.response.headers.get("Content-Type") - 全局变量设置后不会自动同步到 UI 面板的 “Current Value”,但脚本中
pm.globals.get("token")能取到 —— 别依赖面板刷新来验证 - 如果用了多个集合,注意全局变量是跨集合的,但若某集合的 Pre-request Script 又覆盖了同名变量,就会被覆盖
Collection Runner 批量跑 CSV 时,data.xxx 在 Pre-request Script 里是 undefined?
错误做法:在单个请求点 “Send” 时,试图用 data.price 读 CSV 字段,结果报 Cannot read property 'price' of undefined。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
-
data对象只在 Collection Runner 执行期间注入,单次发送请求(Send 按钮)时它根本不存在 - Runner 启动前必须先选择 CSV 文件,并确认首行是合法表头(如
user_id,amount,不能是用户ID,金额) - 字段含空格时,不能用点号访问:
data["Lojistik Maliyeti"]✅,data.Lojistik Maliyeti❌ - 数值类字段要显式转换:
pm.environment.set("amount", Number(data.amount)),否则传到 body 里还是字符串
局部变量(pm.variables.set)到底有什么用?
很多人设了 pm.variables.set("tmp_id", 1001),然后在 Tests 里 pm.variables.get("tmp_id") 能拿到,但在下一个请求里就失效了 —— 这不是 bug,是设计如此。
-
pm.variables.set()创建的是仅当前请求生命周期内有效的变量,连 Pre-request → Request → Tests 这个链路都只活一次 - 它适合临时计算、中间状态缓存,比如生成一个随机订单号仅用于本次请求的 body,不需透出到其他请求
- 别指望它能跨请求传递数据;需要跨请求,必须用
pm.globals.set()或pm.environment.set() - 没有对应的 UI 管理界面,也不能用
{{tmp_id}}插值,只能在脚本里通过pm.variables.get()访问
最容易被忽略的一点:变量作用域优先级是 local pm.environment.set("base_url", "https://dev.api"),而全局变量里也有 base_url,那后续所有 {{base_url}} 都走环境变量 —— 即使你没意识到自己覆盖了它。










