跳转至

接口测试完整教程(软件测试人员专用)

本教程从理论与方法论出发,系统讲解接口测试的概念、流程、用例设计、工具选型与实战案例。与工具类教程(Postman/Fiddler/Python 自动化)形成互补,帮助测试人员建立完整的接口测试知识体系。


前置要求

项目 要求 获取方式
HTTP 协议 了解请求方法、状态码、请求头与响应体 网络知识教程-软件测试版
Postman 基础 会发送请求、查看响应、使用环境变量 Postman接口测试教程-软件测试版

新手导读

接口测试不是简单“用工具调接口”。它关注的是前端、App 或第三方系统调用后端时,数据、权限、状态和异常处理是否正确。

第一遍建议按这个顺序学:

  1. 先理解请求和响应。
  2. 再学习接口文档怎么看。
  3. 接着学习接口用例怎么设计。
  4. 然后用 Postman 执行接口测试。
  5. 最后再考虑自动化、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-Type
  • 500 → 后端 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 二进制流

Cookie: 服务器写入客户端的小段数据,客户端每次请求自动携带。

Session: 服务器端会话存储,通过 Cookie 中的 sessionId 关联。

登录 → 服务端生成 SessionId → Set-Cookie 返回客户端
          → 服务端保存 Session 数据(账号、权限)
后续请求 → 客户端自动携带 Cookie → 服务端通过 SessionId 查 Session

Token(JWT 常见): 无状态认证,所有信息加密在 Token 里。

登录 → 服务端生成 Token(含用户信息+签名)→ 返回客户端
后续请求 → 客户端在 Header 携带 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 风格"(仍很常见):

POST /api/getUser?id=123
POST /api/createUser
POST /api/deleteUser?id=123

测试不论风格,方法论一致

实际项目中混搭很常见。

3.2 GraphQL

由 Facebook 推出的查询语言,客户端可精确指定需要的字段。

特点: - 单一 endpoint(通常 /graphql) - 客户端定义返回结构 - 减少 over-fetching 和 under-fetching

请求示例:

POST /graphql
{
  user(id: 123) {
    name
    email
    orders {
      id
      amount
    }
  }
}

响应只返回请求的字段。

3.3 WebSocket

基于 TCP 的全双工通信协议,常用于即时通讯、推送、实时数据。

与 HTTP 区别: - 长连接(HTTP 通常短连接) - 双向通信(HTTP 单向请求-响应) - 协议头从 http:// 变为 ws://,HTTPS 对应 wss://

测试工具: Postman 支持 WebSocket、wscat 命令行工具

3.4 RPC(Remote Procedure Call)

远程过程调用,常见于微服务内部通信。

主流框架:

框架 公司 协议
gRPC Google HTTP/2 + Protobuf
Dubbo 阿里 TCP 二进制
Thrift Facebook 自定义二进制
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 接口文档解读要点

测试人员拿到接口文档,要重点关注:

  1. 参数边界:长度、范围、格式
  2. 必填字段:缺失会怎样
  3. 字段类型:传错类型怎么处理
  4. 业务规则:账号锁定逻辑、验证码触发条件
  5. 异常状态码:是否覆盖了所有场景
  6. 接口依赖:调用前需要哪些前置数据
  7. 接口幂等性:重复调用是否有问题
  8. 接口版本:是否有 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 - 截图保存:异常场景保留证据

执行节奏:

day1: 冒烟(核心接口主流程)
day2-3: P0 全量
day4: P1 全量
day5: P2 全量
day6+: 回归 + 集成场景

阶段七:缺陷跟踪

缺陷管理工具: 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 工具组合推荐

最小可行组合(初级测试):

Postman(手工测试)+ Fiddler(抓包)

标准组合(中级测试):

Apifox(手工 + 文档 + Mock)+ JMeter(性能)

高级组合(自动化测试):

Python + Requests + Pytest + Allure + Jenkins + Fiddler

九、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 实战示例

场景:测试支付回调,但真实支付不便触发

  1. Mock 支付回调接口的请求格式(与生产一致)
  2. 准备多种场景的 Mock 响应:
  3. 支付成功
  4. 支付失败
  5. 支付处理中
  6. 重复回调
  7. 触发被测系统调用 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 注意事项

  1. Mock 和真实接口要一致:字段、类型、状态码
  2. 及时切换回真实接口:联调完成后用真实接口回归
  3. Mock 数据要清晰标识:避免误用 Mock 数据上线
  4. 同步更新:接口变更后 Mock 也要更新

十、接口安全测试

10.1 OWASP API 安全 Top 10

OWASP 是国际安全权威组织,定期发布 API 安全风险榜单。以下为 2023 版(相比 2019 版新增了 SSRF、Unsafe Consumption of APIs 等项):

  1. 失效的对象级授权(BOLA / IDOR)
  2. 失效的认证(Broken Authentication)
  3. 失效的对象属性级授权(原"过度数据暴露"+"批量分配"合并)
  4. 不受限制的资源消耗(Unrestricted Resource Consumption,含缺乏速率限制、资源不限制等)
  5. 失效的功能级授权(Broken Function Level Authorization)
  6. 不受限制的敏感业务流访问(Unrestricted Access to Sensitive Business Flows)
  7. 服务端请求伪造(SSRF)— 2023 新增
  8. 安全配置错误(Security Misconfiguration)
  9. 不当的资产管理与 API 服务退役(Improper Inventory Management)
  10. 不安全的 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--

测试方法:

  1. 在所有用户可控的输入点尝试上述 Payload
  2. 观察响应:
  3. 返回不该返回的数据 → 注入成功
  4. 返回 SQL 错误信息 → 后端有漏洞
  5. 响应时间异常长 → 可能时间盲注

示例:登录接口

{"username": "admin' OR '1'='1", "password": "anything"}

如果能成功登录 → SQL 注入 Bug。

工具: SQLMap(自动化 SQL 注入检测)

10.4 XSS 攻击测试

原理: 注入恶意脚本到页面,他人访问时执行。

经典 Payload:

<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
javascript:alert(1)

测试方法:

  1. 在评论、昵称、描述等字段提交 Payload
  2. 在其他页面查看是否被解析执行
  3. 检查响应:恶意字符应被转义为 &lt;script&gt;

10.5 越权测试

水平越权: 同级用户互相访问数据

用户 A:GET /api/user/A/info  ✓
用户 A:GET /api/user/B/info  应失败

垂直越权: 低权限用户访问高权限接口

普通用户:POST /api/admin/deleteUser  应失败

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 自动化分层策略

   ╱╲
  ╱  ╲   UI 自动化(5%)
 ╱    ╲   关键流程冒烟
╱──────╲
─────────  
   接口自动化(25%)    ← 主战场
   覆盖业务逻辑
─────────
   单元测试(70%)
   开发负责

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 案例三:支付链路集成测试

业务流程:

创建订单 → 发起支付 → 第三方支付 → 支付回调 → 订单状态更新 → 触发发货

测试要点:

  1. 正常链路:每个环节都成功
  2. 支付失败:用户取消、银行返回失败
  3. 支付超时:用户长时间不操作
  4. 回调丢失:第三方回调未到达
  5. 回调重复:同一回调多次触发
  6. 回调篡改:签名校验
  7. 金额不一致:订单金额 vs 回调金额
  8. 状态机异常:未支付订单收到退款回调

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 等)必须在测试环境进行,禁止对生产系统未授权测试。


下一步建议

### 完成检查 学完本教程后,检查自己是否能做到: - [ ] 能解释 HTTP 请求和响应的结构 - [ ] 能解释状态码的含义 - [ ] 能解释 Header、Cookie、Token 的作用 - [ ] 能根据接口文档设计正向测试用例 - [ ] 能根据接口文档设计异常测试用例 - [ ] 能根据接口文档设计安全测试用例 ### 推荐下一步 根据你的学习进度,选择下一步: 1. **如果你想学性能测试**:学习 [JMeter 性能测试](JMeter性能测试教程-软件测试版.md),掌握压力测试 2. **如果你想学安全测试**:学习 [Web 安全测试](Web安全测试教程-软件测试版.md),掌握漏洞识别 3. **如果你想进入自动化**:学习 [Python 接口自动化](../自动化测试/Python+Requests+Allure接口自动化教程-软件测试版.md),掌握代码化测试 ### 通关检查 完成本阶段后,使用 [第3阶段-专项测试通关](../学习中心/第3阶段-专项测试通关.md) 检查是否可以进入下一阶段。