Python 接口自动化测试框架:YAML 数据驱动 + 业务场景串联 + DeepSeek 智能分析
·
前言
做接口自动化测试时,常见痛点是:
- 用例写在代码里,维护成本高,测试同学不好参与
- 多接口串联时,参数传递(token、订单号等)容易乱
- 测试失败后,要对着 traceback 自己排查,效率低
最近整理并完善了一个 Python 接口自动化测试框架,核心思路是:
YAML 写用例,Python 做执行,Allure 出报告,失败时 AI 给建议
本文分享框架设计思路、核心能力和使用方式,供有类似需求的同学参考。
一、框架概览
| 项目 | 说明 |
|---|---|
| 语言 | Python 3 |
| 测试框架 | Pytest |
| 用例格式 | YAML 数据驱动 |
| 测试报告 | Allure / TM Report |
| HTTP 请求 | Requests |
| 断言 | jsonpath + 自定义断言 |
| 数据库支持 | MySQL、Redis、ClickHouse、MongoDB |
| AI 能力 | 阿里云百炼 DeepSeek,失败自动分析 |
适用场景:
- REST API 单接口测试
- 多接口业务场景串联(登录 → 下单 → 支付)
- 希望数据库校验的接口测试
- 希望降低用例编写门槛的团队
二、项目结构
project-root/ # 项目根目录
├─ base/ # 基础类封装(核心功能)
│ ├─ api_request.py # 接口请求基类(封装requests)
│ ├─ test_case_tools.py # 测试用例工具类(如数据处理、断言)
│ └─ driver.py # 浏览器驱动封装(可选,UI自动化用)
├─ common/ # 公共方法封装(可复用工具)
│ ├─ log_utils.py # 日志处理工具
│ ├─ excel_parser.py # Excel数据解析工具
│ ├─ yaml_parser.py # YAML数据解析工具
│ └─ db_operation.py # 数据库操作工具(如MySQL)
├─ conf/ # 全局配置目录
│ ├─ config.ini # 环境配置文件(API地址、账号等)
│ ├─ allure_config.yml # Allure报告自定义配置
│ └─ env.py # 环境变量管理文件
├─ data/ # 测试数据目录
│ ├─ api_data/ # 接口测试数据
│ │ ├─ login_data.yaml # 登录接口测试用例数据
│ │ └─ order_data.xlsx # 订单接口Excel数据
│ └─ ui_data/ # UI自动化测试数据(可选)
│ └─ page_elements.yaml # 页面元素定位数据
├─ logs/ # 测试日志目录(自动生成)
│ └─ test_20231001.log # 按日期命名的日志文件
├─ report/ # 测试报告目录
│ ├─ allure_html/ # Allure交互式报告(自动生成)
│ ├─ tm_report/ # TMReport表格报告(自动生成)
│ └─ report_config.py # 报告生成配置文件
├─ testcase/ # 测试用例目录
│ ├─ api_test/ # 接口测试用例
│ │ ├─ test_login.py # 登录接口测试类
│ │ └─ test_order.py # 订单接口测试类
│ └─ ui_test/ # UI自动化测试用例(可选)
│ └─ test_homepage.py # 首页UI测试类
├─ venv/ # 虚拟环境目录(自动生成)
├─ conftest.py # pytest全局钩子文件(固定名称)
├─ environment.xml # Allure报告环境信息文件
├─ extract.yaml # 接口依赖参数存储文件
├─ pytest.ini # pytest配置文件(固定名称)
├─ requirements.txt # 第三方库依赖清单
└─ run.py # 主程序入口(执行测试和生成报告)
各目录职责:
base/:封装接口请求基类、测试用例工具类、浏览器驱动(可选)common/:日志、Excel/YAML 解析、数据库操作等公共工具conf/:环境配置、Allure 配置、环境变量管理data/:按接口/UI 分类存放测试数据(YAML / Excel)testcase/:按接口/UI 分类存放测试脚本report/:Allure 交互式报告和 TMReport 表格报告logs/:按日期自动生成的运行日志
三、核心设计:YAML 数据驱动
用例与代码分离,YAML 中定义接口信息和测试数据,结构如下:
- baseInfo:
api_name: 新增用户
url: /dar/user/addUser
method: POST
header:
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
testCase:
- case_name: 正常新增用户
data:
username: testadduser
password: tset6789890
role_id: 123456789
token: ${get_extract_data(token)}
validation:
- contains: { 'status_code': 200 }
- contains: { 'msg': '新增成功' }
- case_name: 无效新增·缺少token
data:
username: testadduser
password: tset6789890
token:
validation:
- contains: { 'status_code': 200 }
- contains: { 'msg': '新增失败' }
字段说明:
| 字段 | 含义 |
|---|---|
baseInfo |
接口基础信息(名称、URL、方法、请求头) |
testCase |
多条测试用例,支持同一接口多场景 |
data / json / params |
请求参数,按接口类型三选一 |
validation |
断言规则 |
extract |
从响应中提取参数,供后续用例使用 |
Python 测试文件只负责加载 YAML 并调用执行引擎:
@allure.story("新增用户")
@pytest.mark.parametrize('base_info,testcase', get_testcase_yaml("./testcase/Single interface/addUser.yaml"))
def test_add_user(self, base_info, testcase):
allure.dynamic.title(testcase)
RequestBase().specification_yaml(base_info, testcase)
四、参数关联:接口之间的“传参”
多接口场景里,上一个接口的返回值经常要给下一个接口用。框架通过 extract.yaml 做参数池,配合动态函数引用:
header:
token: ${get_extract_data(token)}
userid: ${get_extract_data(userid)}
工作流程:
- 登录接口执行后,通过
extract把 token 写入extract.yaml - 后续用例用
${get_extract_data(token)}自动替换 - 自定义函数写在
common/debugtalk.py(MD5 加密、时间戳、随机数等)
这样业务场景串联时,不用在代码里手动传参。
五、多种断言方式
框架内置多种断言,在 YAML 的 validation 中配置即可:
validation:
- contains: { status_code: 200 } # 状态码 / 响应文本包含
- contains: { 'message': 'success' }
- eq: { 'state': '已入网' } # 相等断言
- ne: { 'state': '已注销' } # 不相等断言
- rv: { "data": 2 } # 任意值断言
- db: select * from sys_user where login_name ='test999' # 数据库断言
支持能力:
- HTTP 响应断言(状态码、JSON 字段)
- jsonpath 提取 + 包含/相等判断
- 直接执行 SQL 做数据库校验
六、单接口 vs 业务场景
1. 单接口测试
- 引擎:
base/apiutil.py - 每个 YAML 对应一个接口的多条用例
- 示例:用户增删改查、商品列表查询
2. 业务场景测试
- 引擎:
base/apiutil_business.py - 一个 YAML 描述完整业务流程
- 示例:商品列表 → 商品详情 → 提交订单 → 订单支付
@allure.feature('电子商务管理系统(业务场景)')
class TestEBusinessScenario:
@pytest.mark.parametrize('case_info', get_testcase_yaml('./testcase/Business interface/BusinessScenario.yml'))
def test_business_scenario(self, case_info):
RequestBase().specification_yaml(case_info)
七、测试报告
运行 run.py 后自动生成报告,支持两种风格:
| 类型 | 配置 | 说明 |
|---|---|---|
| Allure | REPORT_TYPE = 'allure' |
可视化报告,步骤清晰,适合团队分享 |
| TM Report | REPORT_TYPE = 'tm' |
轻量 HTML 报告,浏览器直接打开 |
Allure 模式下会自动复制 environment.xml,在报告中展示测试环境信息。
八、亮点:AI 智能失败分析
测试失败时,除了常规日志,框架还会调用阿里云百炼 DeepSeek 分析 traceback,输出中文修复建议:
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
report = outcome.get_result()
if report.when == "call" and report.failed:
# 获取 traceback 并调用 DeepSeek 分析
tb_str = traceback.format_exception(*sys.exc_info())
suggestion = llm_analyzer.analyze_failure(tb_str)
report.user_properties.append(("AI 修复建议", suggestion))
效果: 在 Allure 报告中,每个失败的用例都会多出一行 AI 修复建议,直接给出可能的根因和修改方向,省去人工排查时间。
九、总结
这个框架的核心价值在于:
- YAML 驱动:测试同学只需写 YAML,无需懂 Python 代码
- 场景串联:通过参数池自动传递上下文,轻松实现多接口业务流程
- 断言丰富:支持 HTTP、JSON、数据库等多种校验方式
- AI 加持:失败时自动分析,降低排查成本
如果你也在搭建接口自动化体系,希望这个框架能给你一些参考。欢迎在评论区交流讨论。
更多推荐




所有评论(0)