当前位置: 首页 > news >正文

pytest官方Tutorial所有示例详解(二)

11. 测试发现规则(Test Discovery)​

pytest 默认按以下规则发现测试:

  • 文件名匹配:test_*.py 或 *_test.py
  • 函数/方法名匹配:test_*
  • 类名匹配:Test*(且类中不能有 __init__ 方法)。

自定义发现规则​:
在 pytest.ini 中配置:

[pytest]
python_files = check_*.py  # 文件名匹配 check_*.py
python_functions = check_* # 函数名匹配 check_*

12. 命令行参数进阶

常用命令行选项:

选项作用
-k EXPRESSION运行名称匹配表达式的测试(如 -k "add or sub"
-x遇到第一个失败立即停止
--maxfail=num最多允许失败次数
-s禁止捕获输出(显示 print() 内容)
--lf仅重新运行上次失败的测试
--ff先运行上次失败的测试,再运行其他

示例​:

pytest -k "test_add" -s  # 运行名称包含 test_add 的测试,并显示输出

13. Fixture 作用域与生命周期

Fixture 可以通过 scope 参数控制创建和销毁的频率:

  • function(默认):每个测试函数运行一次。
  • class:每个测试类运行一次。
  • module:每个模块运行一次。
  • session:整个测试会话运行一次。

示例​:

@pytest.fixture(scope="module")
def db_connection():conn = create_db_connection()  # 模块级共享的数据库连接yield connconn.close()  # 测试结束后关闭连接

14. Fixture 依赖与参数化

Fixture 依赖其他 Fixture:

@pytest.fixture
def user(db_connection):  # 依赖 db_connection Fixturereturn create_user(db_connection)def test_user(user):assert user.name == "admin"

参数化 Fixture:

@pytest.fixture(params=[1, 2, 3])
def number(request):  # request 是内置 Fixture,用于访问参数return request.paramdef test_number(number):assert number > 0

15. Mock 与猴子补丁(Monkeypatching)​

使用 monkeypatch 修改环境变量或属性:

def test_env_var(monkeypatch):monkeypatch.setenv("API_KEY", "test_key")  # 设置环境变量assert os.getenv("API_KEY") == "test_key"def test_mock_method(monkeypatch):def mock_return():return "mocked"monkeypatch.setattr("module.Class.method", mock_return)  # 替换方法

更强大的 Mock:pytest-mock 插件

安装:

pip install pytest-mock

使用:

def test_with_mock(mocker):mocker.patch("module.function", return_value=42)assert module.function() == 42

16. 测试覆盖率(Coverage)​

结合 pytest-cov 插件统计代码覆盖率:

pip install pytest-cov
pytest --cov=my_module tests/  # 统计 my_module 的覆盖率
pytest --cov-report=html  # 生成 HTML 报告

输出示例​:

  • 终端显示覆盖率百分比。
  • HTML 报告可视化哪些代码被测试覆盖。

17. 并行测试(pytest-xdist)​

通过 pytest-xdist 插件加速测试:

pip install pytest-xdist
pytest -n 4  # 使用 4 个 CPU 核心并行运行测试

适用场景​:大型项目测试耗时较长时。


18. 插件系统

pytest 的强大之处在于其插件生态,常用插件包括:

插件功能
pytest-djangoDjango 项目专用
pytest-flaskFlask 项目专用
pytest-asyncio测试异步代码
pytest-benchmark性能基准测试

安装插件​:

pip install pytest-<plugin_name>

19. 配置文件的更多选项

pytest.ini 还支持:

  • 自定义标记(markers)。
  • 忽略特定文件/目录(norecursedirs)。
  • 修改断言输出格式(addopts = --assert=plain)。

示例​:

[pytest]
markers =slow: marks tests as slow (deselect with '-m "not slow"')
norecursedirs = .* venv  # 忽略隐藏目录和虚拟环境

20. 最佳实践总结

  1. Fixture 复用​:将数据库连接、临时文件等公共逻辑封装为 Fixture。
  2. 参数化测试​:避免重复代码,覆盖多组输入。
  3. 分层测试​:单元测试(快速反馈) + 集成测试(验证交互)。
  4. 持续集成​:在 CI 中运行 pytest --cov 确保覆盖率。
  5. 插件生态​:按需引入插件(如并行测试、Django 支持)。

官方 Tutorial 完整目录

pytest 官方 Tutorial 的完整结构如下(部分内容已涵盖):

  1. 创建你的第一个测试​(基础断言)。
  2. 运行测试​(命令行参数)。
  3. Fixture​(资源管理)。
  4. 参数化测试​(多组输入)。
  5. 标记和跳过测试​(分类测试)。
  6. Mock 和猴子补丁​(隔离依赖)。
  7. 插件系统​(扩展功能)。
  8. 配置文件​(自定义行为)。

下一步学习建议

  1. 实践​:尝试用 pytest 测试一个小型项目(如计算器、API 服务)。
  2. 阅读文档​:pytest 官方文档(尤其是 Fixtures 和 Configuration 部分)。
  3. 探索插件​:根据项目需求选择插件(如 pytest-django 或 pytest-asyncio)。
http://www.lryc.cn/news/598828.html

相关文章:

  • 这几天都是发癫写的
  • 计算机视觉技术剖析:轮廓检测、模板匹配及特征点匹配
  • 背包DP之分组背包
  • 读书笔记(王阳明心学)
  • 高可用架构模式——异地多活设计步骤
  • 物流仓储自动化升级:Modbus TCP与DeviceNet的协议融合实践
  • C++实战:人脸识别7大核心实例
  • 【数据结构初阶】--二叉树(二)
  • FreeSWITCH 简单图形化界面45 - 收集打包的一些TTS
  • 内网IM:BeeWorks私有化部署的安全通讯解决方案
  • 安全插座项目规划书
  • 【VSCode】复制到下一行快捷键
  • 2024年ASOC SCI2区TOP,基于强化学习教与学优化算法RLPS-TLBO+风电场布局优化,深度解析+性能实测
  • Go基础教程 从零到英雄:30分钟掌握Go语言核心精髓
  • Go语言管道Channel通信教程
  • 黑马点评系列问题之p44实战篇商户查询缓存 jmeter如何整
  • 2025.7.24 01背包与动态规划复习总结
  • 【Oracle】Oracle权限迷宫破解指南:2步定位视图依赖与授权关系
  • MySQL常见命令
  • 多线程 Reactor 模式
  • hcip思维导图(1)
  • GaussDB 数据库架构师(八) 等待事件概述-1
  • 阿里云ECS坑之dnf-makecache系统软件更新检测服务
  • 解决postgresql连接数不足
  • 五分钟了解Java 中的锁
  • SQL基础⑪ | 约束
  • JavaScript 中的 structuredClone() 如何彻底改变你的对象复制方式
  • Android LiveData 全面解析:原理、使用与最佳实践
  • Windows 10 远程桌面(RDP)防暴力破解脚本
  • Android 与 Windows 文件路径的设计差异