【工程实战】第三篇:接口自动化 —— Requests 的工业级封装:Session 关联、日志与断言

专栏进度:03 / 10 (自动化实战专题)

接口测试不仅仅是发一个请求,它包含:请求构造、Header 管理、鉴权同步、响应解析、数据校验、日志记录。

一、 为什么要进行"二次封装"?

直接使用原生库会有以下痛点:

Cookie/Token 丢失:每次请求都要手动传鉴权信息,极其麻烦。

排查困难:报错时看不到请求体和响应的具体内容。

代码冗余:相同的 URL 前缀、Timeout 设置在每个用例里重复写。

二、 环境准备

Bash

pip install requests

三、 实战:打造专属 BaseRequest 类

我们将利用 requests.Session 自动处理 Cookie 保持,并加入日志打印功能。

  1. 核心封装 common/request_util.py
    Python
python 复制代码
import requests
import json

class RequestUtil:
    # 静态变量,用于存储全局 Session
    session = requests.Session()

    def send_request(self, method, url, **kwargs):
        """
        统一请求出口
        :param method: 请求方法
        :param url: 请求地址
        :param kwargs: requests 原生支持的参数(params, json, headers等)
        """
        # 1. 处理 URL(自动拼接基础路径)
        # url = self.base_url + url 
        
        # 2. 打印请求日志(调试利器)
        print(f"\n>>>>>>> 接口请求 >>>>>>>")
        print(f"URL: {url} | Method: {method}")
        if 'json' in kwargs: print(f"Body: {json.dumps(kwargs['json'], indent=2)}")

        # 3. 发送请求
        res = RequestUtil.session.request(method, url, **kwargs)

        # 4. 打印响应日志
        print(f"<<<<<<< 接口响应 <<<<<<<")
        print(f"Status: {res.status_code}")
        print(f"Response: {res.text}")
        
        return res
  1. 处理"接口关联":让 Token 飞一会儿
    在实际业务中,登录接口返回的 token 必须传给后续的查询接口。

Python

python 复制代码
# conftest.py (Pytest 全局前置)
import pytest
from common.request_util import RequestUtil

@pytest.fixture(scope="session", autouse=True)
def login_init():
    """全局登录,自动保持 Session"""
    req = RequestUtil()
    # 模拟登录
    res = req.send_request("POST", "http://api.example.com/login", json={"user":"admin"})
    # 如果是基于 Token 的,可以存入 Session 的 Headers
    # token = res.json()['token']
    # RequestUtil.session.headers.update({"Authorization": f"Bearer {token}"})

四、 结合 YAML:实现"零代码"写接口用例

结合上一篇的 YAML 驱动,我们可以让接口测试变成填表:

python 复制代码
data/api_cases.yaml
YAML

- case_name: "查询用户信息"
  method: "GET"
  url: "http://api.example.com/user/info"
  params: {"id": 1001}
  validate: {"status_code": 200, "msg": "ok"}
python 复制代码
tests/test_api.py

@pytest.mark.parametrize("case", read_yaml("api_cases.yaml"))
def test_interface(case):
    res = RequestUtil().send_request(case['method'], case['url'], params=case.get('params'))
    # 统中断言逻辑
    assert res.status_code == case['validate']['status_code']

五、 避坑指南:接口测试的"隐形地雷"

SSL 证书错误:内网环境常有 HTTPS 证书问题。对策:在请求中加入 verify=False。

字符编码:中文响应乱码。对策:使用 res.encoding = 'utf-8' 强制指定。

多环境切换:不要在代码里写死 IP。对策:在 config.yaml 中定义 base_url,封装类自动读取。

相关推荐
夜雪一千4 小时前
Python enumerate() 函数完整详解:遍历同时获取索引,告别手动计数
服务器·windows·python
能有时光4 小时前
PyTorch KernelAgent 源码解读 ---(4)--- ExtractorAgent
人工智能·pytorch·python
_Jimmy_5 小时前
Python 协程库如何使用以及有哪些使用场景
python
aqi005 小时前
15天学会AI应用开发(十七)使用LangGraph实现会话记忆功能
人工智能·python·大模型·ai编程·ai应用
第一程序员5 小时前
Rust Agent 子进程执行:Command 之前,先定义输入和超时
python·rust·github
skywalk81635 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
weixin_BYSJ19876 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
BJHHZX19916 小时前
北京华恒智信为制造行业破解自动化伪升级难题,落地人机协作三阶段减编增效方案
自动化·绩效考核·人力资源管理·人机协作·员工激励
EQUINOX17 小时前
【论文阅读】| MoCo精读
论文阅读·人工智能·python·深度学习·机器学习
用户8356290780518 小时前
使用 Python 自动化 Excel 公式和函数:完整指南
后端·python