接口测试入门:requests库实战(JSON解析+GET/POST+参数化)

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

生活比喻

你网购收到一个快递:

  • 外层箱子 = HTTP 响应体(response body)
  • 里面说明书是 JSON 格式(整齐的 key:value)
  • 你拆箱 → 变成 Python 的字典,随便拿字段

接口返回长这样(真是 JSON):

{
  "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() ✅
  • 断言 ✅

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

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

费曼自测(你试着讲出来)

你能不能对空气说这一句:

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

能说完 → 这块你真懂了。


上一篇
下一篇