ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

pytest 5.4.0 版本解析:tee-sys 捕获、-k 忽略大小写与插件加载顺序的全面梳理

pytest 5.4.0 版本解析:tee-sys 捕获、-k 忽略大小写与插件加载顺序的全面梳理 pytest 5.4.0 版本解析tee-sys 捕获、-k 忽略大小写与插件加载顺序的全面梳理【免费下载链接】pytestThe pytest framework makes it easy to write small tests, yet scales to support complex functional testing项目地址: https://gitcode.com/GitHub_Trending/py/pytestpytest 5.4.0 是 pytest 于 2020 年 3 月 12 日发布的一个重要功能版本核心围绕更贴近真实开发场景展开新增--capturetee-sys让测试输出既实时打印又完整捕获-k表达式改为大小写不敏感匹配-p插件加载顺序与PYTEST_PLUGINS统一并带来一批破坏性变更与弃用项。阅读本文后你将掌握 5.4.0 的关键特性、破坏性变更的迁移要点以及如何在当前仓库源码中定位这些行为的实现证据。版本背景与升级方式本仓库的发布公告文档 doc/en/announce/release-5.4.0.rst 记录了该版本的发布说明完整变更条目收录于 doc/en/changelog.rst。该版本在发布时即面向包含 2000 余个自测用例、横跨多种解释器与平台的成熟项目升级方式与常规 pytest 版本一致pip install -U pytest本次发布以 bug 修复和改进为主公告文档建议用户查阅完整 CHANGELOG 以获得全部细节。从仓库文档结构看该版本的变更被系统性地归档在 doc/en/announce/index.rst 的发布列表中并在 doc/en/changelog.rst 中拥有完整的条目化记录含 issue 编号、分类与说明。破坏性变更Breaking Changes-k表达式改为大小写不敏感匹配从 5.4.0 起-k EXPRESSION对测试名称的匹配改为大小写不敏感。这意味着pytest -k login也能匹配到test_Login、TestLogin这类用例过去必须精确书写大小写才能命中的写法不再需要。这一行为变更可能让依赖大小写区分的老测试选择表达式产生更多匹配升级后建议核对 CI 中所有-k参数的实际命中范围。-p插件加载顺序调整插件参数-p指定的插件现在改为在内部插件之后加载因此其 hook 会被先于内部插件调用。这一改动使得-p与PYTEST_PLUGINS环境变量的行为保持一致。对依赖早期 hook 拦截的插件作者而言5.4.0 之后 hook 优先级发生了变化需要重新评估pytest_collection_modifyitems等 hook 的执行时机。移除pytest_itemstart钩子长期弃用且已超过十年未被 pytest 实际调用的pytest_itemstarthook 被正式移除。仍在使用该 hook 的第三方插件必须改为实现pytest_runtest_setup或其他现行 hook。错误 diff 中/-语义反转错误信息 diff 中/-的含义被修正-表示结果中缺失了预期的内容表示结果中存在意外的多余内容。断言失败的输出解读从此与常规 diff 习惯一致若你的团队依赖旧版符号习惯解读失败信息需要注意这一语义变化。FixtureDef.cached_result改为显式NoneFixtureDef的cached_result属性在结果不可用时现在被显式设置为None而不是被删除。这意味着插件中常见的hasattr(fixturedef, cached_result)判断将永远返回True必须改为fixturedef.cached_result is not None同样如果此前用del fixturedef.cached_result清除结果现在应改为赋值fixturedef.cached_result None。这一改动常见于pytest_fixture_post_finalizer这类 hook 实现中是本次升级最需要留意的一处源码级不兼容。弃用项Deprecations--no-print-logs弃用--no-print-logs选项被弃用官方推荐改用--show-capture它允许指定测试失败时如何展示捕获输出no、stdout、stderr、log或默认的all。--show-capture自 pytest 3.5.0 起引入迁移只需将--no-print-logs替换为--show-captureno。pytest_collect_directoryhook 弃用自 2010 年移除Directorycollector 后pytest_collect_directoryhook 便与实际采集流程错位且自采集与执行分离后已不可用因此被正式弃用。实现该 hook 的插件应迁移到文件级采集 hook。Node 直接构造方式弃用直接调用Nodes的构造函数被弃用统一改为通过Node.from_parent创建。这一过渡机制用于解耦紧密纠缠的 Node 关系强制更受控的创建/配置模式。session/config参数已被禁止作为构造参数。从当前仓库源码看from_parent已是 Node 的标准入口见 src/_pytest/nodes.py自定义 Node 子类若扩展创建逻辑应调用super().from_parent。TerminalReporter.writer属性弃用TerminalReporter.writer属性被弃用它属于无意暴露的公开 API将TerminalReporter与py.io.TerminalWriter过度耦合插件不应再使用该属性。新特性Features--capturetee-sys实时打印与捕获并存5.4.0 新增--capturetee-sys捕获方式实现边运行边实时打印同时完整捕获输出的效果。它尤其适合长时间运行的测试——既能即时观察进度又能在失败时拿到完整捕获日志。从源码看当前仓库的捕获方式已枚举为fd | sys | no | tee-sys见 src/_pytest/capture.py其命令行选项明确允许fd|sys|no|tee-sys四种取值见 src/_pytest/capture.py并在实现中针对tee-sys分支做了专门的输出处理见 src/_pytest/capture.py。这意味着它已稳定进入捕获机制的常规路径可与其他捕获方式一样通过--capture切换。parametrize 参数必须显式声明现在pytest.mark.parametrize的所有参数必须显式声明在函数签名中或通过indirect指定。此前若存在同名 fixture 则可以省略参数的行为只是实现上的意外并非 API 设计意图现已禁止。这消除了参数与 fixture 隐式耦合的歧义让测试签名更明确。-r默认值改为fE-r的默认值从空改为fE即默认在短测试摘要中展示失败的用例与错误。若想恢复旧行为不显示使用-rN。注意--disable-warnings现在对-ra与-rA同样生效见 Bug Fixes。junit_logging 新增取值JUnit XML 报告的日志配置项junit_logging新增log、out-err、all三个取值用于控制写入 XML 的日志内容。该配置项在仓库中的解析实现可参考 src/_pytest/junitxml.py。警告摘要按文件折叠过多的警告摘要现在按文件折叠显示避免警告汇总刷屏保持终端输出可读。改进项Improvements断言失败输出与报告体验pytest.mark.parametrize的ids重新接受整数并自动转为字符串任何 XPASSED 测试的主色改为黄色便于在结果中快速识别意外通过移除了对None做断言发出警告的行为——该警告误报率过高实用性低于预期tmpdir_factory.mktemp在收到绝对路径或未规范化的路径时现在会直接失败--showlocals与--tbshort组合也能正常工作--fulltrace在采集错误时同样生效pygments已安装时traceback 中的代码将高亮显示。官方鼓励用户安装pygments并提供反馈计划未来将其转为常规依赖。fixture 与测试工具链pytest_warning_capturedhook 新增location参数携带产生警告的代码位置pytester 的testdirfixture 在内层运行时尊重monkeypatchfixture 设置的环境变量LineMatcher.fnmatch_lines与re_match_lines支持连续行匹配即*通配符可匹配跨越换行的连续多行文本。关键 Bug 修复Bug Fixesdoctest 支持pytest.xfail()与pytest.importorskip()现在可在 doctest 中使用--trace支持 unittest--trace在 unittest 用例下正常工作--last-failed修复--last-failed现在能从已知失败的文件中采集新测试警告定位PytestUnknownMarkWarning与多项警告报告现在指向用户代码的真实位置而非 pytest 内部--pdb与 unittest不再使用 unittest 的TestCase.debug()方法-r报告去重修复f/F与s/S报告字符同时使用如-rFf时摘要条目出现两次的问题且官方明确大写变体从未被文档化推荐使用小写形式fixture 缓存键比较fixture 中请求键与缓存键的比较从改为is规避了 NumPy 数组等对象返回非 bool 值导致的崩溃输出流一致性捕获输出流的.write()方法现在返回与原流一致的返回值EncodedFile.writelines正确调用底层缓冲区的writelinesfaulthandler 崩溃修复修复PYTHONFAULTHANDLER1环境下同时配置faulthandler_timeout导致的内部崩溃空字符串参数化节点 id修复节点 id 包含参数化为空字符串变量时的问题断言重写 hook 恢复断言重写 hook 会随当前 item 存储/恢复避免testdir.runpytest等场景下残留生效pytest.exit在pytest_sessionfinish中可处理包括从调试器中退出pytest.raises传参修复pytest.raises以函数形式非上下文管理器使用时match关键字参数现在会正确传给被测函数此前5.1.0 回归会被吞掉忽略doctest 输出清理doctest 的意外异常 traceback 之间不再显示空行且testdirfixture 现在可在 doctest 中工作。文档、内部变更与升级影响总结文档与内部调整fixture 章节开头新增 fixture 列表fixtures 首句扩展为完整段落方便快速索引移除了对 Python 3.9 中已弃用的parser模块的使用为后续 Python 版本兼容铺路。升级到 5.4.0 的核对清单关注点变化升级动作-k表达式大小写不敏感核对 CI 中-k命中范围-p插件加载顺序后移hook 先于内部调用复核插件 hook 优先级pytest_itemstart已移除迁移到现行 hook错误 diff/-语义反转更新团队解读习惯FixtureDef.cached_result缺失时为Nonehasattr改为is not None判断--no-print-logs弃用改用--show-captureNode 构造弃用直接构造改用Node.from_parentparametrize参数必须显式声明补充缺失签名参数-r默认值变为fE不需要可显式-rN综合来看pytest 5.4.0 是一次行为收紧 体验增强的版本它通过破坏性变更移除了多年积累的实现巧合与死代码通过--capturetee-sys、-k大小写不敏感、-r fE默认值等改进贴近开发者日常使用习惯同时以junit_logging新取值和警告摘要折叠强化了报告能力。对于插件作者FixtureDef.cached_result、hook 调用顺序与 Node 构造方式是升级时必须检查的三处源码级不兼容点对于普通使用者tee-sys与-k的新行为则能立即改善日常测试体验。【免费下载链接】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),仅供参考
返回列表