专栏进度:03 / 10 (自动化实战专题)
接口测试不仅仅是发一个请求,它包含:请求构造、Header 管理、鉴权同步、响应解析、数据校验、日志记录。
一、 为什么要进行"二次封装"?
直接使用原生库会有以下痛点:
Cookie/Token 丢失:每次请求都要手动传鉴权信息,极其麻烦。
排查困难:报错时看不到请求体和响应的具体内容。
代码冗余:相同的 URL 前缀、Timeout 设置在每个用例里重复写。
二、 环境准备
Bash
pip install requests
三、 实战:打造专属 BaseRequest 类
我们将利用 requests.Session 自动处理 Cookie 保持,并加入日志打印功能。
- 核心封装 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
- 处理"接口关联":让 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,封装类自动读取。