pytest 7.2.2 发布说明:Bug 修复版详解与升级指南

pytest 7.2.2 发布说明:Bug 修复版详解与升级指南 pytest 7.2.2 发布说明Bug 修复版详解与升级指南【免费下载链接】pytestThe pytest framework makes it easy to write small tests, yet scales to support complex functional testing项目地址: https://gitcode.com/GitHub_Trending/py/pytestpytest 7.2.2 于 2023-03-03 正式发布到 PyPI是一个纯 bug 修复bug-fix版本可视为 7.2 系列的 drop-in replacement直接替换包不会引入破坏性变更。本文以本仓库的 官方发布公告 和 changelog 原文 为骨架结合 src/_pytest 下的源码实现逐条解读本次修复的技术细节帮助开发者理解升级原因、验证修复效果并评估升级到 7.2.2 的收益与注意事项。一、本次发布概况pytest 7.2.2 属于语义化版本中的补丁patch版本它只包含 bug 修复与文档改进不含新功能与破坏性变更因此从任意 7.x 版本升级都不需要修改测试代码。发布公告给出升级命令pip install --upgrade pytest执行后将把当前环境中的 pytest 升级到最新版本含 7.2.2。若要固定到指定版本可改用pip install pytest7.2.2本次发布的贡献者名单来自发布公告包括 Bruno Oliveira、Garvit Shubham、Mahesh Vashishtha、Ramsey、Ronny Pfannschmidt、Teejay、q0w、vin01 等。提示本仓库当前主线的完整变更记录位于 CHANGELOG.rst其源文档为 doc/en/changelog.rst7.2.2 章节位于 changelog.rst#L2739-L2773。二、Bug 修复详解7.2.2 共修复 5 个 bug下面逐一结合源码说明问题成因与修复效果。1. 修复pytest.approx对含0.0值字典的比较#10533问题pytest.approx在处理值为0.0的字典时出现错误。字典比较属于整体比较场景approx需要为字典中的每个 key 生成对应近似比较器当期望值中存在0.0时相对容差rel对零值失效任何数相对 0 的偏差都是无穷大旧实现对此处理有缺陷。实现依据在 src/_pytest/approx.py 中approx()函数L723签名如下def approx( expected: T, rel: float | Decimal | timedelta | None None, abs: float | Decimal | timedelta | None None, nan_ok: bool False, ) - Approx[T]:它支持rel相对容差与abs绝对容差两种容差模式并通过_yield_comparisons等内部方法递归展开对字典、序列等结构的逐元素比较。修复后approx对字典中值为0.0的条目也能正确匹配例如from pytest import approx # 修复前存在问题的场景修复后可正常通过 assert {a: 1.0, b: 0.0} approx({a: 1.0, b: 0.0})如需深入了解 approx 的容差语义可阅读 测试用例 及 python 模块的 approx 测试。2. 修复--cache-show与--help同时传入时的崩溃#10592问题同时传入--cache-show与--help时pytest 会崩溃。缓存插件的参数处理与帮助信息的打印流程发生冲突导致早期退出路径上触发未初始化的状态。实现依据缓存相关逻辑位于 src/_pytest/cacheprovider.py命令行参数解析与帮助生成则在 src/_pytest/config/argparsing.py如 L505 附近的add_help处理。修复后两个选项可以安全地共存例如pytest --cache-show --help作用场景--cache-show用于展示上次运行缓存的断言失败、lastfailed 标记等数据详见 cache 使用指南与--help组合通常是排障时的常见操作。3. 修复名为teardown的 fixture 方法被误调用于 nose teardown 阶段#10597问题当 fixture 方法恰好命名为teardown时会被 pytest 当作 nose 风格的 teardown 阶段回调执行造成意外的清理逻辑。这是兼容 nose 测试风格setup/teardown约定的历史包袱。实现依据nose 兼容相关的收集与运行逻辑位于 src/_pytest/python.py 与 src/_pytest/unittest.py。修复后teardown只有在确实处于 nose 运行上下文时才被识别为 teardown 阶段作为 fixture 使用时不再被误触发。这在官方 changelog 中与 7.2.0 对 nose 支持正式废弃的决策见 changelog.rst#L2814-L2821一脉相承提示用户应逐步迁移掉 nose 风格的setup/teardown写法改用 pytest 原生的 fixture 机制。4. 修复--fixtures与--help同时传入时的崩溃#10626问题与 #10592 类似--fixtures列出可用 fixture与--help同时传入时同样存在崩溃。作用场景--fixtures常用于快速查看当前作用域下所有可用的 fixture 及其参数可配合-v显示 fixture 的 docstring排查fixture 未定义错误时非常有用与--help组合使用不再导致崩溃。5. 修复pytest.raises的类型标注返回ContextManager以便类型检查器收窄#10660问题此前pytest.raises的重载返回类型不够精确导致类型检查器无法将pytest.raises(...) if ... else nullcontext()这样的条件表达式收窄为ContextManager而只能推断为object进而报出类型错误。实现依据在 src/_pytest/raises.py 中raises提供了多组overload重载如 L74-L104 附近修复后相关重载返回ContextManager类型。对使用 mypy / pyright 等类型检查器的项目这类条件上下文管理器写法现在可以正常通过检查from contextlib import nullcontext from pytest import raises ctx raises(ValueError) if condition else nullcontext() with ctx: ...三、文档改进1. 文档补充 CI / BUILD_NUMBER 环境变量说明#10690在持续集成场景下pytest 常与 CI 系统Jenkins、GitHub Actions 等集成。文档补充了CI与BUILD_NUMBER环境变量的说明便于用户在 CI 环境中正确配置和解读 pytest 行为。相关文档位于 doc/en 目录下如 continuouse 集成说明。2. 修正 Hatch 打包示例的 entry-points 声明#10721文档中使用 Hatch 作为构建后端编写插件时的 entry-points 声明示例存在错误本次已修正。pytest 插件通过entry_points注册若声明格式错误插件将无法被 pytest 自动加载。想基于 Hatch 编写自定义插件的开发者可参考 编写插件指南 中的规范示例。3. 明确模块级 skip 的措辞#10753将模块级pytest.skip(..., allow_module_levelTrue)的文档措辞改得更明确它不会收集该模块中的任何测试也不会执行模块中后续的其余代码。这一澄清有助于避免开发者误以为模块级 skip 只是跳过测试而不影响模块加载。四、升级评估与注意事项适用前提本仓库的 7.2.2 是 Python 3.7 时代的稳定版本分支7.2.0 起已去除对py库的硬依赖见 changelog.rst#L2805在 Python 3.11 上使用标准库tomllib解析 TOMLchangelog.rst#L2859-L2861。若你的项目仍在使用 nose 风格的setup/teardown7.2 系列会发出废弃警告7.2.0 起 nose 支持正式废弃见 changelog.rst#L2814-L2821升级到 7.2.2 后建议尽早迁移到 fixture 体系。升级收益总结类别修复内容影响面Bugapprox比较含0.0的字典浮点断言Bug--cache-show/--fixtures与--help组合崩溃命令行排障Bug名为teardown的 fixture 被误调用fixture 生命周期Bugraises返回值类型标注静态类型检查DocCI 环境变量、Hatch 示例、模块级 skip 措辞文档可读性由于 7.2.2 是纯修复版本无 API 破坏升级成本极低若当前 7.x 环境遇到上述任一问题直接执行pip install --upgrade pytest即可获得修复。五、如何验证修复是否生效升级后可运行仓库自带的测试套件验证核心功能。仓库根目录下的 testing 目录覆盖了本次修复涉及的多个模块# 验证 approx 相关断言含 #10533 涉及场景 pytest testing/python/approx.py -q # 验证 raises 相关行为#10660 涉及场景 pytest testing/python/raises.py -q # 验证命令行选项组合不再崩溃 pytest --cache-show --help pytest --fixtures --help更完整的回归可运行pytest testing/ -q耗时较长建议在有 CI 的环境执行。仓库主线的完整变更历史见 doc/en/changelog.rst各历史版本的发布公告可查阅 doc/en/announce 目录。结语pytest 7.2.2 用 5 个针对性的 bug 修复和 3 处文档澄清消除了若干组合参数崩溃、误调用 teardown、浮点字典比较异常等棘手的边界问题并让pytest.raises的类型契约更贴合静态类型检查的需求。对于已经停留在 7.2.x 的用户这是一次值得立即执行的低风险升级。【免费下载链接】pytestThe pytest framework makes it easy to write small tests, yet scales to support complex functional testing项目地址: https://gitcode.com/GitHub_Trending/py/pytest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考