接口测试完整教程(软件测试人员专用)¶
本教程从理论与方法论出发,系统讲解接口测试的概念、流程、用例设计、工具选型与实战案例。与工具类教程(Postman/Fiddler/Python 自动化)形成互补,帮助测试人员建立完整的接口测试知识体系。
前置要求¶
| 项目 | 要求 | 获取方式 |
|---|---|---|
| HTTP 协议 | 了解请求方法、状态码、请求头与响应体 | 网络知识教程-软件测试版 |
| Postman 基础 | 会发送请求、查看响应、使用环境变量 | Postman接口测试教程-软件测试版 |
新手导读¶
接口测试不是简单“用工具调接口”。它关注的是前端、App 或第三方系统调用后端时,数据、权限、状态和异常处理是否正确。
第一遍建议按这个顺序学:
- 先理解请求和响应。
- 再学习接口文档怎么看。
- 接着学习接口用例怎么设计。
- 然后用 Postman 执行接口测试。
- 最后再考虑自动化、Mock、性能和安全。
如果你还不会 Postman,可以先看 Postman 教程,再回来看本教程的方法论部分。
一、接口测试基础理论¶
1.1 什么是接口测试¶
接口(Interface) 是不同软件模块之间进行数据交互的契约。
接口测试 是验证这些接口的功能、性能、安全、可靠性是否符合预期的测试活动。
前端 / App / 第三方系统
↓ 调用
┌──────────────────┐
│ API 接口 │ ← 接口测试关注点
└──────────────────┘
↓
业务逻辑层
↓
数据库 / 缓存
1.2 为什么要做接口测试¶
质量保障维度:
| 痛点 | 接口测试的价值 |
|---|---|
| UI 测试覆盖率低 | 接口能覆盖业务后端逻辑 |
| UI 测试不稳定 | 接口测试更稳定、可重复 |
| 缺陷发现晚 | 接口测试提前到开发联调阶段 |
| 修复成本高 | 越早发现的 Bug 修复成本越低 |
| 自动化困难 | 接口自动化比 UI 自动化容易实现 |
| 边界场景难复现 | 接口可直接构造异常数据 |
测试金字塔理论:
╱╲
╱ ╲ UI 测试(少量)
╱────╲ 端到端,慢,脆弱
╱ ╲
╱接口测试╲ 接口测试(中量)★
╱──────────╲ 稳定,覆盖业务逻辑
╱ ╲
╱ 单元测试 ╲ 单元测试(大量)
╱────────────────╲ 快,开发负责
接口测试是测试金字塔的 核心层,性价比最高。
1.3 接口测试 vs UI 测试¶
| 维度 | 接口测试 | UI 测试 |
|---|---|---|
| 测试对象 | API(后端) | 页面(前端+后端) |
| 执行速度 | 快(毫秒级) | 慢(秒级) |
| 稳定性 | 高 | 低(页面元素变动) |
| 维护成本 | 低 | 高 |
| 覆盖能力 | 业务逻辑、异常场景 | 用户体验、视觉 |
| 自动化成本 | 低 | 高 |
| 缺陷定位 | 精准(直接定位接口) | 难(前后端均可能) |
1.4 接口测试 vs 单元测试¶
| 维度 | 单元测试 | 接口测试 |
|---|---|---|
| 测试粒度 | 函数/方法 | 接口/API |
| 执行者 | 开发 | 测试 |
| 依赖 | Mock 内部依赖 | 调用真实接口 |
| 关注点 | 代码逻辑正确性 | 业务功能正确性 |
1.5 接口测试关注什么¶
功能测试: - 接口能否正常返回数据 - 返回数据是否符合预期 - 异常入参时的处理
性能测试: - 响应时间 - 并发能力(TPS/QPS) - 资源占用
安全测试: - 认证鉴权 - 数据加密 - SQL 注入、XSS 等漏洞
可靠性测试: - 重复调用幂等性 - 异常恢复能力 - 限流降级
二、HTTP 协议详解¶
2.1 HTTP 协议特点¶
- 无状态:每次请求独立,服务器不记录上下文(通过 Cookie/Session/Token 弥补)
- 基于 TCP:可靠传输
- 请求-响应模型:客户端发起,服务端响应
- 明文传输:HTTP 明文,HTTPS 加密
2.2 一个完整的 HTTP 请求¶
POST /api/login HTTP/1.1 ← 请求行(方法 路径 协议版本)
Host: api.example.com ← 请求头
Content-Type: application/json
Authorization: Bearer eyJhbGc...
User-Agent: TestClient/1.0
← 空行
{ ← 请求体
"username": "test",
"password": "123456"
}
2.3 响应结构¶
HTTP/1.1 200 OK ← 状态行
Content-Type: application/json ← 响应头
Content-Length: 156
Set-Cookie: sessionId=abc123
← 空行
{ ← 响应体
"code": 0,
"msg": "成功",
"data": {
"userId": 12345,
"token": "eyJhbGc..."
}
}
2.4 请求方法(Method)¶
| 方法 | 用途 | 幂等性 | 安全性 |
|---|---|---|---|
| GET | 查询资源 | ✅ | ✅ |
| POST | 创建资源 | ❌ | ❌ |
| PUT | 更新资源(全量) | ✅ | ❌ |
| PATCH | 更新资源(部分) | ❌ | ❌ |
| DELETE | 删除资源 | ✅ | ❌ |
| HEAD | 获取响应头 | ✅ | ✅ |
| OPTIONS | 探测支持的方法 | ✅ | ✅ |
核心概念
幂等性: 多次执行结果相同 安全性: 不会修改服务器资源
DELETE 幂等性说明
HTTP 规范定义 DELETE 是幂等的(重复删除同一资源结果相同),但实际业务实现中,第二次 DELETE 已删除资源可能返回 404 而非 200,测试时需以接口文档约定为准。
2.5 状态码(Status Code)¶
| 状态码段 | 含义 | 常见示例 |
|---|---|---|
| 1xx | 信息提示 | 100 Continue |
| 2xx | 成功 | 200 OK, 201 Created, 204 No Content |
| 3xx | 重定向 | 301 永久, 302 临时, 304 未修改 |
| 4xx | 客户端错误 | 400 参数错误, 401 未认证, 403 无权限, 404 未找到, 405 方法不允许, 408 超时, 429 频繁请求 |
| 5xx | 服务端错误 | 500 内部错误, 502 网关错误, 503 服务不可用, 504 网关超时 |
测试常见排查:
400→ 检查请求参数格式401→ 检查 Token 是否正确或过期403→ 检查用户权限404→ 检查 URL 路径415→ 检查 Content-Type500→ 后端 Bug,提交缺陷502/504→ 后端服务挂了或超时
2.6 常见 Header¶
请求 Header:
| Header | 含义 |
|---|---|
Host |
目标主机 |
Content-Type |
请求体类型 |
Authorization |
鉴权信息 |
User-Agent |
客户端标识 |
Accept |
接受的响应类型 |
Accept-Language |
语言偏好 |
Accept-Encoding |
接受的压缩 |
Cookie |
客户端 Cookie |
Referer |
来源页面 |
X-Forwarded-For |
真实 IP(代理场景) |
响应 Header:
| Header | 含义 |
|---|---|
Content-Type |
响应体类型 |
Content-Length |
响应体长度 |
Set-Cookie |
设置 Cookie |
Cache-Control |
缓存策略 |
Location |
重定向地址 |
Access-Control-Allow-Origin |
CORS 跨域 |
2.7 常见 Content-Type¶
| 类型 | 用途 |
|---|---|
application/json |
JSON 数据(最常见) |
application/x-www-form-urlencoded |
表单提交 |
multipart/form-data |
上传文件 |
application/xml |
XML 数据 |
text/plain |
纯文本 |
text/html |
HTML 页面 |
application/octet-stream |
二进制流 |
2.8 Cookie / Session / Token¶
Cookie: 服务器写入客户端的小段数据,客户端每次请求自动携带。
Session: 服务器端会话存储,通过 Cookie 中的 sessionId 关联。
登录 → 服务端生成 SessionId → Set-Cookie 返回客户端
→ 服务端保存 Session 数据(账号、权限)
后续请求 → 客户端自动携带 Cookie → 服务端通过 SessionId 查 Session
Token(JWT 常见): 无状态认证,所有信息加密在 Token 里。
对比:
| 维度 | Cookie+Session | Token |
|---|---|---|
| 状态 | 有状态 | 无状态 |
| 服务端存储 | 需要 | 不需要 |
| 多端共享 | 难 | 易 |
| 主流应用 | 传统 Web | API、移动端、微服务 |
2.9 HTTP vs HTTPS¶
| 维度 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 加密 | 明文 | TLS/SSL 加密 |
| 证书 | 不需要 | 需要 CA 证书 |
| 速度 | 快 | 稍慢(多了握手) |
| 安全 | 低 | 高 |
测试关注
抓包工具(Fiddler/Charles)需要安装根证书才能解密 HTTPS 内容。
三、常见接口类型¶
3.1 RESTful API(最常见)¶
REST = Representational State Transfer,基于 HTTP 的资源化设计风格。
核心原则: - 使用 URL 表示资源(名词,不是动词) - 使用 HTTP 方法表示操作 - 使用 HTTP 状态码表示结果
示例:
| 操作 | URL | 方法 |
|---|---|---|
| 查询所有用户 | /users |
GET |
| 查询指定用户 | /users/123 |
GET |
| 创建用户 | /users |
POST |
| 全量更新用户 | /users/123 |
PUT |
| 部分更新用户 | /users/123 |
PATCH |
| 删除用户 | /users/123 |
DELETE |
| 查询用户的订单 | /users/123/orders |
GET |
对比"非 REST 风格"(仍很常见):
测试不论风格,方法论一致
实际项目中混搭很常见。
3.2 GraphQL¶
由 Facebook 推出的查询语言,客户端可精确指定需要的字段。
特点:
- 单一 endpoint(通常 /graphql)
- 客户端定义返回结构
- 减少 over-fetching 和 under-fetching
请求示例:
响应只返回请求的字段。
3.3 WebSocket¶
基于 TCP 的全双工通信协议,常用于即时通讯、推送、实时数据。
与 HTTP 区别:
- 长连接(HTTP 通常短连接)
- 双向通信(HTTP 单向请求-响应)
- 协议头从 http:// 变为 ws://,HTTPS 对应 wss://
测试工具: Postman 支持 WebSocket、wscat 命令行工具
3.4 RPC(Remote Procedure Call)¶
远程过程调用,常见于微服务内部通信。
主流框架:
| 框架 | 公司 | 协议 |
|---|---|---|
| gRPC | HTTP/2 + Protobuf | |
| Dubbo | 阿里 | TCP 二进制 |
| Thrift | 自定义二进制 | |
| HSF | 阿里 | 内部框架 |
特点: - 调用远程方法像调用本地方法 - 性能比 HTTP+JSON 高 - 通常需要专门的测试工具(如 BloomRPC、Apifox 支持 gRPC)
3.5 SOAP¶
老旧的 XML 接口协议,目前主要在金融、政府、传统行业仍有使用。
特点: - 基于 XML - 复杂的 WSDL 描述 - 主要工具:SoapUI
<soap:Envelope>
<soap:Body>
<m:GetUser>
<m:UserId>123</m:UserId>
</m:GetUser>
</soap:Body>
</soap:Envelope>
3.6 接口风格对比¶
| 风格 | 易用性 | 性能 | 主流场景 |
|---|---|---|---|
| RESTful | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | Web/App 后端 |
| GraphQL | ⭐⭐⭐ | ⭐⭐⭐⭐ | 复杂前端聚合 |
| WebSocket | ⭐⭐⭐ | ⭐⭐⭐⭐ | 实时通讯 |
| RPC | ⭐⭐ | ⭐⭐⭐⭐⭐ | 微服务内部 |
| SOAP | ⭐ | ⭐⭐ | 传统企业 |
四、接口文档解读¶
4.1 一份合格的接口文档应包含¶
| 信息 | 说明 |
|---|---|
| 接口名称 | 用户登录 |
| 接口描述 | 用户使用账号密码登录系统 |
| 请求 URL | /api/v1/login |
| 请求方法 | POST |
| 请求头 | Content-Type, Authorization 等 |
| 请求参数 | 字段名/类型/是否必填/说明/示例 |
| 响应格式 | JSON 结构 |
| 响应字段 | 每个字段的类型/含义 |
| 状态码说明 | 业务状态码及含义 |
| 示例 | 请求示例 + 响应示例 |
| 异常说明 | 异常场景的返回 |
| 备注 | 限流、安全、版本说明 |
4.2 标准示例¶
接口: 用户登录
URL: POST /api/v1/login
Content-Type: application/json
请求参数:
| 字段 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| username | string | 是 | 用户名,4-20 字符 | testuser |
| password | string | 是 | 密码,6-20 字符 | 123456 |
| captcha | string | 否 | 验证码(5 次错误后必填) | a1b2 |
| remember | boolean | 否 | 是否记住登录,默认 false | true |
响应:
{
"code": 0,
"msg": "成功",
"data": {
"userId": 12345,
"username": "testuser",
"token": "eyJhbGciOiJIUzI1NiIs...",
"expiresIn": 7200
}
}
响应字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| code | int | 业务状态码,0 表示成功 |
| msg | string | 提示信息 |
| data.userId | long | 用户 ID |
| data.token | string | 登录凭证 |
| data.expiresIn | int | Token 有效期(秒) |
业务状态码:
| Code | 含义 |
|---|---|
| 0 | 成功 |
| 1001 | 密码错误 |
| 1002 | 账号不存在 |
| 1003 | 参数错误 |
| 1004 | 需要验证码 |
| 1005 | 账号被锁定 |
4.3 常见文档工具¶
| 工具 | 特点 |
|---|---|
| Swagger / OpenAPI | 代码注解生成,开源标准 |
| YApi | 国产开源,团队协作 |
| Apifox | 国产,文档+测试+Mock 一体化 |
| ShowDoc | 轻量、Markdown 风格 |
| Postman | 文档可自动生成 |
| 语雀 / Confluence | 通用文档工具 |
4.4 接口文档解读要点¶
测试人员拿到接口文档,要重点关注:
- 参数边界:长度、范围、格式
- 必填字段:缺失会怎样
- 字段类型:传错类型怎么处理
- 业务规则:账号锁定逻辑、验证码触发条件
- 异常状态码:是否覆盖了所有场景
- 接口依赖:调用前需要哪些前置数据
- 接口幂等性:重复调用是否有问题
- 接口版本:是否有 v1/v2 区别
五、接口测试用例设计¶
5.1 用例设计思路¶
功能正常 ── 单接口验证
↓
参数异常 ── 等价类、边界值、错误推测
↓
业务异常 ── 业务规则、状态机
↓
场景组合 ── 多接口业务流程
↓
安全性 ── 鉴权、注入、越权
↓
性能 ── 响应时间、并发
5.2 等价类划分¶
将输入分为有效等价类和无效等价类,每类取代表测试。
示例:用户名字段(4-20 字符)
| 类型 | 等价类 | 测试用例 |
|---|---|---|
| 有效 | 4-20 字符 | testuser |
| 无效 | 空 | (空) |
| 无效 | 少于 4 字符 | abc |
| 无效 | 超过 20 字符 | a*25 |
| 无效 | 含特殊字符 | test@user |
| 无效 | 含中文 | 测试用户 |
| 无效 | null | null |
5.3 边界值分析¶
针对边界进行测试,往往是 Bug 多发区。
示例:年龄(18-65)
| 用例 | 输入 | 期望 |
|---|---|---|
| 下边界 | 18 | 通过 |
| 下边界 -1 | 17 | 失败 |
| 下边界 +1 | 19 | 通过 |
| 上边界 | 65 | 通过 |
| 上边界 -1 | 64 | 通过 |
| 上边界 +1 | 66 | 失败 |
| 极小值 | 0、-1 | 失败 |
| 极大值 | 999 | 失败 |
示例:分页接口(page, size)
| 用例 | page | size | 期望 |
|---|---|---|---|
| 正常 | 1 | 10 | 返回数据 |
| 边界 | 1 | 1 | 1 条 |
| 边界 | 1 | 100 | 100 条(上限) |
| 异常 | 0 | 10 | 报错 |
| 异常 | -1 | 10 | 报错 |
| 异常 | 1 | 0 | 报错或返回空 |
| 异常 | 1 | 101 | 报错(超上限) |
| 异常 | 999999 | 10 | 返回空(无数据) |
5.4 错误推测法¶
凭经验设计可能出错的场景。
常见错误推测:
| 类型 | 场景 |
|---|---|
| 空值 | 必填字段空 / null / "" / " " |
| 类型错误 | 数字字段传字符串 |
| 格式错误 | 邮箱不带 @、手机号长度错 |
| 长度异常 | 超长字符串(256/1000/10000) |
| 特殊字符 | ' " < > & ; \ / |
| Unicode | 表情符 😀、繁体字、特殊文字 |
| SQL 关键字 | OR 1=1, ;DROP TABLE |
| 重复值 | 唯一字段重复提交 |
| 不存在的 ID | 查询不存在的资源 |
| 大数字 | int 越界(21 亿+) |
| 浮点精度 | 0.1 + 0.2 |
| 时间格式 | 错误格式、未来时间、闰年 |
5.5 因果图 / 判定表¶
适合复杂业务规则的设计。
示例:会员折扣规则
- 条件 1:是会员?
- 条件 2:订单金额 >= 100?
- 条件 3:当日首单?
| 用例 | 是会员 | 金额≥100 | 首单 | 折扣 |
|---|---|---|---|---|
| 1 | Y | Y | Y | 0.7(满足全部,7 折) |
| 2 | Y | Y | N | 0.8 |
| 3 | Y | N | Y | 0.9 |
| 4 | Y | N | N | 1.0 |
| 5 | N | Y | Y | 0.95 |
| 6 | N | Y | N | 1.0 |
| 7 | N | N | Y | 1.0 |
| 8 | N | N | N | 1.0 |
5.6 业务场景法(多接口)¶
跑通业务链路,验证多接口配合:
电商下单完整链路:
1. 登录 → 拿 token
2. 浏览商品 → 拿 productId
3. 加入购物车 → 拿 cartId
4. 提交订单 → 拿 orderId
5. 支付订单 → 拿 paymentId
6. 查询订单 → 验证状态
7. 申请退款 → 验证退款流程
每个接口的成功是下一个接口的前提,要设计:
- 正常流程
- 中途任一接口失败的处理
- 数据不一致的处理(如先支付后取消)
5.7 接口测试用例八大维度¶
| 维度 | 关注点 |
|---|---|
| 必填校验 | 必填字段为空、未传 |
| 参数类型 | 类型错误、null、类型转换 |
| 参数范围 | 边界值、超出范围 |
| 参数格式 | 邮箱、手机、日期格式 |
| 业务逻辑 | 业务规则、状态流转 |
| 接口安全 | 未登录、越权、SQL 注入 |
| 接口性能 | 响应时间、并发 |
| 异常处理 | 服务异常、超时、降级 |
5.8 用例设计 Checklist¶
发起测试前对照检查:
- 所有必填字段覆盖
- 字段类型/长度/格式覆盖
- 边界值覆盖
- 业务规则全部覆盖
- 异常场景(网络/超时/服务器错误)
- 鉴权场景(无 token/过期 token/无权限)
- 安全场景(SQL 注入/XSS/越权)
- 幂等性测试(重复调用)
- 数据一致性(接口返回 vs 数据库)
- 接口依赖(上下游服务状态)
- 日志/监控验证
六、接口测试完整流程¶
6.1 总体流程¶
6.2 阶段详解¶
阶段一:需求分析¶
目标: 理解业务,确认接口范围。
产出: - 接口清单(哪些接口、谁负责、何时联调) - 测试范围 - 风险点
关键问题: - 接口的业务背景是什么? - 接口的上下游依赖有哪些? - 哪些是新接口、哪些是改动接口? - 改动接口的影响范围?
阶段二:接口梳理¶
向开发要清接口文档,至少明确:
| 接口名 | URL | 方法 | 负责人 | 文档地址 | 联调时间 |
|--------|-----|------|--------|---------|---------|
| 登录 | /api/login | POST | 张三 | swagger#login | 6/10 |
| 注册 | /api/register | POST | 李四 | swagger#register | 6/11 |
阶段三:用例设计¶
按"用例设计章节"方法设计,输出 接口测试用例文档。
用例数量参考: - 简单接口(如查询):5-10 条 - 中等接口(如创建):10-20 条 - 复杂接口(如下单):20-50 条
阶段四:用例评审¶
参与人:测试 + 开发 + 产品
评审要点: - 用例是否覆盖需求 - 异常场景是否充分 - 是否有冗余用例 - 优先级是否合理
阶段五:环境准备¶
| 准备项 | 内容 |
|---|---|
| 测试环境 | 接口服务已部署 |
| 测试账号 | 不同角色账号(管理员、普通、新用户) |
| 测试数据 | 基础数据准备好(商品、订单等) |
| 测试工具 | Postman/Apifox 等配置好 |
| 抓包工具 | Fiddler/Charles 准备 |
| 数据库访问 | 必要时直连数据库校验 |
阶段六:用例执行¶
执行原则: - 按优先级执行:P0 → P1 → P2 - 先冒烟后全面:先验证主流程通畅 - 实时记录:边执行边记录 Bug - 截图保存:异常场景保留证据
执行节奏:
阶段七:缺陷跟踪¶
缺陷管理工具: Jira / TAPD / 禅道 / GitHub Issues
缺陷应包含:
标题:[接口] 登录接口在密码包含特殊字符时返回 500
环境:测试环境 / Chrome 120 / API v1.2.0
前置条件:用户已注册
复现步骤:
1. 调用 POST /api/login
2. Body:{"username":"test","password":"a'b\"c"}
期望结果:返回 200,code=0 或参数错误码
实际结果:返回 500,msg="Internal Server Error"
附件:
- 请求详情截图
- 响应详情截图
- 应用日志片段
优先级:P0
严重度:严重
阶段八:测试报告¶
报告内容:
# 接口测试报告
## 1. 测试概况
- 测试周期:2026-06-01 ~ 2026-06-07
- 测试环境:test
- 接口版本:v1.2.0
- 执行人:xxx
## 2. 测试范围
- 用户模块:8 个接口
- 订单模块:12 个接口
- 支付模块:5 个接口
- 合计:25 个接口,约 380 条用例
## 3. 测试结果
| 优先级 | 用例数 | 通过 | 失败 | 阻塞 | 通过率 |
|--------|-------|------|------|------|--------|
| P0 | 80 | 78 | 2 | 0 | 97.5% |
| P1 | 200 | 195 | 5 | 0 | 97.5% |
| P2 | 100 | 90 | 8 | 2 | 90% |
## 4. 缺陷统计
| 优先级 | 总数 | 已修复 | 待修复 |
|--------|------|--------|--------|
| P0 | 2 | 2 | 0 |
| P1 | 5 | 4 | 1 |
| P2 | 8 | 6 | 2 |
## 5. 风险与建议
- 支付接口在并发场景下有偶发 500,建议加强并发测试
- ...
阶段九:复盘¶
每个版本结束做复盘: - 漏测了哪些场景?为什么? - 哪些 Bug 应该更早发现? - 用例库需要补充什么? - 流程上哪里可以改进?
七、测试用例模板¶
7.1 标准用例模板¶
用例编号:API_LOGIN_001
用例标题:正常账号密码登录成功
所属模块:用户中心 - 登录
优先级:P0
预置条件:账号 testuser 已注册,密码为 123456
测试步骤:
1. 发起 POST 请求 /api/login
2. 请求 Header:Content-Type: application/json
3. 请求 Body:{"username":"testuser","password":"123456"}
预期结果:
1. HTTP 状态码:200
2. 响应 code:0
3. 响应 msg:成功
4. 响应 data.token:非空字符串
5. 响应 data.userId:12345
6. 响应耗时 < 500ms
实际结果:(执行后填写)
执行状态:(通过/失败)
缺陷链接:(如有)
执行人:xxx
执行时间:2026-06-07
7.2 简化用例模板(Excel 格式)¶
| 编号 | 标题 | 模块 | 优先级 | 前置条件 | 请求方法 | URL | Headers | Body | 预期 code | 预期 msg | 其他断言 | 实际结果 | 状态 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 001 | 正常登录 | 登录 | P0 | testuser 已注册 | POST | /api/login | application/json | {"u":"testuser","p":"123456"} | 0 | 成功 | data.token 非空 | ||
| 002 | 密码错误 | 登录 | P0 | testuser 已注册 | POST | /api/login | application/json | {"u":"testuser","p":"wrong"} | 1001 | 密码错误 | data 为 null | ||
| 003 | 账号不存在 | 登录 | P0 | nouser 未注册 | POST | /api/login | application/json | {"u":"nouser","p":"123456"} | 1002 | 账号不存在 |
7.3 完整用例示例:登录接口¶
用例集:用户登录接口(25 条用例)
一、必填校验(5 条)¶
| 编号 | 场景 | username | password | 期望 |
|---|---|---|---|---|
| 001 | username 不传 | (不传) | 123456 | code=1003,提示 username 必填 |
| 002 | username 空字符串 | "" | 123456 | code=1003 |
| 003 | username 为 null | null | 123456 | code=1003 |
| 004 | password 不传 | testuser | (不传) | code=1003 |
| 005 | 全部不传 | (不传) | (不传) | code=1003 |
二、参数类型(4 条)¶
| 编号 | 场景 | username | password | 期望 |
|---|---|---|---|---|
| 006 | username 传数字 | 12345 | 123456 | 系统应转字符串处理或报错 |
| 007 | username 传 JSON 对象 | {} | 123456 | code=1003 |
| 008 | password 传数字 | testuser | 123456 (数字类型) | 视约定 |
| 009 | password 传 boolean | testuser | true | code=1003 |
三、参数长度(6 条)¶
| 编号 | 场景 | username | password | 期望 |
|---|---|---|---|---|
| 010 | username 1 个字符 | a | 123456 | code=1003 |
| 011 | username 4 个字符(下边界) | abcd | 123456 | code=0 |
| 012 | username 20 个字符(上边界) | a*20 | 123456 | code=0 |
| 013 | username 21 个字符 | a*21 | 123456 | code=1003 |
| 014 | password 5 个字符 | testuser | 12345 | code=1003 |
| 015 | password 1000 个字符 | testuser | a*1000 | code=1003 |
四、特殊字符(5 条)¶
| 编号 | 场景 | username | password | 期望 |
|---|---|---|---|---|
| 016 | username 含中文 | 测试用户 | 123456 | code=1003 或允许(看需求) |
| 017 | username 含表情 | test😀 | 123456 | 不报错,正确处理 |
| 018 | username SQL 注入 | admin' OR '1'='1 | any | code=1001 或 1002,不应登录成功 |
| 019 | username XSS | <script>alert(1)</script> |
123456 | 不报错,字符被转义 |
| 020 | password 含特殊字符 | testuser | a!@#$%^&* | 应支持 |
五、业务逻辑(5 条)¶
| 编号 | 场景 | 前置 | 期望 |
|---|---|---|---|
| 021 | 正常登录 | 账号正常 | code=0,返回 token |
| 022 | 密码错误 | 账号正常 | code=1001 |
| 023 | 账号不存在 | 账号未注册 | code=1002 |
| 024 | 账号被锁定 | 账号被锁 | code=1005 |
| 025 | 连续 5 次密码错误后需验证码 | 已错 4 次 | 第 5 次返回 code=1004 |
7.4 用例评审单¶
评审项目:登录接口测试用例
评审时间:2026-06-07
参与人员:测试-张三、开发-李四、产品-王五
评审结论:
[√] 通过
[ ] 修改后通过
[ ] 不通过
修改意见:
1. 用例 016 中文用户名需求未明确,会后产品补充
2. 增加"密码包含空格"的用例
3. 用例 018 SQL 注入需联调安全组验证
签字:
测试:张三
开发:李四
产品:王五
八、工具选型对比¶
8.1 主流工具对比¶
| 工具 | 类型 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| Postman | 商业 | 易用、生态成熟、协作好 | 高级功能收费 | 手工测试+轻自动化 |
| Apifox | 国产免费 | 文档+测试+Mock 一体化 | 桌面端较重 | 国内团队首选 |
| JMeter | 开源 | 性能测试强、免费 | 学习曲线陡 | 性能测试 |
| SoapUI | 商业/开源 | SOAP 接口强 | 现代接口偏弱 | 传统行业 |
| HttpRunner | 开源 | YAML 驱动、轻量 | 社区相对小 | 自动化框架 |
| RestAssured | 开源 | Java 生态融合 | 需要 Java 基础 | Java 团队 |
| Python + Requests | 自研 | 灵活、可定制 | 需要开发 | 中大型自动化 |
| Fiddler/Charles | 商业 | 抓包分析 | 不能主动测试 | 配合手工测试 |
8.2 选型建议¶
按场景选型:
| 场景 | 推荐工具 |
|---|---|
| 手工接口测试 | Postman / Apifox |
| 性能测试 | JMeter / Locust |
| 抓包分析 | Fiddler / Charles |
| 接口自动化(轻量) | Postman + Newman |
| 接口自动化(重量) | Python + Pytest + Allure |
| 团队协作管理 | Apifox / YApi |
| Mock 服务 | Apifox / WireMock |
按团队选型:
| 团队情况 | 推荐 |
|---|---|
| 测试人员代码能力弱 | Postman / Apifox |
| 测试人员有 Python 基础 | Python + Pytest |
| 测试人员有 Java 基础 | RestAssured / TestNG |
| 测试外包/初创公司 | Apifox(免费、一体化) |
| 需要平台化 | 自研平台 / 开源 MeterSphere |
8.3 工具组合推荐¶
最小可行组合(初级测试):
标准组合(中级测试):
高级组合(自动化测试):
九、Mock 与挡板技术¶
9.1 什么是 Mock¶
Mock: 模拟接口的返回,让测试不依赖真实服务。
为什么需要 Mock:
- 后端接口未开发完
- 第三方接口调用费用高(短信、支付)
- 难以触发的场景(账号被冻结、第三方超时)
- 测试环境不稳定
- 前后端并行开发
9.2 Mock 工具¶
| 工具 | 特点 |
|---|---|
| Apifox Mock | 配置简单,与文档联动 |
| Postman Mock Server | 与 Postman 生态集成 |
| WireMock | 强大、可编程 |
| JSON Server | 30 秒搭建 REST Mock |
| Mock.js | 前端 Mock |
| MockServer | Java 编写,企业级 |
9.3 Mock 数据策略¶
| 策略 | 说明 | 使用场景 |
|---|---|---|
| 固定 Mock | 总返回相同内容 | 简单场景 |
| 条件 Mock | 按请求参数返回不同 | 多场景测试 |
| 随机 Mock | 返回随机数据 | 数据多样性 |
| 延迟 Mock | 模拟超时 | 异常测试 |
| 错误 Mock | 返回 5xx/异常 | 容错测试 |
| 状态机 Mock | 多次调用状态变化 | 流程测试 |
9.4 实战示例¶
场景:测试支付回调,但真实支付不便触发
- Mock 支付回调接口的请求格式(与生产一致)
- 准备多种场景的 Mock 响应:
- 支付成功
- 支付失败
- 支付处理中
- 重复回调
- 触发被测系统调用 Mock,验证业务逻辑
示例:Apifox 配置条件 Mock
// 根据请求参数返回不同响应
if (req.body.amount > 1000) {
return { code: 4001, msg: "金额超限" };
} else if (req.body.amount <= 0) {
return { code: 4002, msg: "金额非法" };
} else {
return { code: 0, msg: "成功", data: { orderId: 100001 } };
}
9.5 挡板(Stub)vs Mock¶
- Mock: 主动模拟返回,有断言能力
- Stub: 替代真实服务的桩,更轻量
在测试人员视角,两者差异不大,统称 Mock。
9.6 注意事项¶
- Mock 和真实接口要一致:字段、类型、状态码
- 及时切换回真实接口:联调完成后用真实接口回归
- Mock 数据要清晰标识:避免误用 Mock 数据上线
- 同步更新:接口变更后 Mock 也要更新
十、接口安全测试¶
10.1 OWASP API 安全 Top 10¶
OWASP 是国际安全权威组织,定期发布 API 安全风险榜单。以下为 2023 版(相比 2019 版新增了 SSRF、Unsafe Consumption of APIs 等项):
- 失效的对象级授权(BOLA / IDOR)
- 失效的认证(Broken Authentication)
- 失效的对象属性级授权(原"过度数据暴露"+"批量分配"合并)
- 不受限制的资源消耗(Unrestricted Resource Consumption,含缺乏速率限制、资源不限制等)
- 失效的功能级授权(Broken Function Level Authorization)
- 不受限制的敏感业务流访问(Unrestricted Access to Sensitive Business Flows)
- 服务端请求伪造(SSRF)— 2023 新增
- 安全配置错误(Security Misconfiguration)
- 不当的资产管理与 API 服务退役(Improper Inventory Management)
- 不安全的 API 消费(Unsafe Consumption of APIs)— 2023 新增
10.2 认证与鉴权测试¶
认证(Authentication): 你是谁
鉴权(Authorization): 你能做什么
测试要点:
| 类型 | 测试场景 |
|---|---|
| 未认证 | 不带 Token 访问需要登录的接口 → 应返回 401 |
| Token 无效 | 随机字符串作为 Token → 应返回 401 |
| Token 过期 | 使用过期 Token → 应返回 401 |
| Token 篡改 | 修改 Token 中间几位 → 应返回 401 |
| Token 复用 | 注销后 Token 还能用 → Bug |
| 越权访问 | 用户 A 用 token 访问用户 B 的资源 → 应拒绝 |
| 权限提升 | 普通用户访问管理员接口 → 应拒绝 |
| 接口绕过 | 直接访问需要前置接口的接口 |
越权(IDOR)经典案例:
正常:用户 A 查询自己订单
GET /api/order/123
Headers: token=A 的 token
越权测试:用 A 的 token 查询 B 的订单
GET /api/order/456 (456 是用户 B 的订单)
Headers: token=A 的 token
期望:返回 403 或 404(不能透露资源存在)
实际:如果返回 B 的订单详情 → 严重 Bug
10.3 SQL 注入测试¶
原理: 在参数中插入 SQL 代码,骗后端拼接执行。
经典 Payload:
' OR '1'='1
' OR 1=1--
admin' --
'; DROP TABLE users; --
1' UNION SELECT username, password FROM users--
测试方法:
- 在所有用户可控的输入点尝试上述 Payload
- 观察响应:
- 返回不该返回的数据 → 注入成功
- 返回 SQL 错误信息 → 后端有漏洞
- 响应时间异常长 → 可能时间盲注
示例:登录接口
如果能成功登录 → SQL 注入 Bug。
工具: SQLMap(自动化 SQL 注入检测)
10.4 XSS 攻击测试¶
原理: 注入恶意脚本到页面,他人访问时执行。
经典 Payload:
测试方法:
- 在评论、昵称、描述等字段提交 Payload
- 在其他页面查看是否被解析执行
- 检查响应:恶意字符应被转义为
<script>
10.5 越权测试¶
水平越权: 同级用户互相访问数据
垂直越权: 低权限用户访问高权限接口
10.6 敏感信息泄露¶
测试场景:
- 响应中是否含密码、手机号、身份证(应脱敏)
- 错误信息是否泄露技术栈(如 SQL 语句、文件路径)
- 接口是否传输了不必要的字段(如内部状态、价格成本)
- Token 是否在 URL 中(应放 Header)
- 日志是否记录了敏感信息
10.7 限流与防刷¶
测试场景:
| 场景 | 期望 |
|---|---|
| 短时间高频调用同一接口 | 触发限流,返回 429 |
| 同一 IP 大量调用 | 触发 IP 封禁 |
| 同一账号同时多端登录 | 按策略处理 |
| 暴力破解密码 | 5 次错误锁定账号 |
| 验证码爆破 | 验证码失效或限频 |
10.8 文件上传安全¶
| 测试场景 | 期望 |
|---|---|
| 上传超大文件 | 限制大小,不应拒绝服务 |
| 上传可执行文件(.exe、.sh) | 应拒绝 |
| 上传脚本文件(.php、.jsp) | 应拒绝 |
文件名含 ../../ |
不应能跳出目录 |
| 上传重复文件 | 应处理冲突 |
| 上传 0KB 文件 | 应处理 |
10.9 安全测试清单¶
每个接口必查:
- 是否需要认证(公开接口除外)
- Token 失效后无法访问
- 越权场景测试通过
- SQL 注入 Payload 不生效
- XSS Payload 被正确转义
- 敏感字段已脱敏
- 高频调用有限流
- 错误信息不泄露技术细节
- 上传接口有文件类型/大小校验
- 关键操作有日志记录
十一、接口性能测试¶
11.1 性能测试关注指标¶
| 指标 | 含义 | 关注阈值 |
|---|---|---|
| RT(响应时间) | 单次请求耗时 | < 200ms 优秀,< 1s 可接受 |
| TPS | 每秒事务数 | 看业务要求 |
| QPS | 每秒查询数 | 看业务要求 |
| 并发用户数 | 同时在线人数 | 看业务要求 |
| 错误率 | 失败请求占比 | < 0.1% |
| CPU 使用率 | 服务器 CPU | < 70% |
| 内存使用率 | 服务器内存 | < 80% |
11.2 性能测试类型¶
| 类型 | 目的 |
|---|---|
| 基准测试 | 单用户单次性能基线 |
| 负载测试 | 增加压力,找性能拐点 |
| 压力测试 | 超出极限,看系统行为 |
| 并发测试 | 同时操作的正确性 |
| 稳定性测试 | 长时间运行(24 小时+) |
| 峰值测试 | 模拟瞬时高峰(秒杀) |
11.3 性能测试工具¶
| 工具 | 特点 |
|---|---|
| JMeter | 老牌、功能全 |
| Locust | Python 编写、简洁 |
| k6 | JavaScript、现代 |
| Gatling | Scala、高性能 |
| wrk | 命令行、简单粗暴 |
| Apifox 性能模块 | 国产工具集成 |
11.4 JMeter 极简流程¶
1. 测试计划 → 添加线程组(虚拟用户)
2. 线程组 → 添加 HTTP 请求
3. HTTP 请求 → 配置 URL/参数
4. 添加监听器(聚合报告/查看结果树)
5. 配置:并发数、循环次数、压测时长
6. 启动 → 查看报告
线程组参数:
- 线程数(用户数): 同时模拟多少个虚拟用户
- Ramp-Up 时间: 多久内启动所有线程(避免瞬时高峰)
- 循环次数: 每个用户跑几次
11.5 性能测试用例设计¶
示例:登录接口性能测试
| 用例 | 并发数 | 持续时间 | 期望 RT | 期望 TPS | 期望错误率 |
|---|---|---|---|---|---|
| 基准 | 1 | 1 分钟 | < 200ms | - | 0% |
| 低并发 | 50 | 5 分钟 | < 300ms | > 200 | < 0.1% |
| 中并发 | 200 | 10 分钟 | < 500ms | > 800 | < 0.5% |
| 高并发 | 500 | 5 分钟 | < 1s | > 1500 | < 1% |
| 极限 | 1000 | 5 分钟 | 找拐点 | 找瓶颈 | - |
| 稳定性 | 200 | 4 小时 | 稳定 | 稳定 | < 0.5% |
11.6 性能测试报告要素¶
# 登录接口性能测试报告
## 测试目的
评估登录接口在 500 用户并发下的性能表现。
## 测试环境
- 服务器:4C8G * 2 台
- 数据库:MySQL 8.0,单实例 4C16G
- 测试工具:JMeter 5.6
- 测试机:4C8G
## 测试场景
- 并发用户数:500
- Ramp-Up:60 秒
- 测试时长:10 分钟
- 测试数据:1000 个测试账号
## 测试结果
| 指标 | 实际值 | 期望值 | 是否通过 |
|------|--------|--------|---------|
| 平均 RT | 280ms | < 500ms | ✓ |
| 95% RT | 450ms | < 800ms | ✓ |
| TPS | 1620 | > 1500 | ✓ |
| 错误率 | 0.05% | < 0.5% | ✓ |
| CPU | 65% | < 70% | ✓ |
| 内存 | 72% | < 80% | ✓ |
## 性能瓶颈分析
- 数据库连接池已用 80%,建议调整
- ...
## 结论与建议
登录接口在 500 并发下满足性能要求,建议数据库连接池扩容。
十二、接口自动化策略¶
12.1 何时引入自动化¶
适合: - 接口相对稳定 - 回归测试频繁 - 测试用例可复用 - 团队有维护能力
不适合: - 接口频繁变动(每周大改) - 一次性项目 - 团队完全没编码能力
12.2 自动化覆盖范围建议¶
| 用例类型 | 自动化建议 |
|---|---|
| 冒烟测试 | 100% 自动化(每次发布必跑) |
| 主流程 | 80% 自动化 |
| 异常分支 | 50% 自动化(高价值场景) |
| 边界值 | 50% 自动化 |
| 一次性场景 | 不自动化(投入产出比低) |
| 探索性测试 | 不自动化(人工灵活) |
12.3 自动化分层策略¶
12.4 自动化分阶段实施¶
阶段一:试点(1-2 个月) - 选 1-2 个稳定模块 - 跑通基础框架(5-10 个用例) - 验证可行性
阶段二:扩展(3-6 个月) - 覆盖核心模块 - 建立用例库(100+ 用例) - 接入 CI/CD
阶段三:成熟(6 个月后) - 全面覆盖(500+ 用例) - 每天定时回归 - 接入监控告警
12.5 用例稳定性保证¶
| 问题 | 解决方案 |
|---|---|
| 测试数据被污染 | 每个用例使用独立数据,或执行后清理 |
| 接口偶发超时 | 失败重试(pytest-rerunfailures) |
| 环境不稳定 | 健康检查 + 告警 |
| 并发资源冲突 | 用例之间避免操作同一资源 |
| 字段顺序变化 | 用 JSONPath 提取,不依赖顺序 |
| 时间相关字段 | 用相对断言(如"在最近 1 分钟内") |
12.6 自动化的常见误区¶
❌ 追求 100% 覆盖率 → 投入产出不平衡
❌ 完全替代手工测试 → 探索性测试依然需要
❌ 自动化等于无人值守 → 仍需维护、监控
❌ 用例越多越好 → 维护成本指数增长
❌ 跑通了就完事 → 失败用例不分析等于没跑
十三、实战案例¶
13.1 案例一:电商下单接口完整测试¶
接口信息:
POST /api/order/create
Content-Type: application/json
Authorization: Bearer {token}
Body:
{
"userId": 12345,
"items": [
{"productId": 1001, "quantity": 2},
{"productId": 1002, "quantity": 1}
],
"addressId": 999,
"couponId": 888,
"remark": "尽快发货"
}
用例集(35 条):
一、必填校验(5 条)¶
- userId 不传 / 为空 / 为 null
- items 不传 / 为空数组
- addressId 不传
二、参数有效性(10 条)¶
- userId 不存在
- productId 不存在
- productId 已下架
- quantity 为 0 / 负数 / 超大
- addressId 不属于该用户(越权)
- couponId 已使用 / 已过期 / 不存在
三、业务规则(10 条)¶
- 商品库存不足
- 商品价格在下单时被改
- 优惠券不满足使用条件(最低消费)
- 优惠券与商品不匹配
- 多商品分别属于不同店铺(拆单)
- 触发库存预警
- 触发风控规则
- 用户被限购
- 秒杀商品时段外下单
- 跨境商品不能配送到指定地址
四、并发场景(3 条)¶
- 同一商品多用户秒杀(库存 1,100 人抢)
- 同一用户重复提交(防重)
- 优惠券抢光后还能否用
五、安全场景(4 条)¶
- 无 token 调用
- token 过期
- 修改 userId 用别人账户下单
- SQL 注入 / XSS 测试
六、性能场景(3 条)¶
- 单接口 RT < 500ms
- 200 并发持续 5 分钟
- 1000 并发峰值
典型用例详情:
- 编号: ORDER_001
场景: 正常下单
前置:
- 用户 testuser 已登录
- 商品 1001 库存充足
- 地址 999 属于该用户
请求:
method: POST
url: /api/order/create
headers:
Authorization: Bearer {{token}}
body:
userId: 12345
items: [{"productId": 1001, "quantity": 2}]
addressId: 999
期望:
http_status: 200
code: 0
msg: 成功
data.orderId: 非空
data.totalAmount: = 商品单价 * 2
data.status: WAIT_PAY
附加验证:
- 数据库 orders 表新增 1 条记录
- 商品库存减少 2
- 用户消息推送已发送
- 编号: ORDER_015
场景: 库存不足
前置:
- 商品 1003 库存 = 1
请求:
body:
items: [{"productId": 1003, "quantity": 5}]
期望:
code: 3001
msg: 商品库存不足
附加验证:
- 数据库 orders 表无新增
- 商品库存不变
13.2 案例二:登录限流测试¶
需求: 同一账号 1 分钟内密码错误 5 次后锁定 30 分钟。
测试设计:
准备:测试账号 limit_test,初始正常状态
执行:
循环 5 次:
调用登录,密码 wrong
期望返回 1001(密码错误)
第 6 次:
调用登录,密码 wrong
期望返回 1005(账号锁定)
第 7 次:
调用登录,密码正确
期望返回 1005(仍锁定)
等待 30 分钟(自动化中可用脚本修改数据库时间或等待)
继续:
调用登录,密码正确
期望返回 0(成功)
数据库验证:
- 检查 user 表 lock_status 字段
- 检查 login_log 表的失败记录
13.3 案例三:支付链路集成测试¶
业务流程:
测试要点:
- 正常链路:每个环节都成功
- 支付失败:用户取消、银行返回失败
- 支付超时:用户长时间不操作
- 回调丢失:第三方回调未到达
- 回调重复:同一回调多次触发
- 回调篡改:签名校验
- 金额不一致:订单金额 vs 回调金额
- 状态机异常:未支付订单收到退款回调
Mock 应用: 第三方支付难以触发的场景,用 Mock 模拟回调请求。
13.4 案例四:列表分页查询测试¶
接口: GET /api/order/list?page=1&size=10&status=PAID&startDate=2026-01-01
用例集(22 条):
| 编号 | 场景 | 期望 |
|---|---|---|
| 001 | 正常分页 | 返回 10 条 |
| 002 | 不传 page | 默认 page=1 |
| 003 | 不传 size | 默认 size=20 |
| 004 | page=0 | 报错或默认 1 |
| 005 | page=-1 | 报错 |
| 006 | page 极大值 | 返回空列表 |
| 007 | size=0 | 报错 |
| 008 | size 超上限(如 1000) | 报错或限制为最大值 |
| 009 | status 合法值 | 正确过滤 |
| 010 | status 非法值 | 报错 |
| 011 | status 不传 | 返回全部 |
| 012 | 日期格式错误 | 报错 |
| 013 | startDate > endDate | 报错或空 |
| 014 | 跨年查询 | 正确 |
| 015 | 总数为 0 | 返回空列表,total=0 |
| 016 | 越权查别人订单 | 不返回 |
| 017 | 排序字段错误 | 报错 |
| 018 | 数据按时间倒序 | 第一条最新 |
| 019 | 分页 total 准确 | 与数据库总数一致 |
| 020 | 翻页数据无重复无遗漏 | 1-10 页拼接 = 全量 |
| 021 | 性能:1000 万数据查询 | < 1s |
| 022 | 并发查询 | 数据一致 |
十四、常见问题与最佳实践¶
14.1 高频问题¶
Q1:接口返回 200,但 code 不为 0,算成功还是失败?
A:HTTP 200 只是传输层成功,业务层成功要看 code。测试时两者都要断言: - HTTP 状态码 = 200(传输成功) - 业务 code = 0(业务成功)
Q2:没有接口文档怎么测?
A: 1. 先抓包了解接口形态(Fiddler) 2. 找开发要 Swagger 或直接看代码 3. 测试时倒逼开发补文档 4. 不要默默接受"无文档测试",这是流程问题
Q3:接口测试和功能测试有冲突吗?
A:不冲突,互补关系: - 接口测试:验证后端逻辑、异常分支 - 功能测试:验证完整用户体验 - 协同:接口测试覆盖底层,功能测试覆盖端到端
Q4:接口字段很多,每个都要断言吗?
A:不必。优先断言: - 业务关键字段(如 orderId、amount、status) - 容易出 Bug 的字段(计算字段、时间字段) - 字段类型(避免类型错误)
次要字段可批量校验 JSON Schema。
Q5:发现 Bug 后开发说"前端会处理",要不要提?
A:必须提。原因: 1. 接口是公共能力,可能被多端调用 2. 第三方可能直接调你的接口 3. 后端兜底是底线 4. 防御性编程是基本要求
Q6:自动化用例失败了,是 Bug 还是脚本问题?
A:排查顺序: 1. 手工复现(Postman 调一次) 2. 如果手工 OK → 脚本问题 3. 如果手工也失败 → Bug 4. 如果偶发失败 → 加重试机制 + 收集监控数据
14.2 测试人员能力进阶路径¶
初级(半年)
├─ 掌握 HTTP 协议基础
├─ 会用 Postman / Apifox
├─ 能基于文档设计用例
└─ 会基础抓包
中级(1-2 年)
├─ 熟悉接口文档工具
├─ 掌握用例设计方法
├─ 能独立完成接口测试
├─ 会简单的脚本(Python/JS 基础)
└─ 了解性能测试基础
高级(3 年+)
├─ 搭建接口自动化框架
├─ 接入 CI/CD
├─ 独立完成性能测试
├─ 掌握安全测试基础
├─ 推动测试流程优化
└─ 培养团队成员
专家(5 年+)
├─ 测试平台建设
├─ 测试策略制定
├─ 跨团队推动质量改进
├─ 引入新方法、新工具
└─ 测试技术分享、社区影响力
14.3 最佳实践清单¶
用例设计: - [ ] 每个接口至少覆盖必填、类型、长度、业务、异常 5 个维度 - [ ] 用例独立可重复 - [ ] 优先级清晰 - [ ] 期望结果具体到字段
执行规范: - [ ] 测试环境单独搭建,不共用 - [ ] 测试数据独立,不污染共享数据 - [ ] 异常场景必测,不只测正常路径 - [ ] 数据库结果校验作为补充
协作流程: - [ ] 提早介入需求评审 - [ ] 用例评审拉上开发和产品 - [ ] 缺陷描述清晰,含复现步骤 - [ ] 定期复盘漏测原因
自动化: - [ ] 自动化用例稳定(成功率 > 95%) - [ ] 失败用例当天分析 - [ ] 框架持续优化 - [ ] 与 CI/CD 集成
安全意识: - [ ] 不在用例中硬编码生产账号 - [ ] 敏感数据加密存储 - [ ] 不在生产环境跑自动化 - [ ] 测试日志注意脱敏
14.4 推荐学习资源¶
书籍: - 《HTTP 权威指南》 - 《图解 HTTP》 - 《RESTful Web APIs》 - 《Web 安全攻防:渗透测试实战指南》 - 《全栈性能测试修炼宝典:JMeter 实战》
社区/网站: - TesterHome(国内最大测试社区) - 阿里测试技术博客 - OWASP 官方文档 - MDN Web Docs(HTTP 学习)
视频/课程: - 极客时间《接口测试入门课》 - B 站搜"接口测试"相关教程
附录:术语速查表¶
| 术语 | 含义 |
|---|---|
| API | Application Programming Interface |
| REST | Representational State Transfer |
| RPC | Remote Procedure Call |
| JWT | JSON Web Token |
| CORS | 跨域资源共享 |
| CSRF | 跨站请求伪造 |
| XSS | 跨站脚本攻击 |
| SQL Injection | SQL 注入 |
| IDOR | 不安全的直接对象引用(越权) |
| BOLA | 失效的对象级授权 |
| TPS | Transactions Per Second |
| QPS | Queries Per Second |
| RT | Response Time |
| Mock | 模拟接口 |
| Stub | 桩 / 挡板 |
| CI/CD | 持续集成 / 持续部署 |
| OWASP | 开放式 Web 应用安全项目 |
| OpenAPI | 接口描述规范(Swagger 2.0 捐给 Linux 基金会后改名为 OpenAPI 3.0;Swagger 现指工具集,如 Swagger UI/Editor) |
文档说明
本教程为接口测试方法论教程,与 Postman / Fiddler / Python 自动化等工具类教程配合使用,效果更佳。
测试纪律
接口测试中涉及的所有用户数据、Token、密码等敏感信息,必须使用测试专用账号,禁止使用真实生产数据。安全测试(SQL 注入、XSS 等)必须在测试环境进行,禁止对生产系统未授权测试。