从零构件python接口自动化测试框架:Requests + Pytest + YAML + JSON Schema + Logging + Allure
在现代软件开发中,接口测试是保障系统质量的关键防线。比起繁琐的 UI 自动化,接口自动化执行速度快、稳定性高、更容易集成到 CI/CD 流程中。
今天,我们将通过 Python 语言,结合目前业内最主流的技术栈:Requests + Pytest + YAML + JSON Schema + Logging + Allure,从零梳理接口自动化框架的核心组件和常用操作。
1. Requests:HTTP 交互的核心引擎
requests 是 Python 中最优雅的 HTTP 库,用于模拟客户端发送各种网络请求。
常用操作:
-
发送 GET/POST 请求:最常见的接口请求方式。
-
Session 维持:处理需要登录态(Cookie/Token)的连贯请求。
-
复杂参数传递:处理 URL 参数(
params)和请求体(data/json)。
代码示例:
Python
import requests
# 1. 基础 GET 请求
response_get = requests.get(
url="https://httpbin.org/get",
params={"userid": "1001", "status": "active"},
headers={"User-Agent": "My-Test-Framework/1.0"}
)
print(f"GET 状态码: {response_get.status_code}")
# 2. 基础 POST 请求 (发送 JSON 数据)
payload = {"username": "test_user", "password": "secure_pwd"}
response_post = requests.post(
url="https://httpbin.org/post",
json=payload
)
print(f"POST 返回数据: {response_post.json()}")
# 3. 使用 Session 保持会话态
session = requests.Session()
session.headers.update({"Authorization": "Bearer your_token_here"})
res = session.get("https://httpbin.org/bearer")
2. Pytest:强大的测试驱动框架
pytest 是驱动整个自动化测试运转的核心。它不仅可以自动发现和执行测试用例,还拥有极其丰富的插件生态。
常用操作:
-
数据驱动(参数化):通过
@pytest.mark.parametrize实现同一用例执行多组测试数据。 -
前置/后置操作(Fixture):优雅地处理数据库连接、测试数据清理、用户登录等前置条件。
-
丰富的断言:直接使用 Python 原生的
assert关键字即可。
代码示例:
Python
import pytest
# 使用 Fixture 处理前置操作
@pytest.fixture()
def login_token():
print("\n[Setup] 执行登录,获取 Token...")
yield "token_xyz_123"
print("\n[Teardown] 清理登录状态...")
# 使用参数化实现数据驱动
@pytest.mark.parametrize("username, expected_status", [
("admin", 200),
("invalid_user", 404),
("", 400)
])
def test_user_query(login_token, username, expected_status):
# 模拟接口请求
print(f"使用 Token: {login_token} 查询用户: {username}")
actual_status = 200 if username == "admin" else (404 if username == "invalid_user" else 400)
# Pytest 原生断言
assert actual_status == expected_status
3. YAML:测试数据的理想载体
在“数据与代码分离”的理念下,YAML 因为其极简的语法和对层次结构的良好支持,成为了接口自动化配置和测试数据的首选格式。
常用操作:
-
管理全局配置:如测试环境域名、数据库账密。
-
管理测试用例数据:分离请求参数、预期结果,让不懂代码的人也能维护用例。
数据文件示例 (data.yaml):
YAML
- case_title: "成功获取用户信息"
request:
method: "GET"
url: "/api/user/1"
expected:
status_code: 200
msg: "success"
- case_title: "获取不存在的用户"
request:
method: "GET"
url: "/api/user/999"
expected:
status_code: 404
msg: "user not found"
读取代码示例:
Python
import yaml
def load_yaml_data(file_path):
with open(file_path, "r", encoding="utf-8") as f:
data = yaml.safe_load(f)
return data
# 读取后即可传入 pytest 的 parametrize 中使用
4. JSON Schema:复杂响应的终极校验武器
对于字段庞大、层级深厚的 JSON 响应体,逐个字段断言不仅效率低下且极易漏测。JSON Schema 可以对响应报文的结构、字段类型、必填项进行全面校验。
常用操作:
-
数据类型校验:确保返回的是字符串、整数还是数组。
-
必填字段校验:验证核心字段是否缺失。
-
正则表达式约束:校验返回格式(如手机号、时间戳)。
代码示例:
Python
from jsonschema import validate, ValidationError
# 1. 定义期望的 JSON 结构 (Schema)
schema = {
"type": "object",
"properties": {
"code": {"type": "integer"},
"message": {"type": "string"},
"data": {
"type": "object",
"properties": {
"user_id": {"type": "integer"},
"email": {"type": "string", "format": "email"}
},
"required": ["user_id"] # user_id 是必填项
}
},
"required": ["code", "message", "data"]
}
# 2. 模拟接口返回的实际 JSON
response_json = {
"code": 200,
"message": "success",
"data": {
"user_id": 1024,
"email": "test@example.com"
}
}
# 3. 执行校验
try:
validate(instance=response_json, schema=schema)
print("JSON Schema 校验通过!数据结构合法。")
except ValidationError as e:
print(f"JSON 校验失败: {e.message}")
5. Logging:不可或缺的黑匣子
自动化运行在无人值守的服务器上时,日志是排查报错(Bug 还是网络波动?)的唯一凭证。
常用操作:
-
按级别输出:DEBUG、INFO、WARNING、ERROR。
-
控制台与文件双写:不仅在终端显示,还要持久化保存到
.log文件中。 -
按时间滚动日志:避免单个日志文件过大。
代码示例:
Python
6. Allure:让测试报告具有观赏性
老板和开发不喜欢看终端里密密麻麻的文本,他们喜欢直观的图表。Allure 是目前业内最受欢迎的测试报告框架。
常用操作:
-
结构化展示:使用
@allure.epic,@allure.feature,@allure.story对用例进行模块化分类。 -
步骤记录:使用
@allure.step记录详细的执行步骤(如组装数据、发送请求、断言结果)。 -
附件上传:将接口请求的 Request 和 Response 数据作为日志附件贴在报告中。
代码示例与生成命令:
Python
import allure
import pytest
@allure.epic("电商后台管理系统")
@allure.feature("用户管理模块")
class TestUserAPI:
@allure.story("获取用户详情接口")
@allure.title("测试正常获取存在的用户")
@allure.severity(allure.severity_level.BLOCKER) # 定义严重级别
def test_get_user_success(self):
with allure.step("第一步:准备测试数据"):
user_id = 101
with allure.step("第二步:发送 GET 请求"):
# 模拟请求并把日志添加到 allure 附件
allure.attach('{"user_id": 101}', name="Request Params", attachment_type=allure.attachment_type.JSON)
with allure.step("第三步:验证响应状态码和结构"):
assert True # 模拟断言通过
执行与生成报告: 在终端运行以下命令,Pytest 会生成中间数据,随后 Allure 将其渲染为可视化网页:
Bash
# 1. 运行测试并收集 allure 原始数据到 ./report/tmp 目录
pytest --alluredir=./report/tmp
# 2. 启动本地服务在线查看报告
allure serve ./report/tmp
总结
一个成熟的接口自动化框架并非是一堆代码的堆砌,而是调度、请求、数据、校验、日志与报告的有机结合。通过 Pytest 统筹全局,Requests 负责底层通信,YAML 管理数据,JSON Schema 把控报文质量,再配合 Logging 和 Allure,你就拥有了一套可以应对绝大多数企业级业务场景的测试开发利器。
更多推荐
所有评论(0)