【工程实战】第三篇:接口自动化 —— 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,封装类自动读取。

相关推荐
ZGi.ai18 小时前
人工审查节点:让自动化工作流多一步人工把关
运维·人工智能·自动化·人机协同·智能体工作流·人工审查
风吹夏回19 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
小熊Coding19 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
企服AI产品测评局19 小时前
Agent适配信创环境实测:企业级自动化如何实现国产操作系统与数据库全兼容?
运维·数据库·人工智能·ai·chatgpt·自动化
秋919 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本19 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
田里的水稻20 小时前
OE_ubuntu26.04与宿主机之间复制粘贴内容
人工智能·python·机器人
盖小雅20 小时前
自动化排班如何破解劳动法合规难题:从规则冲突到可追溯的排班表
大数据·运维·机器学习·自动化
jiayong2321 小时前
02 创建虚拟环境
python
NiceCloud喜云21 小时前
Claude Code Routines 实战:三种触发器跑通云端自动化编码
android·运维·数据库·人工智能·自动化·json·飞书