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 自动化主流底层执行框架,核心优势如下:

  1. 入门简单:无冗余样板代码,函数式编写用例,零基础几分钟即可上手编写第一条测试用例;
  2. 断言灵活 :直接使用 Python 原生assert做结果校验,不用记忆各类框架专属断言方法,报错信息精准直观;
  3. 原生参数化:内置参数化装饰器,轻松实现一组接口多组入参循环执行,接口自动化必备能力;
  4. 海量插件生态:依托插件可实现测试报告生成、失败用例重跑、多进程并发执行、覆盖率统计、Allure 精美报告等功能,无缝对接 requests、Selenium、Appium;
  5. 灵活用例管控:支持用例跳过、预期失败标记、自定义用例标签分组执行,适配迭代版本灵活的项目。

三、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 用例脚本:遵循命名规则后,代码左侧自带绿色运行箭头,一键执行,无需手动调用方法。

示例简易接口用例:

python 复制代码
# test_01.py
import requests
def test_baidu_req():
    res = requests.get(url="https://www.baidu.com")
    print(res.status_code)

四、Pytest 用例命名 & 收集规则(核心必记)

pytest 拥有自动用例收集机制,只有满足命名规范,框架才能自动识别并执行用例,三条硬性规则:

  1. 文件 :测试文件必须以test_开头 或 _test结尾(推荐统一 test_开头,规范统一);
  2. 测试类 :类名必须以Test开头,禁止自定义__init__构造方法
  3. 测试方法 :函数 / 类内方法必须以test开头。

重点坑点:测试类不能写__init__方法

python 复制代码
# 错误示例:类中定义__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 插件

实操示例

  1. 调试单文件,打印详情 + print 内容
python 复制代码
pytest -vs test_01.py
  1. 只执行 test_case 目录全部用例并生成 html 报告
python 复制代码
pytest test_case/ --html=report/report.html

六、pytest.ini 全局配置文件(简化命令行)

频繁敲长串命令繁琐,在项目根目录新建pytest.ini配置文件,提前预设默认参数,后续直接输入pytest即可按配置执行。

常用配置模板

python 复制代码
[pytest]
# 默认追加命令行参数,等价每次执行自带 -vs
addopts = -vs
# 指定自动扫描用例的目录
testpaths = test_case
# 自定义用例文件匹配规则(默认test_*.py)
python_files = test_*.py
# 测试类匹配规则
python_classes = Test*
# 测试方法匹配规则
python_functions = test_*
# 自定义用例标签(后续-m参数使用)
markers =
    smoke: 冒烟测试用例
    regression: 回归测试用例

配置完成后,终端直接执行pytest,自动读取配置,省去重复输入参数。

七、拓展补充(自动化落地延伸)

  1. 后续学习方向:pytest 夹具 Fixture(替代 setup/teardown 实现前后置、接口全局 cookie/headers 封装)、参数化实战、Allure 精美报告集成、多进程并发执行(pytest-xdist)、失败用例重跑;
  2. 接口自动化落地搭配:pytest+requests+Allure+yaml(用例数据分离)是当前主流接口自动化技术栈;
相关推荐
鬼拉怪拉1 小时前
【无标题】
开发语言
天天爱吃肉82181 小时前
【汽车研发测试工程师|Python自动化实测全套脚本(CAN解析+数据处理+自动出报告)】
大数据·python·功能测试·嵌入式硬件·汽车
风兮雨露1 小时前
Java 从入门到精通,前端资料
java·开发语言·前端
梅羽落1 小时前
WIFI破解
开发语言·python
码不停蹄的玄黓1 小时前
Java 频繁GC 完整排查流程
java·开发语言
凤山老林1 小时前
73-Java ListIterator 接口
java·开发语言
Roy_Sashulin1 小时前
灵杉Java编程平台与传统开发工具区别
java·开发语言
xxxxxue1 小时前
Windows 通过 右键菜单 调用 Python 脚本
开发语言·windows·python·右键菜单
Wonderful U1 小时前
基于 Django Channels 与 WebSocket 的实时聊天室:群聊、私聊、离线消息与持久化存储全实现
python·websocket·django