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

相关推荐
微学AI2 小时前
内网穿透的应用-服务器日志出现异常怎么办?Python监控、钉钉告警与远程处理教程
服务器·python·钉钉
_Jimmy_10 小时前
Agent 溯源精度提升方案
人工智能·python·langchain
SamChan9011 小时前
在Web应用中集成PDF多语言翻译功能:PDFTranslator API实战指南
前端·python·ai·pdf·yapi·机器翻译
天天进步201511 小时前
Python全栈项目--智能办公自动化系统
开发语言·python
阿三081212 小时前
跨境电商售后自动化分级标准:哪些能全自动、哪些半自动、哪些禁止自动化
大数据·人工智能·自动化
颜酱12 小时前
09 | 重构项目结构
人工智能·python·langchain
LedgerNinja12 小时前
WEEX API 自动化交易实践:下单、撤单、订单查询与状态闭环
运维·自动化
kisloy13 小时前
【爬虫入门第8讲】Python爬虫反爬入门
开发语言·爬虫·python
Sisphusssss14 小时前
香橙派5plus GPIO
linux·python·ubuntu
nbzy88814 小时前
企业资料证据可信度评分:区分自述字段、可核验材料与缺失信息
自动化·内容生成·锌合金压铸件