尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

pytest 9.0.2 发布解析:兼容性修复、回归处理与生态影响全解读

pytest 9.0.2 发布解析:兼容性修复、回归处理与生态影响全解读 pytest 9.0.2 发布解析兼容性修复、回归处理与生态影响全解读【免费下载链接】pytestThe pytest framework makes it easy to write small tests, yet scales to support complex functional testing项目地址: https://gitcode.com/GitHub_Trending/py/pytest导读pytest 9.0.2 是 pytest 9.x 系列的首个补丁版本于 2025 年 12 月 6 日发布到 PyPI定位为一次bug-fix release可无缝替换 9.0.xdrop-in replacement。本篇文章以官方发布公告 doc/en/announce/release-9.0.2.rst 为骨架结合仓库 changelog 与源码实现逐条剖析该版本修复的四个关键缺陷——终端进度特性回归、TOML 配置类型错误、config.inicfg生态兼容、unittestsubtests 性能退化——帮助你在升级后快速核对行为变化、规避潜在风险。版本概况一次面向稳定性的补丁发布发布公告明确指出pytest 9.0.2 是一个bug-fix release它不引入破坏性变更可直接替换 9.0.x 版本使用。该版本汇聚了 Alex Waygood、Bruno Oliveira、Fazeel Usmani、Freya Bruhin、Ran Benita、Tom Most、Sviatoslav Sydorenko 等贡献者的修复成果。由于公告正文只提供了 changelog 指引本次发布的具体技术内容完整记录在仓库的 doc/en/changelog.rstpytest 9.0.2 (2025-12-06)一节共包含 4 项 Bug 修复与 1 项文档改进下文逐一展开。Bug 修复一终端进度特性默认关闭#13896问题背景pytest 9.0.0 新增了终端页签进度显示特性#13072通过 OSC 9;4 ANSI 转义序列在 ConEmu、Gnome Terminal、Ptyxis、Windows Terminal、Kitty、Ghostty 等支持的终端中把测试会话进度直接渲染到终端页签或窗口标题上让开发者不用切回终端即可一目了然。然而该特性在 9.0.2 中发现与部分终端模拟器存在兼容性问题如产生桌面通知等异常行为9.0.1 曾针对 iTerm2 做过一次定向禁用。修复策略默认关闭保留显式开启通道9.0.2 的修复方式是把该特性默认禁用Windows 除外用户可通过-p terminalprogress显式开启未来兼容性改善后再考虑恢复默认开启。同时在源码层面增加了一道保险TERMdumb环境下即使插件被启用也不再发射转义码。从实现上看该特性由独立的内部插件承载其注册逻辑位于 src/_pytest/terminalprogress.pyhookimpl(trylastTrue) def pytest_configure(config: Config) - None: reporter config.pluginmanager.get_plugin(terminalreporter) if reporter is not None and reporter.isatty() and os.environ.get(TERM) ! dumb: plugin TerminalProgressPlugin(reporter) config.pluginmanager.register(plugin, nameterminalprogress-plugin)该文件注释同样印证了修复思路插件默认不加载仅在少数安全场景由 terminal 插件代为启用或由用户显式请求isatty()判断保证非交互环境下不激活TERM ! dumb则堵住了哑终端场景。未来如果兼容性足够成熟该文件将被合并回 src/_pytest/terminal.py。你需要知道的行为变化升级到 9.0.2 后若你依赖页签进度显示需自行通过-p terminalprogress开启由于该特性只在 TTY 下自动激活CI 等非交互场景本就不受影响若开启后出现异常可用-p no:terminalprogress关闭命令行pytest -p no:terminalprogress环境变量PYTEST_ADDOPTS-p no:terminalprogress项目配置addopts -p no:terminalprogress见 doc/en/how-to/usage.rst 关于addopts的说明。Bug 修复二tmp_path_retention_count的 TOML 类型纠正#13904pytest 9.0.0 引入原生 TOML 配置支持后配置值不再被强制当作字符串而是遵循 TOML 原生数据模型。在此过程中tmp_path_retention_count在 API 参考文档中的 TOML 类型被错误标注为 number数字与真实类型不符。9.0.2 将其更正为string。从源码 src/_pytest/tmpdir.py 可以看出该配置确实以字符串方式读取并在解析时做了显式校验count int(config.getini(tmp_path_retention_count)) if count 0: raise pytest.UsageError(ftmp_path_retention_count must be 0. Current input: {count}.)也就是说即使在原生 TOML 配置下tmp_path_retention_count也应以字符串形式书写如tmp_path_retention_count 3交由 pytest 内部完成int()转换与合法性检查。该配置用于配合tmp_path_retention_policy决定保留多少个会话的tmp_path目录其语义参考 doc/en/how-to/tmp_path.rst。Bug 修复三config.inicfg生态兼容 shim#13946config.inicfg是一个从未公开过的私有属性但 pytest 生态中有大量插件实际依赖它。pytest 9.0.0 在配置系统重构引入原生 TOML 后配置改为内部ConfigDict结构时对该属性做了破坏性修改导致一批第三方插件在 9.0.x 上直接失效。9.0.2 的处理是提供一个兼容 shim 恢复其工作同时在生命周期上给出明确的时间表9.1 开始弃用10.0 移除。从 src/_pytest/config/init.py 可以看到完整的兼容实现——_DeprecatedInicfgProxy把旧式映射操作代理到新的内部结构_inicfg上class _DeprecatedInicfgProxy(MutableMapping[str, Any]): Compatibility proxy for the deprecated Config.inicfg. def __getitem__(self, key: str) - Any: return self._config._inicfg[key].value def __setitem__(self, key: str, value: Any) - None: self._config._inicfg[key] ConfigValue(value, originoverride, modetoml) def __delitem__(self, key: str) - None: del self._config._inicfg[key]而访问该属性时会触发弃用警告对应文案定义在 src/_pytest/deprecated.pyconfig.inicfg is deprecated, use config.getini() to access configuration values instead.给插件开发者的行动建议如果你的插件在 9.0.2 上访问config.inicfg仍能工作说明 shim 生效但请尽快迁移到config.getini()否则会在 pytest 9.1 收到弃用警告、在 10.0 直接崩溃官方推荐替代方式config.getini()的用法可参考 doc/en/reference/reference.rst 中ConfigAPI 章节。Bug 修复四unittestsubtests 的二次方时间退化#13965pytest 9.0.0 开始原生支持 subtests含unittest.TestCase.subTest。在 Python 3.10 环境下处理大量 subtest 时出现了二次方quadratic-time性能退化——每个 subtest 失败都要重复计算相同的结果列表subtest 越多耗时越呈指数式膨胀。9.0.2 通过缓存解决了该问题。从 src/_pytest/unittest.py 的实现看新增_cached_errors_and_skips字段把subtest 错误与非 subtest 跳过两类结果只计算一次并缓存源码注释明确标注#13965_obtain_errors_and_skips()负责计算或取出缓存值避免在addSkip、_addSubTest等路径上反复遍历self._outcome在_addSkip等入口处显式传递handle_subtests参数控制跳过项的合并时机确保缓存逻辑不改变语义。该修复对两类用户有实际收益在 Python 3.10 上运行大量with self.subTest(...)的 unittest 用例收集与报告阶段耗时显著下降使用 pytest 内置subtestsfixturewith subtests.test(...)的场景同样受益其语义与用法见 doc/en/how-to/subtests.rst。文档改进命令行 flags 获得可交叉引用锚点#4492除代码修复外9.0.2 还完成了一项基础性文档工程API Reference 现在为 pytest 的全部命令行 flags 提供可交叉引用的文档。此前命令行参数散见于各功能章节现在每个 flag 在 doc/en/reference/reference.rst 中拥有稳定锚点文档内部可统一通过command-line-flags引用第三方文档与工具链也能精确定位某个 flag 的说明。升级与验证清单升级到 pytest 9.0.2建议通过 pip 安装pip install --upgrade pytest随后以pytest --version确认版本号后建议按以下清单核对终端表现若在支持 OSC 9;4 的终端中依赖页签进度验证-p terminalprogress是否按预期工作CI 中无感知tmp_path保留策略检查tmp_path_retention_count配置是否以字符串形式书写避免原生 TOML 下类型不匹配第三方插件升级后留意输出中的弃用警告确认没有插件触发config.inicfg弃用提示unittest 大套件在 Python 3.10 上观察含大量subTest的用例集耗时有无线级改善行为回归由于是 drop-in replacement现有测试套件与addopts、PYTEST_ADDOPTS等既有配置应无需任何改动。小结pytest 9.0.2 是一次典型的高质量补丁发布它没有新增功能却精准处理了 9.0.0 引入的三个真实问题——过度激进的新特性回退为显式开关、原生 TOML 化过程中的类型标注错误、以及配置结构重构对生态的连带影响并顺手修复了 subtests 的性能退化。对普通用户而言它是 9.0.x 上升级无忧的推荐版本对插件作者而言config.inicfg的弃用时间表则是 9.1/10.0 前必须完成的迁移窗口。【免费下载链接】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),仅供参考
返回列表