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

相关推荐
程序猿阿森25 分钟前
Python 闭包与装饰器:从入门到精通
开发语言·python·面试
酷可达拉斯32 分钟前
自动化运维-Ansible Role详解
linux·运维·服务器·自动化·ansible
老大白菜35 分钟前
Qwen3.8-27B 本地推理 + DeepSeek Harness 配置
python·qwen·deepseek·harness
Code额1 小时前
Python 连接 DeepSeek API,OpenAI 对话方式总结
后端·python·ai·ai编程
电化学仪器白超1 小时前
MV-CS200-10UC相机参数配置
python·单片机·嵌入式硬件·数码相机·自动化·ltspice
荣码1 小时前
向量数据库选型:4种方案全测了,选错重来成本最高
java·python
微硬创新1 小时前
不用换设备,也能接入智能系统:耐达讯自动化NY-B801网关的神奇功效
人工智能·网络协议·自动化·信息与通信
eagle_Annie1 小时前
Python/torch/深度学习——Miniforge+uv环境安装
python·深度学习·uv
OPEN-F2 小时前
Python进阶教程:Web开发入门(Flask)
开发语言·python
Albart5752 小时前
保姆级教程|Python+DeepSeek-V4-Pro实现AI客服Demo 支持OCR扫描PDF+全格式RAG知识库(附完整源码)
人工智能·python·ocr·ai客服·大模型api·私有知识库·deepseek