首页/开发/软件测试速查/requests 与 pytest 接口测试

requests 与 pytest 接口测试

requests 加 pytest 是常用的接口测试组合:Session 复用连接、显式超时、断言状态码与响应体、json 解析;封装 client 统一 base_url、鉴权头与超时,用例只表达业务意图。

软件测试速查开发更新于 2026-10-13

requests 接口测试是什么

requests 加 pytest 是 Python 接口测试的常见组合:requests.Session 复用连接与默认头,pytest 提供夹具、参数化与断言。工程要点:封装 client 统一 base_url、鉴权头与超时,用例只表达业务意图;requests 默认不设超时,必须显式传入(推荐 (connect, read) 元组),否则依赖抖动时用例会长时间挂起。

基本信息

适用平台Python 3.8+,requests 2.x + pytest
关键 APISession、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 会放过意外重定向
headersContent-Type、Location 等常用头属于接口契约的一部分
json()字段值与类型结构不符会抛解析异常,按失败处理
elapsed只做粗粒度门槛精测耗时用专门压测工具
requests 默认不设超时:把 timeout 下沉到封装的 client 层统一兜底,避免个别用例忘记传参。
Session 会携带 cookie 与连接池状态:跨角色用例用独立 Session,避免鉴权与登录态互相污染。
失败路径先看 status_code 与 headers 再决定是否解析响应体:错误页可能不是 JSON;把 res.text 前几百字符附加到断言消息里,排错时不必重新发请求。
把 base_url 与鉴权下沉到 client 后,同一套用例可指向不同环境;环境地址由命令行参数或环境变量传入,不写死在用例里。

易错点

  • 未设置超时,外部依赖不响应时用例无限等待,CI 任务被拖死
  • 共享 Session 跨用例携带鉴权状态,越权场景互相污染
  • 断言只写 status_code == 200:业务错误包在 200 响应体里时会漏检
  • 网络异常未统一转成可读失败信息,排错只能靠猜
  • 测试直连生产环境调试,写操作造成真实数据变更
  • 在测试里默认错误响应一定是 JSON,错误页返回 HTML 时抛解析异常掩盖真实失败原因
  • 用例之间共用同一账号并发登录,会话互踢导致随机失败
  • 断言依赖全量 JSON 比对,无关字段一变化大批用例集体失败,维护成本失控

数据来源与参考

  • requests 官方文档(requests.readthedocs.io)
  • pytest 官方文档(docs.pytest.org)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌