☰
Postman实战指南:环境变量、测试脚本与集合自动化
2026/10/13 10:34:56 网站建设 项目流程

说实话,第一次用 Postman 的时候,我完全没觉得它有多厉害。无非就是填个 URL,点一下 Send,看个 JSON 返回结果,跟用浏览器访问网页好像没什么本质区别。直到后来我开始接手稍微正式一点的项目,要对接第三方登录、要处理不同环境的域名切换、要给后端同事复现一个带鉴权的 bug,才发现自己当初对 Postman 的理解连皮毛都算不上。

我见过太多人把 Postman 当成一个“高级点的网页浏览器”在用:请求全靠手工拼,参数换来换去,环境切来切去全靠手改 URL,接口文档靠截图发群里。这样用不是不行,但效率极低,而且特别容易出错。尤其是当你需要同时维护开发环境、测试环境、生产环境三套地址,或者需要在一个流程里先登录拿 Token、再带着 Token 去查数据的时候,基础用法和高效用法之间的差距就不是“快一点”那么简单了,而是“能不能用”的区别。

这篇文章我打算从一个实际干活的角度,把 Postman 真正的基础功拆开揉碎讲一遍。不是照着官方文档念一遍,而是按照我自己的使用习惯,把一个接口从零开始调通、把零散请求整理成资产、把手工操作变成半自动化验证的整个路径走一遍。内容覆盖请求编排、集合管理、环境变量、测试脚本、批量执行和持续监控,既有操作步骤,也有我自己踩过的坑。适合刚接触 Postman 的初学者,也适合那些已经用了很久但总觉得差点意思的“熟练工”。

1. 别把 Postman 当成“能发请求的工具”,它是你的接口工作台

很多新手教程的第一句话就是“Postman 是一款 API 调试工具”,这个说法没错,但它把 Postman 说小了。你真正把它用起来之后会发现,它更像是一个围绕接口生命周期展开的工作台,从你开始设计请求、调试参数、验证返回,到把它整理成文档、分享给同事、纳入自动化测试,全都可以在这一个软件里完成。

1.1 与其记菜单,不如先理解四个核心区域

打开 Postman,第一眼看到的东西很多:左侧边栏、顶部的请求编辑区、中间的响应区、底部的状态栏,还有各种面板。新手最容易犯的毛病就是试图把所有按钮都记住,结果越记越乱。我的建议是,你只需要先理解四个核心区域,其他的往后自然就熟了。

第一个是左侧边栏,这里面放的是你的集合(Collections)、历史记录(History)和 API 文档入口。你可以把它理解成文件管理器,所有保存过的请求都在这里归类存放。第二个是请求编辑区,也就是顶部那一栏,可以选请求方法、填 URL、配参数、写 Headers、设置 Body,这是你日常工作最主要的操作区域。第三是响应区,发送请求后返回的状态码、响应时间、返回体都在这里展示,调试的大部分信息都从这块看。第四是右上方和环境选择器、环境变量相关的区域,这是 Postman 最值钱的地方,后面我会单独讲。

理解了这四个区域,你其实已经能完成 80% 的日常请求调试了。剩下的那些面板和入口,都是在这些基础功能之上长出来的,等到有具体需求的时候再学,效率远高于一开始就抱着界面挨个点一遍。

1.2 历史记录不是你偷懒的借口

Postman 默认会记录你发送过的所有请求,左侧边栏的 History 里可以随时找到之前调过的接口,点击一下就能重新加载。这个功能确实方便,但我不太建议依赖它。

原因很简单:History 是按时间排列的,没有任何归类逻辑。你今天调了登录接口,明天查了订单列表,后天改了个用户信息,它们全都在一长串记录里。三天之后你想找回“那个查订单的请求”,得翻半天。而且一旦你清理缓存或者换了电脑,这些历史记录说没就没了。

我自己的习惯是,任何请求只要调试通过,立刻把它保存到对应的 Collection 里,并且起一个有意义的名字。哪怕这个接口还在频繁改动,保存的也是最新的可用版本。这花不了你十秒钟,但能帮你省掉未来无数次“翻历史记录找不到”的时间。记住,History 是临时草稿纸,Collection 才是你的正式笔记本。

2. 从发第一个请求到把请求编排明白

铺垫了这么多,该上手了。我假设你已经装好了 Postman,打开之后面对的是一个空荡荡的界面。现在我们来走一遍完整的请求发送流程,从最简单的 GET 开始,一直到带鉴权的 POST,看每一步到底在干什么。

2.1 请求方法、URL 和参数,这三者的关系没那么简单

新建一个请求的入口有好几个,最直接的是点击界面左上角的 Plus 或者 New 按钮。先选请求方法,最常用的是 GET 和 POST,这个选择不是随便点的,它对应的是后端接口的设计方式。GET 一般用于获取数据,参数拼在 URL 后面;POST 一般用于提交数据,参数放在 Body 里。你在做接口联调的时候,如果对端接口文档写着“创建订单用 POST”,你非要图省事用 GET 去调,大概率会得到一个 405 Method Not Allowed,或者更隐蔽的——后端框架自动把请求重写了,返回的数据格式完全不对。

先拿一个公开的接口练手吧,假设我们要请求https://api.example.com/v1/users?page=1&size=20。在 URL 栏输入地址,然后点击 Params 标签,你会看到 Postman 已经自动把 URL 里的page=1&size=20解析成了两个键值对。这时候你直接在表格里改参数值,URL 会跟着同步变化,不需要手动去改那一长串地址。这个小功能新手经常忽略,但实际联调的时候非常有用,尤其是参数数量多的时候,比在 URL 里肉眼找问号和 & 符号高效太多了。

再往下看,还有 Authorization、Headers、Body、Pre-request Script、Tests 这几个标签页。新手阶段,你主要关注 Headers 和 Body 就行。Headers 里面最常见的就是 Content-Type 和 Accept。你请求一个接口,返回的是 JSON,那 Accept 一般设成application/json;你 POST 数据过去,Body 选 raw 格式,旁边会自动加上Content-Type: application/json。这些 Header 不是摆设,后端会根据它决定怎么解析你的请求、怎么序列化返回数据。

2.2 Body 的四种格式,到底选哪个

Body 标签里通常有 none、form-data、x-www-form-urlencoded、raw、binary 这几种可选格式。新手最纠结的就是 form-data 和 x-www-form-urlencoded 有什么区别,以及什么时候用 raw。

简单说,x-www-form-urlencoded 是把数据编码成key=value&key2=value2的形式,适合提交简单的文本字段,跟表单提交是一个套路。form-data 则是 multipart/form-data,它不编码数据,适合上传文件,一个 key 对应一个文件路径或者文本。raw 就是不加工原生数据,你写什么就发什么,一般配合 JSON 使用,这也是现在前后端分离项目里最常见的交互方式。

现代接口基本都是 JSON 交互,所以我的默认选择是 raw 加 JSON。只有在上传文件或者老系统表单提交的时候,我才会切到 form-data。格式选错的后果是什么?后端解析不到你的字段,返回一个空对象或者解析失败的错误,你大概率会先怀疑自己参数名写错了,排查半天最后才发现是格式选错了。

2.3 鉴权怎么处理:从手动填 Token 到自动关联

现实中的接口很少有不带鉴权的。最简单的做法是在 Headers 里手动加一个Authorization: Bearer <token>,或者某些项目用自定义的X-TokenHeader。但这存在一个麻烦的问题:Token 通常会过期,过期之后你要重新登录拿新的,再手动替换。

Postman 给我们准备了更好的办法,就是 Authorization 标签页。它可以帮你记住鉴权类型,比如 Basic Auth、Bearer Token、OAuth 2.0 这些。你选择 Bearer Token,然后在右侧输入框填上 Token 值,请求发出的时候 Postman 会自动帮你带上 Authorization 头,不需要你手动去 Headers 里拼字符串。

不过这些都是初级的。真正高效的做法是在登录接口的 Tests 脚本里面写一段代码,把返回的 Token 自动存到环境变量里,后续所有请求都自动读取这个变量。这一招等讲到环境变量那一节,我再用完整的例子演示。这里你只需要先建立一个认知:Token 这种东西,不应该是你每次拿手去填的,它必须被自动化地管理起来。

3. Collections 的价值,不止是“存个请求”那么简单

前面我提到要把调通的请求保存到 Collection 里。这一节我详细讲讲 Collections 到底是什么,以及它凭什么能把零散的请求变成真正可复用、可分享、可自动化的资产。

3.1 集合的组织逻辑:按模块拆,不要按时间堆

创建集合很容易,左侧栏点 Collections 旁边的加号,输入一个名字,一个集合就建好了。但怎么组织集合,才是考验项目管理能力的地方。

我见过很多人建集合特别随意,一个叫“测试”的集合里,从登录到下单到退款全堆在一块,好几十个请求没有任何命名规则,只能靠接口路径猜意思。这种集合建了跟没建一样,别人看不懂,自己的维护成本也高。

我自己的组织方式是:先按业务模块建集合,然后在集合内部再按功能点建文件夹。举个例子,一个电商项目,我会建一个“商城 App 接口”的集合,下面分“用户模块”“商品模块”“订单模块”“支付模块”四个文件夹,每个文件夹里放对应功能的请求。请求的命名规则统一是“功能描述 - 场景”,比如“获取用户信息 - 正常返回”“获取用户信息 - Token 过期”。这样命名的一个好处是,跑自动化测试的时候,测试报告里一眼就能看出哪个场景挂了。

Postman 的 Collections 在较新的版本里还支持直接导入接口定义文件,比如 OpenAPI/Swagger 的 JSON 或 YAML 文件。如果你后端同事已经写好了接口文档,你能直接导入,POST、GET、参数、返回结构全给你生成好,省掉大量手工建请求的时间。基础用法阶段可能还遇不到这种场景,但知道有这条捷径,等需要的时候会省很多事。

3.2 集合级别的操作:一键跑完所有请求

集合的价值在于可以批量执行,但很多人在基础阶段就忽略了。集合的右侧菜单里有一个 Run Collection 的选项,点开之后会出现 Collection Runner 的配置界面。你可以勾选要执行的请求,选择执行顺序,配置迭代次数和数据文件,然后一键跑完整个集合。

这个功能是接口回归测试的利器。你不需要写一行代码,就能把几十个请求按顺序跑一遍,Postman 会记录每个请求的通过情况、耗时、返回数据。配合接下来要讲的测试脚本,它能直接告诉你哪些接口响应异常,而不是让你一个个手点。我用的一个模拟项目里,每次后端代码有大的改动,我都会先把这个集合跑一遍,基本上 5 分钟就能确认核心链路是不是通的。这种“心里有底”的感觉,靠手动点是永远体会不到的。

4. 环境变量与全局变量:把硬编码从你的请求里赶出去

这是我认为最值得单独花一整节讲的基础功能。Postman 的变量机制,是它从“好用”变成“专业”的分水岭。你一旦学会了,就再也回不去手填 URL 和 Token 的日子了。

4.1 变量的层级与优先级

Postman 里的变量按照作用范围从大到小排序,大致是 Global、Collection、Environment、Data、Local 这几个层级。排在前面的作用范围更大,但排在后面的优先级更高。也就是说,如果全局变量和环境变量重名了,Postman 会优先用环境变量里的值。这个设计很合理,你可以在全局放一组兜底值,在具体环境里放覆盖值。

Environment(环境变量)是最常用的。比如我同时对接开发、测试、生产三套环境,它们的接口域名不同,数据库配置不同,但接口路径是一模一样的。如果不做环境变量,我需要给每个环境各建一套请求,要么就是每次切换环境手动改 URL。而用环境变量的话,我只要配置三个环境,每个环境里定义{{base_url}}这个变量,分别指向对应的域名,请求网址统一写成{{base_url}}/api/v1/users。切换环境的时候,下拉菜单点一下,所有请求就自动变成对应环境的地址了。这个操作极大地降低了联调出错的概率,因为你不再会因为忘记改 URL 里的一个数字而把测试环境的请求打到生产环境上。

4.2 变量的定义与引用

变量的定义有两种方式:一种是在环境管理面板里手工添加键值对,比如变量名token,初始值填null,当前值填具体的 Token 字符串;另一种是通过脚本动态设置,比如pm.environment.set("token", responseJson.token),这是后面要讲的自动关联 Token 的关键。

引用方式就是在 URL、Headers、Body、断言脚本里写{{变量名}}。注意,这个双花括号语法只对请求内容起作用,在脚本代码里读写环境变量要用pm.environment.get()和pm.environment.set()。

我举一个完整的例子。假设有个接口,需要先用手机号和验证码登录,拿到 Token,然后再带着 Token 去查用户详情。在没有变量机制之前,你的流程是:

  1. 调登录接口,从返回结果里复制 Token
  2. 切到查详情的请求,手动把 Token 粘贴到 Header 里
  3. 点击发送

这套操作有个致命的坏处:只要 Token 过期,你就要重复一遍复制粘贴。而且不同人的电脑上,Token 的值还不一样,导致其他人调试同一个接口的时候,必须先去跑一遍登录。有变量机制之后,流程变成了:

  1. 在环境变量里定义token,初始值随意
  2. 在登录请求的 Tests 脚本里写:var jsonData = pm.response.json(); pm.environment.set("token", jsonData.data.token);
  3. 查详情的请求,Header 里写Authorization: Bearer {{token}}

这样,你先调一次登录接口,Token 会被自动写入当前环境,之后所有请求都会自动带上最新的 Token。Token 过期了,再调一次登录即可,不需要做任何复制粘贴。这个过程在 Postman 里被叫作“请求间数据关联”,它是你从入门迈向进阶的第一道坎,迈过去了,后面学什么都会顺很多。

4.3 不要在生产环境里犯这种错误

用环境变量最怕的其实不是不熟悉语法,而是环境切换漏了。我身边真实发生过这样的案例:同事在环境选择器里一直放着“开发环境”,结果要连生产环境验证一个数据修复,他直接改了请求里的几个参数就发了,完全没意识到域名还是开发环境的地址。幸好当时只是查询接口,没有造成写操作,不然就是事故。

所以我的习惯是,凡是配置了生产环境的环境变量,都会在环境名后面加一个醒目的标注,比如“生产 - 不要随便乱发”。甚至在一些关键请求的 Pre-request Script 里写一段检查脚本,判断pm.environment.get("env_name")等于生产环境就弹一个确认框。这属于防御性编程的思想,基础阶段可能用不上,但从一开始养成这个意识,能避免很多低级但严重的失误。

5. 测试脚本与断言:把“肉眼检查”变成“自动检查”

很多人的 Postman 使用流程停留在“发送请求,看一眼返回结果,判断对不对”。这在请求少的时候没问题,但请求一多,或者需要反复验证同一个接口的边界条件时,肉眼检查就不可靠了。你在连点十次请求之后,很容易产生视觉疲劳,漏掉返回体里某个字段值的变化。Postman 的 Tests 脚本就是为了解决这个问题而存在的。

5.1 测试脚本是在请求返回之后执行的

先建立这个概念:Postman 一个请求的完整生命周期是:Pre-request Script(发送前)→ 发出请求 → 收到响应 → Tests(返回后)。Pre-request Script 常用于设置一些请求前才需要的动态数据,比如生成签名、时间戳;Tests 里则写对返回结果的验证逻辑。基础用法阶段,你主要用 Tests。

为什么叫 Tests?因为这里面的代码就是对接口返回结果做断言(Assertion)。一个最简单的断言是:状态码应该等于 200。

pm.test("状态码是 200", function () { pm.response.to.have.status(200); });

这段代码的意思是,执行一个名为“状态码是 200”的测试,判断响应的状态码是否为 200。跑完之后,Postman 会在 Tests 标签页里显示这条测试是 PASS(绿)还是 FAIL(红)。你不需要懂太多 JavaScript,只需要会用几个固定的断言模式,就能覆盖大多数验证场景。

5.2 常用的断言套路

除了状态码断言,我日常用得最多的还有三类。第一,判断返回体里某个字段的值:

pm.test("返回码是 0", function () { var jsonData = pm.response.json(); pm.expect(jsonData.code).to.eql(0); });

第二,判断响应时间是否在可接受范围内:

pm.test("响应时间小于 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); });

第三,判断返回数组有数据:

pm.test("订单列表不为空", function () { var jsonData = pm.response.json(); pm.expect(jsonData.data.list.length).to.be.greaterThan(0); });

依赖响应很快、返回体结构复杂的时候,这种自动断言的价值会非常明显。尤其是你在调一个分页接口,想确认第二页能不能正常返回数据,与其盯着返回结果数半天,不如写一个pm.expect(jsonData.data.list.length).to.eql(10),一眼看清 PASS 还是 FAIL。

5.3 关联数据那几个写法,很多人第一次都写不对

前面提到把登录返回的 Token 自动写入环境的写法,我这里再把完整代码贴一遍:

var jsonData = pm.response.json(); if (jsonData.code === 0 && jsonData.data.token) { pm.environment.set("token", jsonData.data.token); } else { console.log("登录失败,未能获取 token"); }

这个写法的关键在于,你要先清楚接口实际的返回结构。有的接口 Token 字段是data.token,有的是data.access_token,还有的藏在 Headers 里返回,写法都不一样。我的经验是,先结合 Swagger 文档确认返回结构,再写脚本,不要凭空猜。另外,代码里加一个失败的兜底分支也是个好习惯,万一登录接口本身挂了,至少你能从 console 里看到原因。

还有一点要注意,pm.environment.set()存在一个隐藏的坑:它写的是当前环境的变量。如果你当时环境选择器里选的是“开发环境”,Token 就写进开发环境;如果选的是“测试环境”,就写进测试环境。如果你没选任何环境,脚本会报错或者写不进变量。所以跑自动关联脚本之前,先确认环境选择器的状态,这一点很容易被忽略,尤其是在你同时配置了多个环境的情况下。

6. 批量执行与持续验证:让 Postman 帮你盯着接口

把单个请求调试好、断言写好之后,你其实已经拥有了一个非常轻量级的接口测试工具。这一节我来实际操作一遍 Collection Runner 和 Monitors,讲清楚怎么从“调一个接口”走向“跑一批接口”。

6.1 用 Collection Runner 跑一遍你的回归用例

假设你现在手上有一个集合,里面包含了 6 个请求:登录、拿用户信息、拿订单列表、创建订单、修改订单状态、删除订单。每个请求都已经写好了断言。现在后端同事告诉你,他把订单模块的代码重构了一遍,让你帮忙验证一下核心链路有没有问题。

你的做法如果是挨个点开这些请求,手动发送,然后肉眼检查六个返回结果,那大概需要 5 到 10 分钟,而且很容易看漏。用 Collection Runner 的话,操作是:

  1. 点击集合右侧的 Run 按钮
  2. 在弹出的 Runner 窗口里,选择要执行的请求顺序。注意,Runner 默认按字母顺序或者你在窗口里拖动的顺序执行,所以你要确认登录请求在最前面,因为后面的请求依赖它产生的 Token
  3. 点击 Run Collection 按钮

跑完之后,你会看到一份报告,列出了几个请求分别成功与否、断言通过多少、失败多少、每个请求的耗时。如果订单列表断言失败了,说明重构后的返回结构有变化;如果创建订单失败了,说明 POST 逻辑出了问题。整个过程两三分钟就搞定,比你手动点一遍少花好几倍的时间,而且结果是量化的、可对比的——只要断言写得好,PASS 和 FAIL 不会骗人。

这里有一个细节值得注意:Runner 默认是并行还是串行?很多新手在这里踩坑。Runner 的执行模式是可以选择的,如果你想模拟真实用户的串联操作,比如先登录后下单,一定不要勾选并行执行,而是要按顺序执行,并开启请求间的数据持久化,让登录脚本写入的 token 在后续请求中生效。如果勾选错了,你会在第二个请求的断言里看到一堆鉴权失败的错误,这其实是执行模式的问题,不一定是接口本身有问题。

6.2 用 Monitors 把接口监控挂到云端

Collection Runner 解决的是“我想测的时候跑一下”的问题。但有时候接口是给外部客户用的,半夜挂了你也得第一时间知道。Postman 的 Monitors 就是干这个的,它能把你的集合定期跑起来,比如每隔 15 分钟跑一次,挂了或者断言失败了,会通过邮件、Slack 之类的渠道通知你。

它的配置方式不复杂:在集合右侧菜单里选 Monitor Collection,填一个名字,选择执行频率,选择要跑的环境变量,然后创建。之后你就能在 Monitors 选项卡里看到每次运行的历史记录和通过率。

不过我要提醒一句,Monitors 是运行在 Postman 云端的,它跑不了那些依赖本地文件、本地服务的请求。也就是说,你本机起的 Mock Server、连内网数据库的接口,它都访问不到。所以在用 Monitors 之前,你要确保集合里的请求都是可以通过公网地址访问的。

6.3 Runner 跑出来的失败,不一定是接口的锅

这是我最想强调的一个实操心得。用 Runner 批量跑接口的时候,经常会出现这样的场景:昨天还全部 PASS 的集合,今天跑完突然红了五六个请求。我的第一反应不是找后端改代码,而是先去检查环境配置。

最常见的原因是环境变量被污染了。假设你昨天在调试别的功能时,脚本里把token写成了null,或者从别的地方拿了一个无效值覆盖到了当前环境,那么 Runner 里所有依赖 token 的请求都会鉴权失败。这时候你去看报告,表面上像是接口问题,其实根因在变量本身。

我的排查顺序是:先看全部失败还是部分失败;全部失败优先怀疑认证问题,比如 token 失效、base URL 配错;部分失败则优先怀疑接口改动,比如返回结构变了、某个新参数校验不过。确认完这两点,再决定要不要找后端。这套排查思路能帮你省下很多“无效沟通”的时间,也让你在同事眼里显得更专业。

7. 我自己踩过的坑,以及你现在就可以开始做的三件事

基础内容基本讲完了。最后这一节我不打算再介绍什么新功能,而是把我从实际项目中滴出的几个教训放出来,再给你一个明确的行动清单。

7.1 状态码 200 不代表接口是对的

这是我最想敲黑板强调的一点。很多初学者判断一个接口是否正常,只看状态码是不是 200。但现代后端接口的返回里,状态码经常只是一个传输层的信号,真正的业务结果都在返回体的 code 字段里。接口完全可能返回 HTTP 200,但 body 里写着code: 500001, message: "订单金额不能为负数"。如果你只看状态码,就会错以为接口是成功的,后端改没改你都察觉不到。所以我写了那么多测试脚本,第一条永远都是pm.expect(jsonData.code).to.eql(0)这种业务断言,而不是只断言状态码。养成这个习惯,你调试接口的命中率会高很多。

7.2 命名、注释、导出:你的请求也是代码

有太多人把自己的 Collection 当成私人草稿箱用,请求名全是“新建请求 (2)”“新建请求 (3)”这种。直到有一天你需要把接口信息发给新来的同事,或者自己三个月后回来看,才发现根本看不懂当时的请求是干嘛的。

我的做法是:每次保存请求前,花十秒时间命名、写 description。Postman 的请求描述框支持 Markdown,你可以在里面写清楚这个接口的功能、入参说明、常见的报错码,简直就是一个轻量级接口文档。集合本身也支持统一导出,你可以导成 JSON 分享给别人,别人导入之后看到的还是你的命名和描述结构。这些看似不起眼的习惯,决定了你的 Postman 是你的“工作资产”还是“临时角落”.

7.3 现在就开始做的三件事

如果你看到这里觉得信息量有点大,没关系,你不需要一口气全用上。我建议你先做三件事,把基础打牢。

第一,把手里所有调过的请求都归到 Collection 里,按模块建文件夹,给每个请求起一个有意义的名字。这个过程可能花掉你半小时,但是很值。第二,建三个环境变量,分别是开发、测试、生产,各自定义base_url,然后把所有请求的 URL 里的域名替换成{{base_url}}。做完这一步,你就再也不会因为切换环境手改 URL 出错了。第三,为登录接口写一个 Tests 脚本,把 token 自动写入环境变量,然后让后续请求的鉴权头引用{{token}}。三步做完,你就已经完全脱离“手动复制粘贴”的初级阶段了。

Postman 这个工具,上手很容易,但用得好不好,取决于你有没有把它当一回事。自动化、变量化、结构化这套思路,听起来好像很复杂,其实拆到每个动作上,都只是十秒钟的小操作。关键在于,你是不是愿意在项目刚开始的时候多花这十秒钟。以我自己的经验来看,前期愿意花在工具上的这点时间,到后期会十倍百倍地赚回来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询