从入门到实战:一篇文章掌握接口测试与 Postman 全流程
🚀 这是我在 B 站课程《接口测试的简介与分类》(点击直达)学习过程中的详细笔记与实操总结,面向接口测试初学者与自动化测试入门者,希望对你有所启发。
🌐 接口测试的简介与分类
❓ 什么是接口测试?
接口测试是指对系统组件之间的数据传递、业务逻辑接口等内容进行测试,验证各模块间是否能正确交互与协作。🔁
📂 接口测试分类:
外部接口测试
系统对接外部第三方服务,如支付接口、物流接口,主要验证正向功能。
○ 只需验证正例(接口是否返回成功)✅内部接口测试
○ ① 内部调用接口:模块之间对接使用,如预算系统与承保系统。
■ 只需验证正例
○ ② 开放给外部的内部接口:业务核心接口,如 App 端调用后端接口。
■ 需验证正例 + 异常 + 权限 + 安全性
| 分类 | 典型场景 | 测试重点 | 扩展测试点 |
|---|---|---|---|
| 外部接口 | 第三方支付、物流查询 | 正向流程(如支付下单 - 回调通知) | 网络异常(断网、超时)、限流处理 |
| 内部接口 | 电商系统“库存扣减”与“订单创建”对接 | 数据一致性(库存扣减失败时订单回滚) | 并发调用(多用户同时下单锁机制) |
| 开放内部接口 | App 端用户登录接口 | 权限校验、SQL 注入防护 | 敏感数据加密(密码传输加密)🔒 |
🔁 接口测试的流程与用例设计
1️⃣ 熟悉接口
获取方式:
○ 查看接口文档
○ 抓包工具(如 Charles/Fiddler)观察请求熟悉内容:
○ 接口地址、请求方式(GET/POST等)
○ 鉴权机制(Token/Cookie)
○ 请求参数与响应结构
○ 状态码及错误码定义
2️⃣ 编写接口测试用例
用例设计思路:
正例:
○ 合理入参 + 正确鉴权 → 返回成功结果反例:
○ 鉴权类:Token 缺失、错误、过期
○ 参数类:参数为空、格式错误、类型/长度不符
○ 业务类:错误码验证、边界值、分页逻辑
○ 安全类:黑名单用户、访问频率限制、权限验证
3️⃣ 执行接口测试
- 使用 Postman 编写请求,管理集合和环境变量
- 手动调试,确认功能逻辑正确
4️⃣ 持续集成
- 使用 Newman 执行 Postman 脚本
- 将测试集成至 Jenkins 流水线,输出测试报告,并通过邮件/钉钉同步结果 📩
🧰 Postman 简介与介绍
界面说明
- Home:主页
- Workspaces:工作空间管理
- Collections:接口集合管理
- APIs:API 文档管理
- Environments:环境变量与全局变量
- Mock Server:虚拟服务器
- Monitors:定时监控器
- History:历史请求记录
请求页面说明
Params:GET 请求参数
Authorization:设置 Token、Basic Auth 等鉴权方式
Headers:请求头(如 Content-Type、Cookie 等)
Body(POST 请求参数):
- none:不传参数
- form-data:支持键值对和文件
- x-www-form-urlencoded:表单键值对
- raw:json、text、xml、html、JavaScript、text等原始格式
- binary:文件上传(二进制)
pre-request script:请求前执行 JS 脚本
tests:请求后执行断言
cookies:管理 Cookie 信息
响应页签说明
Body:返回内容
Pretty:以 Json、html、XML 等格式查看数据
Raw:文本方式查看数据
Preview:网页方式查看数据
Cookies:响应中返回的 Cookie
Headers:响应头
Test Results:断言执行结果
状态码与响应信息:
- 200:OK
- 响应时间(如 681ms)
- 响应大小(如 343B)
面试题
Get请求和Post请求的区别
- get 请求一般是获取数据,post 请求一般是提交数据。
- post 请求比 get 请求更安全。
- 本质区别是传参方式不同:
- get 请求在地址栏后面以 ? 方式传参,多个参数用 & 分隔。
- post 请求在 body 以表单方式传参。
环境变量与全局变量
- 环境变量:限定于特定环境(如 dev/test/prod),variable 命名必须一致,接口地址中使用 。
- 全局变量:所有环境、所有接口共享,跨接口共享数据(如登录 Token、用户 ID)。
- 获取环境变量和全局变量的值通过 。
| 类型 | 作用域 | 典型用途 | 优先级(冲突时) |
|---|---|---|---|
| 环境变量 | 限定于特定环境 | 不同环境的配置差异(API 域名、端口) | 高于全局变量 |
| 全局变量 | 所有环境共享 | 跨接口共享数据 | 低于环境变量 |
接口关联
JSON 提取器
第一个接口:
//使用json提取器提取accesss_token值。 |
第二个接口:
{{access_token}} |
正则表达式提取器
第一个接口:
//使用正则表达式提取器实现接口关联,match匹配。 |
第二个接口:
{{access_token}} |
⚡ 动态参数
Postman 内置动态参数:
1. 时间与日期类 ⏰
| 参数 | 格式示例 | 典型用途 |
|---|---|---|
| 1689345678(秒级) | 生成当前时间戳(如签名计算) | |
| 2025-06-18T12:34:56Z | 随机日期(测试订单有效期) | |
| 2025-06-18T12:34:56.789Z | 符合 ISO 8601 格式的时间戳 |
使用方法:
// 在 pre-request script 中组合参数 |
2. 随机数据类 🎲
| 参数 | 格式示例 | 典型用途 |
|---|---|---|
| 345(0-1000 内随机数) | 测试分页大小(如 size=) | |
| abcdef12345(16 位随机字符串) | 生成随机用户名 | |
| 5f7d3a9c-1b2e-4c3d-8e9f-0a1b2c3d4e5f | 唯一标识符(测试分布式 ID) |
3. 模拟数据类 🧪
| 参数 | 格式示例 | 典型用途 |
|---|---|---|
| user567@example.com | 注册测试(随机邮箱) | |
| +1 (555) 123-4567 | 测试短信验证码接口 | |
| 4111 1111 1111 1111 | 支付模拟(需配合 Mock Server) |
自定义动态参数
// 手动获得时间戳 |
使用时调用:
{{times}} |
📊 Postman 断言
常规六种断言
1. Status code:Code is 200(状态码断言)✅
作用: 验证接口返回的 HTTP 状态码是否符合预期(如 200、404 等)。
示例代码:
pm.test("状态码应为 200", function() { |
扩展场景:
- 验证客户端错误(4xx):
pm.response.to.have.status(401)(未授权); - 验证服务器错误(5xx):
pm.response.to.have.status(500)(内部错误)。
2. Responsebody:Contains string(响应体包含字符串断言)🔍
作用: 检查响应内容是否包含指定字符串(支持文本、JSON、XML 等格式)。
示例代码:
pm.test("响应体包含 success", function() { |
注意事项:
- 若响应为 JSON,需先通过
pm.response.json()解析; - 区分大小写(如 “Success” 与 “success” 不同),可通过
to.include("success", {ignoreCase: true})忽略大小写。
3. Responsebody:Json value check(JSON 值断言)🧾
作用: 验证响应 JSON 中特定字段的值是否符合预期。
示例代码:
pm.test("用户 ID 应为 123", function() { |
多层嵌套场景:
// 响应结构:{ "data": { "list": [{"id": "ORD001"}] } } |
4. Responsebody:is equal to a string(响应体等于字符串断言)📏
作用: 验证响应内容与指定字符串完全一致(较少使用,因响应常含动态数据)。
示例代码:
pm.test("响应体等于指定字符串", function() { |
优化建议:
- 避免直接断言完整响应体,可拆分字段断言;
- 对动态字段(如时间戳)使用通配符或正则表达式(需结合 Chai 库)。
5. Response headers:Content-Type…(响应头断言)📋
作用: 检查响应头是否包含指定字段(如 Content-Type、Authorization)。
示例代码:
// 断言存在 Content-Type 头 |
6. Response time is less than 200ms(响应时间断言)⏱️
作用: 验证接口响应时间是否小于指定毫秒数(用于性能初步测试)。
示例代码:
pm.test("响应时间应小于 200ms", function() { |
扩展用法:
- 断言响应时间在区间内:
pm.expect(responseTime).to.be.within(100, 300); - 结合环境变量动态设置阈值:
pm.expect(responseTime).to.be.below(pm.environment.get("maxResponseTime"))。
🔧 在断言中获取自定义动态参数的方式
| 获取方式 | 语法示例 | 适用场景 | 注意事项 |
|---|---|---|---|
| pm.globals.get(“参数名”) | pm.globals.get(“times”) | 推荐通用写法,兼容性强 | 需通过 pm 上下文调用,适用于 Pre-request Script、Tests 脚本 |
| globals[“参数名”] | globals[“times”] | 键名动态拼接场景 | 旧版本 Postman 可能不支持 |
| globals.参数名 | globals.times | 键名无特殊字符时简写 | 参数名含特殊字符需用方括号访问 |
🌍 全局断言
实现全局断言的三种方案
方案 1:在 Collection 中编写公共测试脚本
原理: 在 Collection 的 Tests 标签页中编写断言,对集合内所有接口生效。
示例代码:
pm.test("全局状态码校验", function() { |
注意事项:
- 集合级断言优先级低于单个接口断言;
- 可用
pm.info.requestName判断接口名,实现条件断言:
if (pm.info.requestName !== "健康检查接口") { |
方案 2:使用前置脚本(Pre-request Script)动态注入断言
示例代码:
// 在 Collection 或 Folder 的 Pre-request Script 中添加 |
方案 3:通过 Newman 命令行添加全局断言
原理: Newman 运行时通过脚本参数注入全局断言。
示例代码:
// newman-run.js 脚本内容 |
执行命令:
newman run collection.json --script newman-run.js |
全局断言与局部断言的优先级控制
| 断言位置 | 优先级 | 应用场景 |
|---|---|---|
| 单个接口的 Tests | 最高 | 针对特定接口的特殊验证 |
| Folder 级 Tests | 中 | 分组接口的公共验证 |
| Collection 级 Tests | 最低 | 全量接口的基础验证(状态码、响应头) |
冲突解决方案:
接口级 Tests 中使用 pm.test.remove() 移除不需要的全局断言:
// 移除集合中的全局响应时间断言 |
🧪 Postman 批量运行测试用例
在 Postman 中批量运行测试用例,主要通过 Collection Runner 功能来实现,以下是具体步骤:
1. 创建集合和组织用例
- 点击左侧 “Collections” 的 “➕” 按钮创建集合,输入集合名称。
- 选中集合点击 “⋯” → Add Folder 添加模块文件夹。
- 再选中文件夹点击 Add Request 添加接口测试用例,配置请求参数、断言脚本,将接口组织到集合中。
2. 选择运行方式
- ✅ 点击集合右上角 Run:全模块回归测试。
- ✅ 点击文件夹右上角 Run folder:单模块迭代测试。
3. 配置 Runner 参数
Iterations:设置测试迭代次数。
Delay:设置接口调用间隔(单位:ms)。
Data:导入 CSV / JSON 文件进行参数化。
Advanced settings:
- ✅ 勾选 “Persist responses” 保存响应。
- 🔁 选择 “Run order” 控制执行顺序(按文件夹顺序或随机执行)。
4. 执行批量测试
点击 Run 或 Run 文件夹名称 按钮,即可批量运行测试用例。
5. 分析运行结果
- 📊 汇总信息:运行时间、迭代次数、通过/失败数量、平均响应时间等。
- 🔍 单接口详情:状态码、响应时间、响应体、断言结果、错误信息。
📂 Postman 数据驱动测试
✅ CSV 参数化测试
📁 CSV 文件格式要求
- 第一行为表头,后续行为数据。
- 使用英文逗号
,分隔,若字段含逗号,需用双引号包裹。
示例文件 users.csv:
username,password,expected_status |
📥 导入 CSV 步骤
- Runner 中选择集合或文件夹 → 点击 Select File。
- 选择 CSV 文件 → Postman 自动识别变量名并预览数据。
🔗 请求中引用变量
URL 参数:
https://api.com/login?username={{username}}
请求体参数:
{
"username": "{{username}}",
"password": "{{password}}"
}在断言中使用:
pm.test("状态码校验", function() {
pm.response.to.have.status(pm.iterationData.get("expected_status"));
});
✅ JSON 参数化测试
📁 JSON 文件格式要求
- 根节点为数组,每组对象为一组测试数据。
示例 orders.json:
[ |
📥 导入 JSON 步骤
- 同样在 Runner 中选择 JSON 文件,Postman 自动识别变量。
🔗 引用方式示例
URL 参数:
https://api.com/order/{{productId}}
请求体参数:
{
"quantity": {{quantity}},
"unitPrice": {{price}}
}JSON 断言:
pm.test("金额计算正确", function() {
const response = pm.response.json();
pm.expect(response.total).to.eql(pm.iterationData.get("expectedTotal"));
});
🧾 请求必须携带的请求头说明
| 请求头名 | 说明 | 示例值 |
|---|---|---|
| Host | 指定目标主机(HTTP/1.1要求) | api.example.com |
| Connection | 是否保持长连接 | keep-alive |
| Accept | 可接受的响应格式 | application/json |
| X-Requested-With | 是否为 AJAX 请求 | XMLHttpRequest |
| User-Agent | 客户端身份标识 | Mozilla/5.0... |
| Referer | 请求来源页面 URL | https://example.com |
| Cookie | 携带的 Cookie 信息 | session_id=123456; user_token=abc |
| Content-Type | 请求体的格式类型 | application/json |
🔧 Postman接口Mock Servier服务器
🧪 Mock Server 核心价值与应用场景
核心价值
解决痛点:后端接口尚未开发完成时,前端可通过 Mock Server 模拟接口响应,实现并行开发,提升开发效率。
应用场景
- 前后端分离开发,后端进度滞后时前端可独立调试
- 测试复杂业务流程(如支付回调、状态变更)
- 模拟异常情况(如网络超时、服务器错误)
⚙️ 创建 Mock Server 全流程(以用户示例为例)
1. 准备 Mock 响应数据
示例 JSON(注意逗号格式):
{ |
2. 在 Postman 中创建 Mock Server
步骤如下:
创建 Collection:
- 点击左侧 Collections → ➕ → 命名为“前端 Mock 接口”
- 添加请求(如 GET/POST)→ 命名为“获取数据接口”
配置请求与响应:
- 请求 URL 可自定义,如:
https://mock-api.com/data/query - 切换至 Response 标签页 → 选择
raw→ 粘贴 JSON - 设置状态码为
200 OK
- 请求 URL 可自定义,如:
生成 Mock Server:
- 点击 Collection 的
…→ 选择Generate Mock Server - 设置域名(如:
mock-server.postman.com) - 点击 Create Mock → 复制生成的 Mock URL,如:
https://postman-echo.com/mock/12345/data/query
- 点击 Collection 的
3. 前端调用 Mock 接口示例(JavaScript)
fetch("https://postman-echo.com/mock/12345/data/query", { |
🍪 Postman 的 Cookie 鉴权机制
1. Cookie 是什么
- 由服务器生成的小段
key=value格式文本 - 存储在浏览器或 Postman 中,用于身份验证、会话控制等
2. 鉴权流程
- 当客户端第一次访问服务器的时候,那么服务器就会生成Cookie信息,并且在响应头的set-cookie里面把生成的cookie信息发送给客户端。
- 当客户端第2-N次访问服务器的时候,那么客户端就会在请求头的cookie带上cookie信息,从而实现鉴权
首次请求 → 服务器生成 Set-Cookie 响应头 → 客户端保存 Cookie |
3. Cookie 类型对比
| 类型 | 存储位置 | 生命周期 | 安全性 | 应用场景 |
|---|---|---|---|---|
| 会话 Cookie | 内存 | 浏览器关闭即失效 | 较低 | 购物车、临时登录 |
| 持久 Cookie | 硬盘 | 设定的过期时间前有效 | 较高 | 记住我、长期登录 |
🔐 Postman 实现接口加密与解密
主流加密算法分类
| 类型 | 代表算法 | 特点 | 应用场景 |
|---|---|---|---|
| 对称加密 | AES / DES / Base64 | 加解密使用同一密钥,速度快 | 请求体数据加密 |
| 非对称加密 | RSA / ECC | 公钥加密私钥解密,较安全 | 数字签名、密钥交换 |
| 单向哈希 | MD5 / SHA256 | 不可逆,用于验证完整性 | 密码存储、数据签名 |
Postman 中加密实现方式
✅ 使用内置 CryptoJS(推荐)
Postman 内置了 Crypto-js 库,支持 AES、MD5、SHA 等多种加密算法。
AES 加密请求体:
// 在Pre-request Script中添加 |
MD5 签名:
// 在Pre-request Script中添加 |
🔄 外部 JS 文件导入
encrypt.js 文件:
function aesEncrypt(data, key) { |
使用方式:
eval(pm.globals.get("encryptScript")); // 从全局变量获取脚本内容 |
🔍 解密响应数据(Tests 脚本中)
在 Tests 脚本中解密响应
// 在Tests脚本中添加 |
使用环境变量存储解密结果
// 解密后存储到环境变量供后续请求使用 |
🔐 加密场景示例
RSA 加密(使用公钥):
// 在Pre-request Script中添加(需先导入jsrsasign库) |
带时间戳的签名验证:
// Pre-request Script |
好的,以下是针对你提供的 Newman 相关内容的整理,带有适当表情提示,保持简洁且易读:
🚀 Newman
🚀 Newman 核心价值与应用场景
定位:Postman 的命令行运行器,适合自动化执行测试脚本,完美适配 CI/CD 流水线。
核心优势:
- 🖥️ 脱离 GUI,可集成 Jenkins、GitLab CI 等自动化工具
- 🔄 支持批量运行、参数化测试、生成标准化报告
- 🌍 跨平台(Linux/Windows/Mac),支持团队协作
🛠 Newman 安装与基础使用
安装
npm install -g newman |
(需先安装 Node.js)
基础命令结构
newman run [collection文件路径] [选项参数] |
核心参数说明
| 参数 | 作用 | 示例 |
|---|---|---|
-e |
指定环境变量文件 (JSON) | -e environments/test.json |
-g |
指定全局变量文件 (JSON) | -g globals/prod.json |
-d |
参数化测试数据文件 (CSV/JSON) | -d data/users.csv |
-n |
迭代次数 | -n 5 (每个用例执行 5 次) |
-r |
报告格式(支持多种组合) | -r cli,html,json,junit |
--reporter-* |
定制报告输出(如HTML路径) | --reporter-html-export reports/result.html |
--delay-request |
请求间隔(毫秒) | --delay-request 500 |
--insecure |
允许忽略 HTTPS 证书验证 | --insecure |
🏃♂️ 从 Postman 到 Newman 的完整流程
1. 导出 Collection 和 Environment
- Postman → 选择集合 → 点击
...→ Export → 保存为collection.json - 选择环境 → 点击
...→ Export → 保存为environment.json
2. 执行基本测试
# 运行集合,使用测试环境变量 |
3. 参数化测试示例
# 使用CSV数据文件进行参数化测试,生成HTML报告 |
4. 并发与全局变量示例
# 模拟10个并发用户,执行5次迭代,输出JUnit格式报告 |
🤖 Postman + Newman + Jenkins 持续集成实战
核心步骤速览
环境准备
- 安装 Jenkins(推荐 Docker 部署)
- 安装 Node.js 和 Newman(Jenkins 节点)
- 导出 Postman Collection 和环境变量文件
Jenkins 配置
- 新建自由风格项目
- 配置 Git 源码管理
- 添加构建步骤,执行 Newman 命令
报告集成
- 安装 HTML Publisher 插件
- 配置报告路径
- 保存并触发构建
🖥 详细操作步骤
环境准备
# Docker安装 Jenkins(推荐) |
# Jenkins节点安装 Newman |
- 导出 Postman Collection(
collection.json)与环境变量文件(environment.json)
Jenkins 项目配置
新建项目
- 点击 New Item → 输入项目名 → 选择 Freestyle project
源码管理
- 选择 Git → 输入仓库地址 → 配置认证信息
构建步骤
- 添加 Execute shell(Linux/macOS):
newman run collection.json \ |
构建后操作
添加 Publish HTML reports 插件配置
- Report name: API测试报告
- Directory: reports
- Index page: index.html
🔍 关键命令解析
newman run collection.json \ |
⚠️ 常见问题及解决方案
| 问题 | 解决方案 |
|---|---|
| Newman 未找到 | 检查 Node.js 与 Newman 是否安装,或使用绝对路径(如 /usr/bin/newman) |
| 报告为空 | 确认命令中的报告路径与 Jenkins 配置一致,确认 Newman 执行成功 |
| 中文乱码 | 添加参数 --reporter-html-encoding utf-8 |
| 环境变量不生效 | 确保 environment.json 格式正确,变量名与 Postman 一致 |
✅ 执行效果验证
- 触发 Jenkins 构建
- 构建成功后,点击左侧菜单中的 “API测试报告”
- 查看测试结果(成功率、响应时间、失败用例)
写在最后
通过本次系统性学习,我对接口测试从原理、流程、工具到自动化的整个链路有了清晰的认识,Postman 不仅适合手动调试,还可以搭配 Newman 实现完整的自动化方案,未来在项目中我也会持续将这些方法应用于实践中。
如果你刚入门接口测试,希望这份整理对你有所帮助,也欢迎交流、讨论更多实战经验 🙌。










