Postman 接口测试入门:从发请求到写断言

上一篇《左移右移的三道防线》结尾我说过,方法论系列 6 篇完结,接下来从"想明白"到"做出来"------用 Postman + JavaScript 把这套方法论真正落到工具里。

这一篇是这个新系列的开篇,把 Postman 从"我用来点点点的工具"升级成"接口自动化的入口"。整篇用一个贯穿案例------优惠券领券接口的测试------把"发请求、写断言、保存用例"三步讲透。

核心判断

Postman 不是一个"发请求的工具"------它是接口自动化的工作台:环境变量、请求模板、脚本、断言、批量执行,全在同一个工具里闭环。

很多人用 Postman 只用到了 20%:Send 按钮一点,看一眼响应,关掉走人。本质上 Postman 在他手里就是一个"图形化的 curl"。但 Postman 真正的威力在另外 80%:Tests 脚本、Pre-request、环境变量、Collection Runner------把"我手动跑"变成"机器自动跑、可重复跑、可批量跑"。

这篇就把那 80% 的入口------发请求、写断言、保存用例------打通。

第一步:搭好工作台

解决什么:用 Postman 之前,先把"环境、Collection、环境变量"这三件套准备好。没有这三件套,所有操作都是一次性的,谈不上自动化。

怎么做:

  1. 建一个 Collection:Collection 是 Postman 里"一组请求的容器",相当于一个项目。你后续所有的请求、脚本、用例都装在 Collection 里。
  2. 建一个 Environment :Environment 是一组"环境变量",比如 base_url、token、user_id 都在这。测试环境一套、生产环境一套,切换时一键换环境,不用改请求。
  3. 变量引用 :请求里所有"会变"的值都用 {{变量名}} 引用,不要写死。比如:
bash 复制代码
{{base_url}}/coupon/receive
Authorization: Bearer {{token}}

为什么必须做这一步 :如果你把"测试环境的 URL"硬编码在每个请求里,切换环境时要改 N 个请求;用 {{base_url}} 引用,切换环境只改 Environment 一个地方。这就是自动化的种子------把"重复的配置"抽成变量。

最小工作台长这样:

text 复制代码
📁 Collection:优惠券系统接口测试
  📂 领券模块
    📄 领券接口(POST /coupon/receive)
    📄 查询券详情(GET /coupon/detail)
  📂 下单模块
    📄 下单接口(POST /order/create)
🔧 Environment:测试环境
  - base_url:https://test-api.example.com
  - token:<登录后填>
  - test_user_id:10086

口诀 :Collection 装请求,Environment 装配置,请求里只放 {{变量}}。

第二步:把"手动点点点"变成"可复用的请求模板"

解决什么:用 Postman 点一次能调通接口,但如果不保存,这个请求就是"一次性的"。做自动化必须把"能跑通的请求"沉淀成模板,下次直接调。

怎么做:以领券接口为例,看一个请求的四要素。

案例:领券接口

要素 例子
URL {{base_url}}/coupon/receive
Method POST
Headers Content-Type: application/json、Authorization: Bearer {{token}}
Body(JSON) { "userId": "{{test_user_id}}", "couponTemplateId": "tpl_100_minus_20" }

填好后,点 Send 验证一次------确认能跑通。

然后点 Save,存到"领券模块"这个文件夹下。

为什么必须 Save :Save 之后这个请求才"存在"于你的 Collection 里。下次做联调、做回归、做交接------任何人打开这个 Collection 都能直接调这个请求,不用从头填。这就是"请求模板"的价值:把一次性的手动操作变成可复用的资产。

口诀:能跑通的请求必 Save,Save 之后才有"用例"可言。

进阶习惯:填 Description

每个请求的 Description 里写两行:

  • 这个接口是干什么的
  • 调用前需要什么前置条件

例:

text 复制代码
用途:为指定用户领取一张优惠券实例
前置:用户已登录(token 有效)、优惠券模板存在

这是写给"三个月后的自己"和"接手的同事"看的,省一遍又一遍问"这接口是啥意思"。

第三步:写断言------让"我看一眼"变成"机器自动判"

解决什么 :Send 之后,Postman 会显示响应。但"看一眼"是手动行为------你点一次、看一次、关掉,下次还要再点再看。断言就是让 Postman 自动判断"这次请求是不是符合预期",符合就绿勾,不符合就红叉。

怎么做 :点开请求下方的 Tests 标签页,写 JavaScript 脚本。

最常用的三个断言:

javascript 复制代码
// 1. 状态码断言:HTTP 状态码是不是 200
pm.test("状态码是 200", function () {
    pm.response.to.have.status(200);
});

// 2. 响应体断言:返回的 JSON 里某字段是否符合预期
pm.test("返回了券实例 ID", function () {
    const json = pm.response.json();
    pm.expect(json.couponId).to.exist;          // 字段存在
    pm.expect(json.couponId).to.be.a("string");  // 类型是字符串
    pm.expect(json.couponId).to.have.lengthOf(20); // 长度符合预期
});

// 3. 响应头断言:比如 Content-Type 是 JSON
pm.test("响应是 JSON", function () {
    pm.expect(pm.response.headers.get("Content-Type"))
      .to.include("application/json");
});

写完点 Send,Tests 标签页会显示每个断言的通过/失败结果------绿的通过,红的失败。

口诀:没断言的请求等于没测试。Send 不是结束,断言通过才是。

为什么断言这么重要:

  • 回归场景里,你要跑几十上百个请求,不可能一个个看响应
  • 断言让 Postman 变成"自动判卷老师"------你点一次 Collection Runner,它跑完所有请求,自动告诉你"哪几个挂了"
  • 没有断言,就没有自动化;有断言,机器才能替你判断对错

进阶:把"单次请求"变成"一条完整用例"

前面三步做完后,你已经能"发请求 + 断言 + 保存"了。但这只是"半自动"------你点 Send 才跑一次。真正的"用例"还要做到两件事:

Pre-request Script:跑请求前的"造数 / 准备"

解决什么 :很多接口不是孤立能调通的------调用前需要"用户已登录"、"购物车已有商品"、"账户有余额"。这些前置条件在 Tests 里没法做,要放在 Pre-request Script(请求前执行)。

案例:领券接口的 Pre-request Script

javascript 复制代码
// Pre-request Script:先登录拿 token,再调领券
pm.sendRequest({
    url: pm.environment.get("base_url") + "/user/login",
    method: "POST",
    header: { "Content-Type": "application/json" },
    body: {
        mode: "raw",
        raw: JSON.stringify({
            username: "user_yang",
            password: "test123"
        })
    }
}, function (err, res) {
    if (err) {
        console.log("登录失败", err);
        return;
    }
    // 把登录返回的 token 存到环境变量
    pm.environment.set("token", res.json().token);
});

关键点 :Pre-request 脚本每次跑都重新登录、拿新 token------不是"用一次残留 token 跑一百次",而是"每次都是新的 token"。这就是上一篇《造数工厂》的思想在 Postman 里的具体落地:数据按需创建,不依赖残留。

Tests 后置:跑完的"清理 + 数据回传"

解决什么 :用例跑完后要"清理"------领的券要还回去、创建的订单要取消;还要"回传"------把响应里的 couponId 存起来给后续请求用。

案例:领券接口的 Tests 后置

javascript 复制代码
// Tests:断言 + 回传数据
pm.test("领券成功", function () {
    pm.response.to.have.status(200);
    const json = pm.response.json();
    pm.expect(json.couponId).to.exist;

    // 把 couponId 存到环境变量,给后续"下单用券"接口用
    pm.environment.set("coupon_id", json.couponId);
});

// 后置清理:跑完后把券退回
pm.sendRequest({
    url: pm.environment.get("base_url") + "/coupon/return",
    method: "POST",
    header: {
        "Content-Type": "application/json",
        "Authorization": "Bearer " + pm.environment.get("token")
    },
    body: {
        mode: "raw",
        raw: JSON.stringify({ couponId: pm.environment.get("coupon_id") })
    }
});

口诀:Pre-request 造前置,Tests 断结果 + 传数据 + 清理------三个动作一套用例。

一个完整的用例长这样

把上面所有要素拼起来,一条标准的接口自动化用例长这样:

text 复制代码
📄 领券接口(POST /coupon/receive)
  ├─ 描述:用例-领券成功-默认模板
  ├─ URL:{{base_url}}/coupon/receive
  ├─ Method:POST
  ├─ Headers:Content-Type、Authorization
  ├─ Body:{ userId, couponTemplateId }
  ├─ Pre-request Script:先登录拿 token
  ├─ Tests:
  │   ├─ 断言:状态码 200
  │   ├─ 断言:返回 couponId
  │   └─ 动作:存 couponId 到环境变量 + 调退回券接口
  └─ 状态:✅ 通过(最近一次跑)

这一条用例 = 一个可重复运行、可自动判结果、不依赖残留数据的测试。这才是 Postman 自动化的最小单元。

三步法心法回顾

  1. 搭工作台 ------Collection 装请求、Environment 装配置、请求里只用 {{变量}}
  2. 存请求模板------能跑通的必 Save,附 Description
  3. 写断言------没断言的请求不算测试;Pre-request 造前置、Tests 断结果 + 传数据 + 清理

一句话心法:Postman 的价值不在 Send 按钮,在 Tests 脚本和变量串联------把它从"图形化 curl"升级成"接口自动化工作台"。

三个常见误区

误区一:只点 Send,不 Save。请求关掉就没了,下个迭代要重填。把"能跑通的请求"沉淀成模板,是自动化的起点。

误区二:只发请求不写断言 。跑完看一眼响应没问题就关掉------这是手动测试,不是自动化。没有断言,就没有自动化可言。

误区三:把 Postman 当"个人工具",不组织 Collection 。所有请求平铺,三个月后自己都找不到。Collection 按"业务模块"分文件夹,每个文件夹下放该模块的所有接口------这是后续做"按模块回归"的基础。

写在最后

这一篇是新系列的开篇,核心只做了一件事:把 Postman 从"图形化 curl"升级成"接口自动化工作台"。

入口就是三步:搭工作台、存请求模板、写断言。Pre-request 和 Tests 脚本是让用例"自给自足"的关键------自己造前置、自己断结果、自己传数据、自己清理。

下一篇讲《环境变量与 Pre-request Script:接口串联的骨架》------多个接口怎么串成一条链路?领券 → 加购物车 → 下单 → 支付,怎么让上一个接口的输出自动变成下一个接口的输入?这就是变量串联的功夫。关注一下,咱们接着把这个系列往下推。

相关推荐
EvalDock1 天前
同一道 Excel 任务,四款 Agent 的公式、修改范围与缓存有何不同?
人工智能·测试
Apifox2 天前
Apifox 9 月更新|CLI 能力升级、GitLab 私有化部署接入与产品体验优化
前端·后端·测试
无序的浪3 天前
测试博客-基于微服务的在线判题系统
java·spring cloud·docker·微服务·测试·在线判题
阿蔹3 天前
TestHub智能测试管理平台框架介绍
自动化·接口测试·测试·测试平台
冬奇Lab4 天前
LLM 自动化测试系列(04):Web UI 自动化——Midscene 的视觉驱动脚本化
人工智能·测试
钱栈up4 天前
全量 21 个失败、单跑全绿:泄漏进连接池的 SQL 变量
sql·单元测试·测试
冬奇Lab4 天前
LLM 自动化测试系列(03):单元测试生成——TestGen-LLM 与 Qodo Cover
人工智能·单元测试·测试