前言
你不需要懂编程,只要会复制粘贴、会改几个单词,就能写出专业的接口测试断言。
一、什么是断言?
断言 就是你告诉 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:检查两处:
- Header 里是不是写错了格式(比如漏了
Bearer空格)。 - 登录接口返回的字段名是不是
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 的能力了。
去试着改一个你正在测试的接口吧,遇到任何卡住的地方,对照着这篇文章一步步看,一定能解决。