requests 接口测试是什么
requests 加 pytest 是 Python 接口测试的常见组合:requests.Session 复用连接与默认头,pytest 提供夹具、参数化与断言。工程要点:封装 client 统一 base_url、鉴权头与超时,用例只表达业务意图;requests 默认不设超时,必须显式传入(推荐 (connect, read) 元组),否则依赖抖动时用例会长时间挂起。
基本信息
| 适用平台 | Python 3.8+,requests 2.x + pytest |
|---|---|
| 关键 API | Session、request 方法、raise_for_status、json() |
| 超时写法 | timeout=(连接, 读取) 元组或单值秒数 |
| 断言入口 | pytest 原生 assert 配合响应字段 |
典型使用场景
- 接口契约回归:状态码、响应结构、字段类型
- 业务流程串联:夹具先建前置数据,再走真实接口
- 鉴权边界抽查:不同角色令牌的可见与可操作性
- CI 集成:失败时输出请求上下文(URL、状态码、响应片段)
- 第三方依赖打桩:用 responses/respx 固定外部响应
用例示例
用例示例
import os, pytest, requests
class Client:
def __init__(self, base_url, token):
self.base_url = base_url
self.s = requests.Session()
self.s.headers["Authorization"] = "Bearer " + token
def post(self, path, **kw):
kw.setdefault("timeout", 5) # 兜底超时,防止用例无限挂起
return self.s.post(self.base_url + path, **kw)
def test_create_user(api):
res = api.post("/v1/users", json={"name": "alice"})
assert res.status_code == 201 # 状态码断言
assert res.json()["name"] == "alice" # 关键字段断言
@pytest.fixture(scope="session")
def api():
return Client("https://api.example.com", os.environ["API_TOKEN"])断言对象逐项读法
| 对象 | 建议断言 | 说明 |
|---|---|---|
| status_code | 精确匹配期望码 | 只写小于 400 会放过意外重定向 |
| headers | Content-Type、Location 等 | 常用头属于接口契约的一部分 |
| json() | 字段值与类型 | 结构不符会抛解析异常,按失败处理 |
| elapsed | 只做粗粒度门槛 | 精测耗时用专门压测工具 |
requests 默认不设超时:把 timeout 下沉到封装的 client 层统一兜底,避免个别用例忘记传参。
Session 会携带 cookie 与连接池状态:跨角色用例用独立 Session,避免鉴权与登录态互相污染。
失败路径先看 status_code 与 headers 再决定是否解析响应体:错误页可能不是 JSON;把 res.text 前几百字符附加到断言消息里,排错时不必重新发请求。
把 base_url 与鉴权下沉到 client 后,同一套用例可指向不同环境;环境地址由命令行参数或环境变量传入,不写死在用例里。