pytest需配合requests或httpx测接口;发请求前须确认会话状态、headers(含authorization拼写、content-type)、token有效性;parametrize参数名须与函数签名一致;断言前先验status_code和content-type;用--tb=short、--maxfail=1等提升调试效率。

pytest 本身不内置 HTTP 请求能力,必须搭配 requests 或 httpx 才能测接口;直接写 pytest 函数但没发请求,等于白跑。
用 requests 发请求前先确认会话状态和 headers
多数接口依赖登录态(如 Cookie 或 Bearer Token),光调 requests.get() 往往 401 或 403。别急着写断言,先检查:
- 是否已用
requests.Session()复用连接并自动携带 Cookie - Header 中
Content-Type是"application/json"还是"application/x-www-form-urlencoded"—— 错了后端可能解析为空 - Authorization 字段拼写是否正确,常见错写成
"authrization"或漏掉"Bearer "前缀
示例:带 token 的安全请求
import requests
session = requests.Session()
session.headers.update({
"Authorization": "Bearer abc123",
"Content-Type": "application/json"
})
resp = session.post("https://api.example.com/v1/users", json={"name": "test"})
用 @pytest.mark.parametrize 驱动多组接口参数时注意数据结构对齐
传参不匹配会导致测试跳过或报 TypeError: test_func() missing 1 required positional argument。关键点:
-
ids参数名必须和函数签名里的变量名一致(大小写敏感) - 如果传的是字典列表,
parametrize的argnames要用字符串拼接,如"url,method,payload,expected_status" - 避免在
params里直接写未定义变量(如误用BASE_URL却没在测试文件顶部定义)
错误写法:@pytest.mark.parametrize("url", ["https://..."]) → def test_api(url, method):(参数名数量不匹配)
断言响应时优先检查 resp.status_code 再查 resp.json()
很多新手一上来就 assert resp.json()["code"] == 0,结果遇到 500 返回 HTML 页面或空响应,直接抛 JSONDecodeError,测试中断且看不出是服务异常还是断言逻辑错。
- 先 assert
resp.status_code == 200(或预期码) - 再用
resp.headers.get("Content-Type", "")判断是否含"json",避免对非 JSON 响应强行.json() - 对字段存在性校验,用
assert "data" in resp.json()比assert resp.json()["data"]更健壮
运行时加 --tb=short 和 -v 看清失败在哪一行
默认 pytest 报错堆栈太长,真正出问题的 assert 行被埋在中间。命令行加参数能快速定位:
-
pytest test_api.py::test_user_create -v --tb=short显示函数名+断言行 - 配合
--maxfail=1防止一个失败连带跑完全部用例,浪费时间 - 如果接口耗时长,加
--timeout=10(需装pytest-timeout)防死等
真实调试中,90% 的“接口测不通”问题出在环境配置(如本地 hosts 指向了旧网关)、token 过期、或 POST 时误用了 data=... 却该用 json=... —— 这些比写断言逻辑重要得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











