一、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做断言,这就是最基础的接口自动化。”
能说完 → 这块你真懂了。