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

相关推荐
2401_897190552 小时前
html标签怎么设置段落间距_p标签默认样式及调整建议【指南】
jvm·数据库·python
Java面试题总结2 小时前
BCrypt密码加密
开发语言·python
2301_803538952 小时前
如何修改Oracle用户密码_ALTER USER IDENTIFIED BY重置口令
jvm·数据库·python
NotFound4862 小时前
Golang方法值接收者和指针接收者区别_Golang方法接收者教程【实战】
jvm·数据库·python
m0_640309302 小时前
Golang Gin怎么绑定JSON参数_Golang Gin JSON绑定教程【精通】
jvm·数据库·python
databook3 小时前
用Manim实现动态交点计算--从一个动点问题说起
python·动效
2301_764150563 小时前
CSS如何用Less实现多维度的样式复用_结合混合与继承技术实现
jvm·数据库·python
清平乐的技术专栏3 小时前
Python依赖包实现window下载上传到Linux
linux·开发语言·python
m0_748839493 小时前
MySQL触发器实现简单的分表逻辑_垂直分表与自动化路由
jvm·数据库·python