2. Postman 环境变量和断言怎么用?
Postman 环境变量和断言,是区分“会调接口”和“会做接口测试”的关键。很多同学用 Postman 时,每次都手动改 URL、手动复制 Token、手动把订单号粘到下一个接口、手动看响应结果。这种方式可以临时调试,但不适合项目测试,也很难在面试中体现能力。
真正项目里的接口测试,需要可维护、可复用、可批量执行。环境变量解决的是“动态数据和环境切换”问题,断言解决的是“接口结果是否符合预期”问题。掌握这两点,Postman 才从调试工具变成轻量接口测试工具。
一、环境变量解决什么问题
环境变量可以理解为 Postman 里的动态配置。它能让你把经常变化的值抽出来统一管理。
常见变量包括:
base_url:接口域名;token:登录鉴权 Token;user_id:当前登录用户 ID;order_no:创建订单后返回的订单号;product_id:商品 ID;mobile:测试手机号;timestamp:时间戳或随机数。
如果不用变量,你可能要在几十个接口里手动改地址或参数;用了变量后,只需要改一个地方。
二、base_url 环境变量怎么用
假设测试环境域名是:
http://test-api.example.com
预发环境域名是:
http://pre-api.example.com
可以在不同 Environment 中配置同名变量:
base_url = http://test-api.example.com
请求 URL 写成:
{{base_url}}/api/login
切换环境时,不需要改接口路径,只要切换 Postman 右上角环境即可。
面试中可以这样说:环境变量能避免硬编码地址,提升接口集合在不同环境之间的复用性。
三、Token 如何动态保存和使用
登录接口通常会返回 Token。你不应该手动复制,而应该在登录接口 Tests 中自动保存。
响应示例:
{
"code": 0,
"token": "practice-xxx",
"user": {
"id": 1,
"username": "tester"
}
}
Tests 脚本:
const jsonData = pm.response.json();
pm.environment.set("token", jsonData.token);
pm.environment.set("user_id", jsonData.user.id);
后续接口 Header:
Authorization: Bearer {{token}}
这样每次重新登录后,Token 会自动刷新。
四、接口关联怎么做
接口关联就是把前一个接口返回的数据传给后一个接口。
例如创建订单接口返回:
{
"code": 0,
"order": {
"id": "NO10001",
"statusText": "待支付"
}
}
在 Tests 中保存订单号:
const jsonData = pm.response.json();
pm.environment.set("order_no", jsonData.order.id);
支付接口路径:
{{base_url}}/api/orders/{{order_no}}/pay
这就是业务流程串联。面试讲接口测试时,能讲出“登录提取 token、下单提取 order_no、支付引用 order_no”,就比单纯说会 Postman 强很多。
五、断言到底应该测什么
断言不是为了写脚本而写脚本,而是为了自动判断接口结果是否正确。
1. HTTP 状态码
pm.test("HTTP 状态码为 200", function () {
pm.response.to.have.status(200);
});
注意:HTTP 200 不代表业务成功,只是第一层断言。
2. 业务 code
pm.test("业务 code 成功", function () {
const jsonData = pm.response.json();
pm.expect(jsonData.code).to.eql(0);
});
很多公司接口会用 code 表示业务结果,必须断言。
3. message 提示
异常场景尤其要断言错误提示。例如密码错误、库存不足、未登录。
pm.test("错误提示正确", function () {
const jsonData = pm.response.json();
pm.expect(jsonData.message).to.include("库存不足");
});
4. 字段存在和类型
pm.test("返回订单号", function () {
const jsonData = pm.response.json();
pm.expect(jsonData.order.id).to.exist;
});
5. 数组长度
列表接口可以断言返回数量。
pm.test("商品列表不为空", function () {
const jsonData = pm.response.json();
pm.expect(jsonData.products.length).to.be.above(0);
});
6. 响应时间
pm.test("响应时间小于 1 秒", function () {
pm.expect(pm.response.responseTime).to.be.below(1000);
});
响应时间断言不等于性能测试,但能发现明显慢接口。
六、Pre-request Script 能做什么
Pre-request Script 是请求发送前执行的脚本。常用来生成随机数据、时间戳、签名参数。
例如生成随机手机号:
const mobile = "138" + Math.floor(Math.random() * 100000000).toString().padStart(8, "0");
pm.environment.set("mobile", mobile);
注册接口请求体就可以使用:
{
"mobile": "{{mobile}}",
"password": "123456"
}
这样可以避免重复手机号导致用例失败。
七、环境变量、全局变量、集合变量区别
简单理解:
- 环境变量:和环境相关,最常用,比如测试环境、预发环境;
- 全局变量:所有 Collection 都可用,但容易污染,不建议乱用;
- 集合变量:当前 Collection 内使用,适合项目内固定配置。
面试中可以说:我一般优先用环境变量管理域名和动态参数,避免使用过多全局变量造成冲突。
八、常见项目场景:订单链路变量设计
在电商项目中,可以设计这些变量:
base_url
username
password
token
user_id
product_id
order_no
执行顺序:
- 登录接口保存
token; - 商品列表接口保存
product_id; - 加购物车接口引用
product_id; - 创建订单接口保存
order_no; - 支付接口引用
order_no; - 查询订单接口断言订单状态。
这样一个 Collection 就能跑完整业务链路。
九、常见错误和避坑
1. 变量名不统一
比如前面保存 token,后面写 {{access_token}},就会导致鉴权失败。变量名要统一。
2. 没有选择环境
变量配置了,但右上角没有选择环境,请求中变量无法替换。
3. Token 过期没刷新
如果 Token 有有效期,回归前要先执行登录接口刷新 Token。
4. 断言太少
只断言状态码没有意义。关键接口至少要断言业务 code 和关键字段。
5. 断言太死
时间、随机 ID、动态金额等字段不要写死,应该使用变量或范围判断。
十、面试回答模板
如果面试官问“Postman 环境变量和断言怎么用”,可以这样回答:
我会用环境变量管理接口测试中的动态值和环境配置,比如 base_url、token、user_id、order_no。登录接口成功后,我会在 Tests 中解析响应,把 token 保存到环境变量,后续接口在 Header 里通过
Bearer {{token}}自动鉴权。创建订单后,我会提取订单号保存为变量,再给支付和查询订单接口使用。断言方面,我不会只看状态码,还会校验业务 code、关键字段、错误提示、数组长度和响应时间。对于核心接口,比如支付和下单,还会结合数据库确认订单状态和流水一致。
十一、常见追问
追问:环境变量和全局变量区别?
环境变量适合不同环境隔离,比如测试和预发;全局变量所有集合都能用,容易污染,一般不建议滥用。
追问:接口之间怎么传值?
在前一个接口 Tests 中解析响应,用 pm.environment.set 保存变量,后一个接口用 {{变量名}} 引用。
追问:断言失败怎么定位?
先看是 HTTP 状态码失败、业务 code 失败、字段断言失败还是响应时间超时;再结合请求参数、响应体、日志和数据库定位。
十二、练习清单
- 配置测试环境和预发环境
base_url; - 登录接口提取 token;
- 后续接口自动带 Token;
- 创建订单接口提取 order_no;
- 支付接口引用 order_no;
- 写状态码断言;
- 写业务 code 断言;
- 写字段存在断言;
- 写响应时间断言;
- 用 Runner 执行完整订单链路。
环境变量和断言是 Postman 的核心。你能把这两点讲清楚,就能证明你不是只会调接口,而是具备接口测试的基本工程化意识。
配套刷题:

