余念安の宝藏之地
首页项目归档照片墙音乐说说杂谈友链关于
封面

Postman 断言从零到会用 – 不懂 JavaScript 也能看完就上手

2026-05-20 16:20:40
# 断言
# 接口测试机
# postman

前言

你不需要懂编程,只要会复制粘贴、会改几个单词,就能写出专业的接口测试断言。

一、什么是断言?

断言 就是你告诉 Postman:

“这个接口返回的结果,应该符合我的期望。如果符合,测试通过;如果不符合,测试失败。”

举个例子:

登录接口应该返回 "code": 0,如果你实际返回了 "code": 500,断言就会报错,告诉你这里有问题。

二、Postman 里“写断言”的地方在哪里?

打开一个接口,点击 Tests 这个选项卡。
Tests 里的代码,会在收到响应之后自动执行。
我们所有的断言代码都写在这里。

三、你必须认识的几个核心“pm.xxx” – 我给它们起中文名

英文中文名(记忆用)作用:

pm.response邮差收到的响应代表后端返回给你的全部内容(状态码、响应体、响应头等)

pm.response.json()把响应体转成JSON对象把响应体(一串文本)转成我们能点出来的“对象”,方便取里面的字段

pm.test()邮差做测试里面写你具体的检查逻辑

pm.expect()邮差期望断言的核心:你期望某个值应该等于什么

pm.globals邮差的全局小本本在整个 Postman(所有集合、所有环境)都能存和取变量

pm.environment邮差的环境小本本只在当前选中的环境里存变量

pm.variables邮差的变量本本自动获取当前生效的变量(包括全局、环境、集合变量)

记忆技巧:pm 就是 Postman 的缩写,把它想象成一个“邮差小助手”。
你让它 .response 它就去拿响应,你让它 .test 它就去执行测试。

四、最常用、最核心的一句代码(拆解给你看)

假设后端返回了下面这种格式的数据:

json

{
  "code": 0,
  "message": "成功",
  "data": {
    "userId": 123
  }
}

你想拿到里面的 code 是多少,就要写:

javascript

const jsonData = pm.response.json();

我们一个字一个字拆解:

  • const – 意思是“定义一个常量”。常量就是“固定不变的东西”,你可以理解为“创建一个小盒子”。
  • jsonData – 这是你自己给小盒子起的名字,你可以叫它 结果、数据、响应体 都行。建议叫 jsonData,大家都这么叫。
  • = – 把右边的东西放进左边的小盒子里。
  • pm.response.json() – 这是“邮差小助手”去把收到的响应体转成 JSON 对象。
    如果不转,你拿到的只是一段文本,没法用 .code 这种方式去取字段。

一句话总结:

这行代码就是在说:“我创建一个叫 jsonData 的小盒子,然后把后端返回的响应体(转成好用的格式)放进去。”

有了 jsonData 之后,你想取 code 就写成 jsonData.code,想取 userId 就写成 jsonData.data.userId。

五、真正的断言长什么样?(手把手教)

继续用上面那个例子,你想检查 code 是不是等于 0。

javascript

pm.test("检查返回的code为0", function () {
    pm.expect(jsonData.code).to.eql(0);
});

拆解:

  • pm.test – 邮差做一个测试,括号里面有两个部分:
  • 第一部分:"检查返回的code为0" – 这是测试的名字,在报告里会显示。你可以写成中文,随便写,自己能看懂就行。
  • 第二部分:function () { ... } – 里面是具体要做的检查。
  • pm.expect(jsonData.code) – 邮差期望“jsonData 里面的 code 字段”……
  • .to.eql(0) – 应该严格等于 0。

如果后端返回的 code 真的是 0,测试通过;否则失败。

更直观的中文脑补翻译:

邮差,你给我做个测试,名字叫“检查返回的code为0”。
你期望 jsonData.code 这个值,必须等于 0。

六、你还经常会用到的断言写法

你想要检查什么代码大白话翻译某个字段存在pm.expect(jsonData).to.have.property("code")期望 jsonData 这个对象里有一个叫 code 的字段字符串相等pm.expect(jsonData.message).to.eql("成功")期望 message 等于“成功”数字大于某个值pm.expect(jsonData.userId).to.be.above(0)期望 userId 大于 0数组长度pm.expect(jsonData.list.length).to.eql(10)期望 list 这个数组的长度是 10包含某个字符串pm.expect(jsonData.message).to.include("成功")期望 message 里包含“成功”两个字

你不需要背,用到的时候来这里复制就行。

七、完整的一个断言示例(复制就能用)

javascript

// 第1步:把响应体转成 json 对象,放进 jsonData 盒子里
const jsonData = pm.response.json();

// 第2步:检查 code 字段存在(防报错)
pm.test("code字段是否存在", function () {
    pm.expect(jsonData).to.have.property("code");
});

// 第3步:检查 code 等于 0
pm.test("检查返回的code为0", function () {
    pm.expect(jsonData.code).to.eql(0);
});

// 第4步:如果有 message,检查它是不是“成功”
if (jsonData.message) {
    pm.test("message应该是'成功'", function () {
        pm.expect(jsonData.message).to.eql("成功");
    });
}

八、如何调试 – 打印出响应体看看(非常重要)

有时候你写 jsonData.code 取不到值,提示“找不到 json”。
这时候你需要亲眼看看后端到底返回了什么。

在 Tests 里加这两行:

javascript

console.log("原始响应体是:", pm.response.text());
console.log("转成json之后:", pm.response.json());

然后点击 Postman 左下角的 Console 按钮(或者按 Ctrl+Alt+C),就能看到打印出来的内容。
看到实际内容后,你就知道该取哪个字段了。

九、实战问题:Token 失效导致测试大面积报错,怎么办?(基础版)

问题描述

你写了很多接口的断言,测试时都正常。
可是导出来用 Newman 生成 htmlextra 报告的时候,发现一大半接口报错,错误信息都是“token 失效”或“401”。

原因:

  • 你可能是手动从一个接口复制 token 填到其他接口的 Header 里。
  • 或者你每次测试都先跑一个登录接口,但没有把 token 自动保存下来给后面的接口用。

解决方法:一次性获取 token,所有请求共用

第1步:登录接口的 Tests 里写代码,把 token 存到全局小本本(pm.globals)

假设登录接口返回的数据格式是:

json

{
  "code": 0,
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  }
}

在登录接口的 Tests 里写:

javascript

// 把登录接口返回的响应体转成 json 对象
const jsonData = pm.response.json();

// 如果登录成功,并且 data 里面有 token
if (jsonData.code === 0 && jsonData.data.token) {
    // 把 token 存到邮差的“全局小本本”里,起个名字叫 "token"
    pm.globals.set("token", jsonData.data.token);

    // 可选:在控制台打印一条消息,告诉你存成功了
    console.log("Token 已保存到全局变量");
} else {
    console.log("获取 token 失败,请检查登录接口返回");
}

逐句拆解:

  • pm.globals.set("token", jsonData.data.token)
  • pm.globals – 邮差的全局小本本(所有集合、所有环境都能访问)
  • .set("token", ...) – 在这个小本本里记下一个名字叫 token,后面括号里的是它的值
  • 以后你只要写 {{token}},就能自动替换成这个值

第2步:其他所有需要 token 的接口,在 Header 里引用这个全局变量

比如你的接口要求在 Headers 里加一个:

KeyValueAuthorizationBearer xxxxxx

你把 xxxxx 替换成 Bearer {{token}} 就行了。
注意:如果你的接口只需要 token 本身(不带 Bearer),那就直接写 {{token}}。

实际操作:
打开任何一个需要认证的接口 → Headers 选项卡 → 在 Value 那一列填上 Bearer {{token}}。
Postman 会自动把 {{token}} 替换成你刚才存进去的真实 token。

第3步:在 Collection Runner 或 Newman 里,确保登录接口第一个执行

  • 把你的登录接口拖到集合的最上面。
  • 运行测试时,Postman 会先执行登录 → 把 token 存进全局变量 → 后面的接口拿到 token 发送请求 → 全部成功。

十、你可能会问的几个问题(FAQ)

Q1:我每次运行都要先跑登录,会不会很慢?

A:不会,登录通常只需要几十毫秒。比起手动复制 token,自动获取要快得多,而且不会忘。

Q2:全局变量会不会被别的集合污染?

A:全局变量是跨集合的,如果你担心冲突,可以用 pm.environment.set 存在环境变量里。用法完全一样,只是把 globals 换成 environment。

Q3:我存了 token,但是后面接口还是报错“token 无效”?

A:检查两处:

  1. Header 里是不是写错了格式(比如漏了 Bearer 空格)。
  2. 登录接口返回的字段名是不是 token?如果不是,把代码里的 jsonData.data.token 改成实际字段名,比如 jsonData.data.access_token。

Q4:我怎么知道 token 有没有存进去?

A:在 Postman 右上角点击小眼睛图标(Environment / Globals),就能看到 token 变量和它的值。或者在 Tests 里加一行 console.log(pm.globals.get("token")),到 Console 里查看。

十一、最后送你一个“万能断言模板”

把下面这段代码复制到你任何一个接口的 Tests 里,把 期望的code值 改成你实际的数字,就能立刻工作。

javascript

// 1. 获取响应体,转成 JSON 对象
const jsonData = pm.response.json();

// 2. 打印出来方便调试(正式跑的时候可以删掉)
console.log("响应体:", jsonData);

// 3. 断言:code 字段存在
pm.test("检查 code 字段是否存在", function () {
    pm.expect(jsonData).to.have.property("code");
});

// 4. 断言:code 的值等于你期望的值(把 0 改成你需要的数字)
pm.test("检查 code 等于 0", function () {
    pm.expect(jsonData.code).to.eql(0);
});

// 5. 如果 token 字段存在,自动存到全局变量(适合登录接口)
if (jsonData.data && jsonData.data.token) {
    pm.globals.set("token", jsonData.data.token);
    console.log("Token 已自动保存");
}

十二、总结

  • 断言 就是检查接口返回对不对。
  • 核心两步:① const jsonData = pm.response.json(); ② pm.test(...) 里面写 pm.expect(...).to.eql(...)。
  • 解决 token 失效:在登录接口的 Tests 里用 pm.globals.set("token", 实际token值) 保存,其他接口用 {{token}} 引用。
  • 遇到问题先看 Console,打印 pm.response.text() 就能看到后端真实返回的内容。

现在你已经完全具备独立写 Postman 断言、自动管理 token 的能力了。
去试着改一个你正在测试的接口吧,遇到任何卡住的地方,对照着这篇文章一步步看,一定能解决。

avatar

余念安

喜欢写代码 学习

RECOMMENDED

博客上线啦

2026-03-24 07:00:01

Table of Contents