接口测试实战:从入门到用例设计

接口测试实战:从入门到用例设计

这篇教程按「概念 → 实操 → 设计」的顺序,把接口测试从零讲到能自己写用例。它假设你完全没写过代码:先用生活比喻把 Python 里最要紧的几样语法讲通,再带你用 requests 真正把请求发出去、把返回拆开、把结果断言,最后落到”一个接口到底要设计多少条用例”这件最见功力的事上。三部分按学习顺序排列,建议从头往下读;已经会 Python 的,可以直接跳到第二部分。

开篇:什么是接口测试,为什么值得学

接口(API)是系统之间约定好的”对话方式”。前端页面要拿用户信息、后台要调支付、两个服务之间要传数据,都不是人点出来的,而是程序按一套约定:你发一段请求,它回一段响应。这套约定由三样东西描述清楚——请求发到哪里(URL 和请求方法)、带什么参数(Header 和 Body)、以及响应里应该有什么(状态码和返回字段)。

接口测试,就是绕开界面,直接对着这套约定发请求、验响应。UI 上点一个”登录”按钮,背后可能是一串接口在跑;接口测试不看按钮漂不漂亮,只看数据交换和业务逻辑对不对。

它值得优先学,原因有四条:

  • 测得早:界面还没做出来,接口往往已经能调通了,后端的问题在这里就能暴露,不用等到提测。
  • 覆盖广、成本低:一个接口背后是一堆参数组合和业务分支,用界面一个个点又慢又容易漏,写脚本几分钟能跑完几十种情况。
  • 稳定、适合自动化:界面改版最频繁,接口相对稳定,是自动化投入产出比最高的地方。
  • 很多前端报错的根因在后端:用户看到的”服务器开小差了”,十有八九是某个接口返回了异常码或脏数据。

接下来的路线是:先补 Python 四件事(存数据、判断、循环、看结果),再学会用 requests 发请求,最后把功夫花在用例设计上——因为脚本写得好不好只是熟练度问题,用例设计得好不好,才是测试水平的真正分水岭。


第一部分 Python 基础速通

接口自动化脚本,说穿了就是几件事的拼接:把接口地址和参数存起来(变量)、判断响应对不对(if)、把一批数据挨个处理(for)、出问题时看一眼变量长什么样(print)。你不需要先系统学完 Python 再来做接口测试,把这四样连同列表、字典学会,就足够写出第一个能跑的脚本。这一部分全部用生活里的东西打比方,读完你的目标不是”背语法”,而是能用一句话把它讲清楚。

1. 变量:给东西贴个名字标签

生活比喻:你桌上有瓶水,你不想每次都说”那瓶农夫山泉”,就贴个便利贴写「my_water」。以后说「my_water」,就知道是它。

my_water = "农夫山泉"
price = 2
is_empty = False
  • = 不是数学里的”等于”,而是”把右边的值,装进左边的名字里”。
  • 变量名自己起,但别用中文和空格,用下划线:user_name。

在接口测试里,最常见的用法就是把接口地址和 token 存成变量:

url = "https://api.xxx.com/login"
token = "abc123"

后面发请求直接用 url、token,不用在十几处地方重复抄同一串字符串。

2. if / else:如果……否则……

生活比喻:如果考试及格,就发糖;否则,重写。

score = 90

if score >= 60:
    print("及格,发糖")
else:
    print("不及格,重写")

还可以加 elif(”不然如果”),用来区分更多情况:

if score == 100:
    print("满分")
elif score >= 60:
    print("及格")
else:
    print("挂了")

接口测试里几乎每个脚本都有这么一段:

if response.status_code == 200:
    print("接口通了")
else:
    print("接口挂了")

3. for 循环:挨个处理一排东西

生活比喻:你有一袋糖果,要一颗一颗数。

candies = ["苹果味", "葡萄味", "柠檬味"]

for c in candies:
    print("我吃到:" + c)

它的意思是:把 candies 里的东西一个一个取出来,每次放进 c,然后执行一次缩进里的代码。

接口测试里非常常见,比如一次性校验接口返回的多个用户:

user_list = [{"id": 1, "name": "张三"}, {"id": 2, "name": "李四"}]

for user in user_list:
    print(user["name"])

4. print() 调试:临时张嘴看看发生了啥

生活比喻:做菜不知道盐放没放,尝一口。print() 就是程序世界的”尝一口”。

def login():
    token = "xyz"
    print("token值是:", token)  # 看看对不对
    return token

运行的时候终端会把值打印出来,帮你确认三件事:变量是不是空的、循环到底跑了几遍、if 进的是哪个分支。正式脚本里可以删掉,但调试阶段它是最好用的工具,没有之一。

5. 列表 list:一排同类型的东西

fruits = ["apple", "banana", "pear"]
  • 用方括号 [ ] 包起来。
  • 从 0 开始编号:fruits[0] 是 "apple"。
  • 接口测试里常用来装:多个账号、多个用例 ID。
case_ids = [101, 102, 103]

for cid in case_ids:
    print("跑用例", cid)

6. 字典 dict:用”钥匙”开”值”

生活比喻:快递柜——输入手机号(key),弹出包裹(value)。

user = {
    "name": "张三",
    "age": 18,
    "is_vip": True
}

print(user["name"])  # 张三

JSON 数据本身就是字典结构(严谨地说,是 Python 的 dict 对应 JSON 的 object)。接口返回长这样:

{
  "code": 0,
  "msg": "success",
  "data": {
    "uid": 123,
    "nickname": "test_user"
  }
}

在 Python 里它就是这样一层套一层的字典:

resp = {
    "code": 0,
    "msg": "success",
    "data": {"uid": 123, "nickname": "test_user"}
}

print(resp["code"])              # 0
print(resp["data"]["nickname"])  # test_user

注意后面这行——先用 ["data"] 拿到里面那层字典,再用 ["nickname"] 取具体的值。接口测试里取返回字段,写的就是这种”一层层往里走”的代码。

7. 串起来:一个”接口自动化小片段”

把上面六样拼在一起,就是一个虽然没联网、但逻辑完整的测试脚本雏形:

# 模拟接口返回的 JSON
response = {
    "status": 200,
    "data": [
        {"user": "alice", "age": 20},
        {"user": "bob", "age": 17}
    ]
}

# 调试看一眼
print("接口返回:", response)

# 判断接口是否成功
if response["status"] == 200:
    print("接口OK,开始校验用户")
    for item in response["data"]:
        name = item["user"]
        age = item["age"]
        print("用户名:", name, "年龄:", age)

        if age >= 18:
            print(name, "是成年人")
        else:
            print(name, "未成年")
else:
    print("接口失败")

数一数,这段代码里出现的每一个语法——变量、if/else、for、print、列表、字典——全都在干接口测试干活时的真实动作。这就是为什么基础语法不用学太深,够用就行。

费曼自测:你试着讲一遍

如果你能对着空气说清楚下面这句话,第一部分就算入门了:”Python 里我用变量存接口地址和 token,用字典收 JSON 返回,用 for 把列表里的每条数据翻出来,用 if 判断状态码对不对,中间用 print 看变量到底长啥样。”


第二部分 requests 库实战

光有语法还不够,得真把请求发出去。requests 是 Python 里发 HTTP 请求最常用的库,装上它就能开始:

pip install requests

这一部分从”怎么拆返回”讲到”怎么发 GET/POST”,再到”怎么带 Token、怎么参数化”,最后串成一个像样的自动化小脚本。

一、JSON 解析:把”快递箱”拆成”字典”

生活比喻:你网购收到一个快递——外层箱子是 HTTP 响应体(response body),里面的说明书是 JSON 格式(整整齐齐的 key: value),你拆箱之后,就变成了 Python 的字典,可以随便拿字段。

接口返回的原始内容长这样:

{
  "code": 0,
  "msg": "success",
  "data": {
    "uid": 123,
    "nickname": "test_user"
  }
}

但 Python 刚收到它时,它只是一段字符串,你没法直接取 key。用 resp.json() 来完成”拆箱”:

resp = requests.get(url)
result = resp.json()   # 字符串 → 字典

拆完之后,就能像第一部分讲的字典一样随便用了:

result["code"]         # 0
result["data"]["uid"]  # 123

断言:测试的核心动作

断言就是”我预期应该是这样,如果不是就直接报错”:

assert resp.json()["code"] == 0

它等于在说:”我断定接口返回的 code 必须是 0,不然脚本直接变红。”自动化测试里 90% 的校验,本质都是这一行。

二、GET 和 POST:拿东西 vs 交表格

GET:去便利店拿瓶水

  • 参数一般挂在 URL 后面(?a=1&b=2)。
  • 不改动服务器数据。
  • 典型接口:查用户信息、查订单列表。
requests.get(
    "https://api.xxx.com/user",
    params={"uid": 123}   # 自动拼成 ?uid=123
)

POST:填表交给前台

  • 参数放在请求体(body)里,通常是 JSON。
  • 会创建或修改数据。
  • 典型接口:登录、注册、下单。
requests.post(
    "https://api.xxx.com/login",
    json={"username": "alice", "password": "123456"}
)

记忆口诀:GET 问问题,POST 交材料。

三、Header / Token:门禁卡和工牌

生活比喻:你去上班——URL 是地址,参数是你要办的事,Header 是前台要求的”出示工牌”,Token 是工牌里的动态二维码(登录成功后发给你)。很多接口的规定就是:”没带 Token,一律当陌生人拦下。”

headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer abc123token"
}

requests.get(url, headers=headers)

要注意的是:登录接口本身不需要 token;登录成功后返回 token,之后的每一个请求都要把它带上。这就是接口测试里绕不开的”接口关联”。

四、参数化:别把登录代码抄 10 遍,用列表循环

生活比喻:你要试 3 把钥匙能不能开门,没必要写 3 段一模一样的程序,把钥匙放进袋子,一把一把试就行。

# 多组账号密码
accounts = [
    {"username": "alice", "password": "right123"},
    {"username": "bob", "password": "wrong111"},
    {"username": "admin", "password": "admin888"}
]

for acc in accounts:
    resp = requests.post(
        "https://api.xxx.com/login",
        json=acc
    )
    data = resp.json()

    print("测账号:", acc["username"], "→ code:", data["code"])

    # 断言:正确账号应返回 code=0,错误账号应非 0
    if acc["password"] == "right123":
        assert data["code"] == 0
    else:
        assert data["code"] != 0

这一小段里,你其实已经把列表、字典、for、if、resp.json()、断言全用上了——这正是”参数化”的价值:数据变了,代码不用变。

五、串成一个”像样”的自动化小脚本

把参数化和接口关联拼起来,就是一段能跑通”登录 → 取 token → 带 token 查信息”的完整脚本:

import requests

base_url = "https://api.xxx.com"

# 1) 参数化账号
accounts = [
    {"username": "alice", "password": "right123"},
    {"username": "bob", "password": "wrong111"}
]

for acc in accounts:
    # 2) POST 登录
    resp = requests.post(f"{base_url}/login", json=acc)
    body = resp.json()

    print("登录返回:", body)

    # 3) 断言 code 字段
    if acc["password"] == "right123":
        assert body["code"] == 0
        token = body["data"]["token"]

        # 4) 带 Token 发 GET(Header 用法)
        headers = {"Authorization": f"Bearer {token}"}
        info_resp = requests.get(f"{base_url}/userinfo", headers=headers)
        info = info_resp.json()

        print("用户信息:", info)
        assert info["code"] == 0
    else:
        assert body["code"] != 0

这段脚本只有一个文件、没有框架,但它已经具备了自动化测试的全部要素:发请求、拆返回、断言、参数化、接口关联。后面无论用什么框架(pytest、unittest),都是在它基础上加组织和报告。

费曼自测:你试着讲一遍

你能不能对着空气说出这一句:”resp.json() 是把接口返回的 JSON 字符串拆成 Python 字典;GET 是问数据,POST 是交数据;Header 像工牌,Token 是登录后拿的进门条;把多组账号塞进列表,用 for 循环一遍遍调登录接口,再用 assert resp.json()['code'] == 0 做断言——这就是最基础的接口自动化。”能说完,这一块就真懂了。


第三部分 接口测试用例设计

脚本会写只是第一步,真正决定测试质量的是:一个接口你到底设计了哪些用例。这一部分先讲”接口测试七步法”(按顺序把该覆盖的角度走一遍),再给出行业通用的用例模板,最后说清楚模板里”填什么才是灵魂”。

一、接口测试七步法

这套思路业内常叫”接口测试七步法”,也叫”接口测试分层设计模板”,是做后端/接口测试时非常标准的覆盖顺序。它的核心目的是:先用一条正确的数据确认接口能跑通,再一层层加码,逐类挑毛病。先保通,再保对,接着保稳,最后保安全。

  1. 全对 → 冒烟:先拿一条完全正确的数据调接口,看它能不能正常跑通。这是”体检前的热身”。
  2. 必填字段逐个为空:每个必填项轮流留空,看接口会不会报错、提示得对不对,防止后端漏做非空校验。
  3. 字段类型错:该传字符串的传成数字,该传数字的传成字符串,看接口会不会”认错人”或直接崩。
  4. 边界值:比如字段限制 1–100,就测 0、1、100、101,专门找”临界点”上的 bug。
  5. 格式错:邮箱少个 @、手机号位数不对、日期写成 “2024-13-01″,看正则校验严不严。
  6. 业务规则:比如重复下单、订单还没付款就申请发货、普通用户去调管理员接口,测的是”业务逻辑合不合理”。
  7. 安全:塞 SQL 语句、塞脚本代码,或者拿过期的、瞎编的 token 去调,看接口会不会被绕过、会不会越权。

二、通用接口测试用例模板(行业共识版)

很多刚接触接口测试的人第一反应是问:”接口测试用例有模板吗?网上哪里能下载到标准的?”答案是:没有国家或行业强制的统一标准模板,但有一套几乎全行业通用的”骨架”。不管你是用 Excel 手写、在 Postman 里点按钮,还是写 Python 自动化脚本,本质上都在这套骨架上做裁剪。

下面是最常用的”最小可用模板”,字段精简但覆盖了接口测试的关键要素,适合评审、手工测试,也可以直接作为自动化用例的数据源:

字段 作用说明 示例
用例编号 唯一标识,方便管理和追踪 API_USER_LOGIN_NORMAL_001
模块 / 接口名 归属的业务域,便于归类 用户管理 / 登录接口
请求方法 HTTP 方法 POST
URL 接口路径(通常配合环境 base_url) /api/v1/login
请求头 Header 信息 {“Content-Type”:”application/json”, “Authorization”:”Bearer xxx”}
请求参数 Query / Path / Body 参数 {“username”:”admin”,”password”:”123456″}
前置条件 执行前必须满足的条件 用户已注册、token 未过期
预期结果 状态码 + 响应字段 + 业务规则 200,返回 token,数据库记录登录日志
实际结果 执行后填写 (执行后回填)
测试状态 用例执行结果 Pass / Fail / Block
用例类型 区分测试目的 正向 / 边界 / 异常 / 安全 / 并发
是否自动化 标记自动化覆盖范围 是 / 否
备注 特殊说明或依赖关系 需支持多角色登录

如果你在做自动化测试(Python + Requests、JUnit、Robot Framework 等),还可以在此基础上扩展字段,例如:

  • extract:从响应中提取变量,供后续用例使用。
  • setup_sql / teardown_sql:前置或后置的数据库操作。
  • validate_schema:JSON Schema 校验。
  • response_time_threshold:响应时间阈值(如 p95 ≤ 500ms)。

三、模板会随场景变:四种载体的加减法

模板从来不是一成不变的,它跟着”谁来用、怎么用”变化。同样是接口用例,落在这四种场景里,字段会做不同的加减:

1. 手工测试与用例评审

  • 载体:Excel / Word。
  • 特点:字段偏全,强调可读性和覆盖度。
  • 典型字段:用例目的、操作步骤、预期结果、实际结果、备注。

2. Postman / Apifox 等工具管理

  • 载体:工具内的 Collection(接口集)。
  • 特点:不再单独维护 Excel,用例即接口定义。
  • 做法:在请求里直接写断言(Tests),用环境变量解决多环境切换。
  • 优势:所见即所得,非常适合接口联调和回归。

3. 数据驱动的自动化测试

  • 载体:Excel / YAML / CSV / JSON。
  • 特点:一行数据就是一条用例,去重、精简。
  • 常见字段:url、method、headers、body、expected_status、expected_contains、extract。
  • 适用:参数组合多、需要大量回归的场景。

4. CI/CD 工程化场景

  • 载体:代码仓库 + 测试平台。
  • 特点:强调可追溯、可度量。
  • 额外字段:接口契约版本(OpenAPI/Swagger 版本)、用例语义化 ID、性能基线(响应时间、QPS)、覆盖率标记。
  • 目标:让接口测试成为发布流水线里的”质量门禁”。

四、模板只是壳,填什么才是灵魂

有了模板,不等于就有了好用例。很多团队的接口用例只停留在”返回 200 OK”,这是远远不够的——200 只说明请求被受理了,不说明业务是对的。上面七步法是”按顺序走一遍”的视角,下面这张是按”场景类型”归类的覆盖清单,两者是同一件事的两种看法。一个成熟的接口用例集,至少要覆盖下面四类:

1. 正向功能验证

  • 所有必填参数正确传入。
  • 选填参数缺省、只传部分。
  • 正常业务流程走通(如:下单 → 支付 → 回调)。

2. 参数校验(最容易被漏)

  • 缺少必填参数。
  • 参数类型错误(字符串传成数字等)。
  • 数值型参数:最小值、最大值、min-1、max+1。
  • 字符串长度:空串、超长、恰好等于边界长度。
  • 特殊字符:emoji、中文、转义字符、单引号 '、双引号 "、<script> 等。

3. 异常与权限控制

  • 未登录访问。
  • Token 过期 / 非法。
  • 越权访问(普通用户访问管理员接口)。
  • 重复提交(幂等性验证)。
  • 并发场景(如库存扣减、余额变更)。

4. 数据与状态一致性

  • 响应状态码是否正确。
  • 响应结构是否符合接口定义(字段是否存在、类型是否正确)。
  • 关键业务字段值是否正确。
  • 数据库落库数据是否与响应一致(订单状态、账户余额等)。

把这四类对照七步法看:七步法告诉你”按什么顺序下手”,这四类告诉你”每个接口至少要考虑哪些面”。两条都过一遍,一个接口的用例才算设计完整。

五、新人落地:三步用好模板

如果你是刚接手接口测试,可以按这个节奏来:

  1. 先看公司有没有现成模板。有就复用,遵循团队规范,别另起炉灶;没有就用本文第二部分那张表,建一个 Excel,一个 Sheet 对应一个接口族。
  2. 从核心接口开始写。优先覆盖 P0/P1 接口(登录、下单、支付、查询等),每个接口先写 3~5 条用例:1 条正向 + 2~4 条异常 / 边界。
  3. 逐步向自动化过渡。手工用例跑稳定后,挑出高价值用例(核心流程、高频回归)转自动化;再根据所选框架(pytest、Apifox、Postman + Newman 等),把 Excel 用例迁移成数据驱动格式。

结尾:从手工到自动化

回头看这整条路线:第一部分的 Python 语法,是让脚本能”动”起来;第二部分的 requests,是让脚本真的”连上”接口;第三部分的用例设计,才决定这套脚本到底”测得深不深”。前两者是工具,后者是判断力。

接口测试用例真正的要点,可以浓缩成几句话:

  • 接口测试用例没有官方统一模板,但有行业通用的骨架。
  • 模板的核心永远是三样:请求信息 + 预期结果 + 校验规则。
  • 不同场景(手工、工具、自动化、CI/CD)会对字段做加减法,但本质不变。
  • 比模板更重要的是:你是否覆盖了正向、边界、异常、权限和数据一致性这五个面。

落地路径也很清晰:先在 Excel 里把手写用例写扎实,再挑高价值的一部分用 requests 脚本自动化,最后接进 CI/CD 让它成为每次发布的”质量门禁”——先保通,再保对,接着保稳,最后保安全。手工用例跑稳了再谈自动化;顺序反了,只会得到一堆没人维护、天天误报的脚本。

本文只讲「接口测试怎么学、怎么做」。面试题库与话术单独成篇,不在这里。

作者:ZCNIX
本文链接:https://blog.zcnix.com/api-testing-from-scratch/
许可协议:CC BY-NC-SA 4.0
上一篇
下一篇