3.Python 接口自动化之 Pytest 测试框架
一、前言:主流 Python 自动化测试框架横向对比
在 Python 自动化测试领域,unittest、pytest、Robot Framework是目前工业界最常用的三大测试框架,做接口自动化选型时,可根据项目规模、团队技术栈选择,先通过对比表理清三者核心差异:
| 对比维度 | unittest (Python 内置) | pytest | Robot Framework |
|---|---|---|---|
| 安装方式 | Python 标准库,无需额外安装 | pip install pytest | pip install robotframework |
| 语法风格 | 基于类继承TestCase | 函数式 / 面向对象,无强制样板代码 | 关键字驱动,表格化编写用例 |
| 断言写法 | self.assertEqual()等固定断言方法 | 原生 Pythonassert表达式,写法灵活 | 关键字断言(Should Be Equal 等) |
| 参数化 | 依赖subTest或第三方库 | 内置@pytest.mark.parametrize | Test Template 数据驱动 |
| 插件生态 | 匮乏,拓展依赖第三方(HTMLTestRunner) | 极其丰富:pytest-html、allure-pytest、pytest-xdist 等 | 中等,需额外安装 RequestsLibrary 等库 |
| 测试报告 | 需手动引入插件生成 | 原生支持多格式报告,搭配插件实现 HTML/Allure | 框架自带日志 + 测试报告 |
| 学习成本 | 中等(需要熟悉 unittest 固定格式) | 低,语法简洁上手快 | 偏高,需要熟记关键字语法 |
| BDD 支持 | 不支持 | 通过pytest-bdd插件扩展 | 原生 robotframework-bdd 支持 |
| 适用场景 | 小型项目、老旧遗留系统维护 | 中大型项目、高扩展性接口 / UI 自动化 | 非技术人员参与、团队协作落地自动化 |
选型总结:中小型接口自动化项目优先选用pytest,兼顾开发效率与拓展性;纯手工转自动化、业务人员参与编写用例选 RF;老旧 Python 项目兼容改造用原生 unittest。
二、Pytest 框架介绍:为什么自动化测试首选 Pytest?
Pytest 是一款开源高效的 Python 全功能测试框架,官方文档:https://docs.pytest.org/en/stable/getting-started.html,也是当前接口自动化、Web 自动化、APP 自动化主流底层执行框架,核心优势如下:
- 入门简单:无冗余样板代码,函数式编写用例,零基础几分钟即可上手编写第一条测试用例;
- 断言灵活:直接使用 Python 原生
assert做结果校验,不用记忆各类框架专属断言方法,报错信息精准直观; - 原生参数化:内置参数化装饰器,轻松实现一组接口多组入参循环执行,接口自动化必备能力;
- 海量插件生态:依托插件可实现测试报告生成、失败用例重跑、多进程并发执行、覆盖率统计、Allure 精美报告等功能,无缝对接 requests、Selenium、Appium;
- 灵活用例管控:支持用例跳过、预期失败标记、自定义用例标签分组执行,适配迭代版本灵活的项目。
三、Pytest 环境安装(版本适配说明)
3.1 指定版本安装
文档示例固定版本pytest==8.3.2,该版本最低依赖 Python3.8+,安装命令:
# 固定版本安装,统一项目环境避免版本差异 pip install pytest==8.3.2建议团队统一 pytest 版本,防止不同版本 API 变动导致脚本报错。
3.2 pytest 与 Python 版本适配对照表
若本地 Python 版本低于 3.8,按需降级 pytest 版本:
| pytest 版本 | 最低支持 Python 版本 |
|---|---|
| 8.0+ | 3.8+ |
| 7.1+ | 3.7+ |
| 6.2~7.0 | 3.6+ |
| 5.0~6.1 | 3.5+ |
| 3.3~4.6 | 2.7/3.4+ |
3.3 安装验证
安装完成后在 Pycharm 确认项目解释器已加载 pytest,对比普通 py 脚本与 pytest 用例运行区别:
- 原生 python 脚本:必须编写
if __name__ == '__main__':主动调用函数才能执行; - pytest 用例脚本:遵循命名规则后,代码左侧自带绿色运行箭头,一键执行,无需手动调用方法。
示例简易接口用例:
# test_01.py import requests def test_baidu_req(): res = requests.get(url="https://www.baidu.com") print(res.status_code)四、Pytest 用例命名 & 收集规则(核心必记)
pytest 拥有自动用例收集机制,只有满足命名规范,框架才能自动识别并执行用例,三条硬性规则:
- 文件:测试文件必须以
test_开头 或_test结尾(推荐统一 test_开头,规范统一); - 测试类:类名必须以
Test开头,禁止自定义__init__构造方法; - 测试方法:函数 / 类内方法必须以
test开头。
重点坑点:测试类不能写__init__方法
# 错误示例:类中定义__init__会导致pytest无法收集用例 class TestDemo(): def __init__(self): print("初始化构造") def test_a(self): pass报错原因:pytest 自动实例化测试类,自定义
__init__会干扰框架实例化逻辑,如需前置初始化,改用setup()、fixture实现。
满足命名规则后,终端输入pytest即可自动扫描当前目录所有符合规则的用例并执行。
五、Pytest 常用命令行参数(日常高频使用)
通过命令行参数灵活控制用例执行范围、日志输出、报告生成,整理高频命令:
| 命令 | 作用说明 | 补充备注 |
|---|---|---|
| pytest | 默认扫描当前目录 + 子目录所有符合规则用例并执行 | 无 |
| pytest -v | 详细打印用例执行结果,展示用例名称和执行状态 | v=verbose 详情 |
| pytest -s | 控制台输出用例中 print () 打印内容 | 默认 pytest 屏蔽 print 输出 |
| pytest -vs | -v 和 - s 组合简写,最常用调试命令 | 日常调试首选pytest -vs |
| pytest test_xxx.py | 仅执行指定 py 文件内所有用例 | 精准执行单文件 |
| pytest test_dir/ | 执行指定文件夹下全部用例 | 批量跑目录 |
| pytest -k "关键词" | 只运行用例名包含指定关键词的用例 | 模糊匹配筛选用例 |
| pytest -m "标记名" | 只执行打了对应 marker 标签的用例 | 用于环境分组(冒烟 / 回归) |
| pytest --html=report.html | 生成 html 格式测试报告 | 需提前安装:pip install pytest-html |
| pytest --cov = 项目目录 | 统计代码覆盖率 | 依赖 pytest-cov 插件 |
实操示例
- 调试单文件,打印详情 + print 内容
pytest -vs test_01.py- 只执行 test_case 目录全部用例并生成 html 报告
pytest test_case/ --html=report/report.html六、pytest.ini 全局配置文件(简化命令行)
频繁敲长串命令繁琐,在项目根目录新建pytest.ini配置文件,提前预设默认参数,后续直接输入pytest即可按配置执行。
常用配置模板
[pytest] # 默认追加命令行参数,等价每次执行自带 -vs addopts = -vs # 指定自动扫描用例的目录 testpaths = test_case # 自定义用例文件匹配规则(默认test_*.py) python_files = test_*.py # 测试类匹配规则 python_classes = Test* # 测试方法匹配规则 python_functions = test_* # 自定义用例标签(后续-m参数使用) markers = smoke: 冒烟测试用例 regression: 回归测试用例配置完成后,终端直接执行pytest,自动读取配置,省去重复输入参数。
七、拓展补充(自动化落地延伸)
- 后续学习方向:pytest 夹具 Fixture(替代 setup/teardown 实现前后置、接口全局 cookie/headers 封装)、参数化实战、Allure 精美报告集成、多进程并发执行(pytest-xdist)、失败用例重跑;
- 接口自动化落地搭配:pytest+requests+Allure+yaml(用例数据分离)是当前主流接口自动化技术栈;
