更新日志¶
版本遵循 语义化版本控制 (<major>.<minor>.<patch>
)。
向后不兼容(破坏性)更改将仅在主要版本中引入,并在版本的弃用部分提前通知。
pytest 8.3.5 (2025-03-02)¶
Bug 修复¶
#11777: 修复了即使使用
-vv
详细级别,序列仍然被缩短的问题。#12888: 修复了当使用 Python 3.13+ 和 Python 的
libedit
构建版本时(例如在 macOS 上或使用来自python-build-standalone
项目的 uv 管理的 Python 二进制文件)输入损坏的问题。这可能会表现为使用Pdb
时提示符损坏,或者在使用input()
和暂停捕获手动使用时看到空输入。#13026: 修复了当顶层目录与标准库的另一个模块同名时,使用
--import-mode=importlib
时发生的AttributeError
崩溃。#13053: 修复了 pytest 8.3.4 中的回归,其中当使用
--import-mode=importlib
时,包含同名 py 文件的目录会导致ImportError
#13083: 修复了如果在收集期间移除了其中一个收集的目录,pytest 可能会崩溃的问题。
改进的文档¶
#12842: 添加了关于将类型与 pytest 一起使用的专用页面。
请参阅 pytest 中的类型标注 以获取详细用法。
面向贡献者的更改¶
pytest 8.3.4 (2024-12-01)¶
Bug 修复¶
#12592: 修复了当目录布局中目录包含同名子目录时,使用
--import-mode=importlib
时发生的KeyError
崩溃。#12849: 现在在
pytest.fail()
与pytrace=False
中正确处理了彩色输出的 ANSI 转义码。#9353: 当给定布尔值时,
pytest.approx()
现在使用严格相等性。
改进的文档¶
#10558: 修复了
pytest.Config.getoption()
的含义模糊的文档字符串。#12966: 澄清了 @pytest.mark.filterwarnings 文档中关于使用多个 @pytest.mark.filterwarnings 标记时的过滤器优先级/顺序。
面向贡献者的更改¶
#12497: 修复了 Python 3.13 上两个与 pdb 相关的测试失败的问题。
pytest 8.3.3 (2024-09-09)¶
Bug 修复¶
#12446: 避免在 fixture 发现期间调用
@property
(和其他实例描述符) – 由 @asottile 提供#12659: 修复了在 pytest>=8.1 中使用参数
--import-mode=importlib
时不显示断言失败差异的问题。#12667: 修复了
ExceptionInfo.errisinstance
中的类型更改导致mypy
失败的回归。#12744: 修复了与 Python 3.9 或更低版本的类型兼容性 – 将
typing.Self
替换为typing_extensions.Self
– 由 @Avasam 提供#12745: 修复了 Windows 上节点 ID 路径中反斜杠被错误转换的问题,确保了跨环境的一致路径处理。
#6682: 修复了在打印失败断言的 “msg” 部分(如
assert condition, msg
中)时,未遵循详细级别的问题。#9422: 修复了通过
-p no:terminal
禁用 terminal 插件会导致与缺少verbose
选项相关的崩溃的问题。– 由 @GTowers1 提供
改进的文档¶
其他内部更改¶
#12769: 修复了 codespell 发现的拼写错误,并将 codespell 添加到 pre-commit hooks。
pytest 8.3.2 (2024-07-24)¶
Bug 修复¶
#12652: 解决了不再自动检测到
conda
环境的回归问题。– 由 @RonnyPfannschmidt 提供
pytest 8.3.1 (2024-07-20)¶
8.3.0 版本未能包含发行说明和文档。此补丁版本纠正了这一点。没有其他更改。
pytest 8.3.0 (2024-07-20)¶
新特性¶
#12231: 添加了
--xfail-tb
标志,该标志为 XFAIL 结果启用回溯输出。如果未给出
--xfail-tb
标志,则不会显示 XFAIL 结果的回溯。XFAIL 的回溯样式由
--tb
设置,可以是auto|long|short|line|native|no
。注意:即使您设置了
--xfail-tb
,如果--tb=no
,您也不会看到它们。
一些历史
在 pytest 8.0 中,
-rx
或-ra
不仅会为 xfail 启用摘要报告,还会报告 xfail 结果的回溯。这给一些利用 xfail 但不想看到所有 xfail 回溯的项目带来问题。此更改将 xfail 回溯与
-rx
分离,现在我们使用--xfail-tb
启用 xfail 回溯。这样,默认的-rx
/-ra
行为在 xfail 回溯方面与 8.0 之前的版本相同。虽然这是一个行为更改,但它将默认行为带回到 8.0.0 之前的行为,这最终被认为是更好的行动方案。– 由 @okken 提供
#12281: 添加了对 marker 表达式中关键字匹配的支持。
现在可以通过 marker 关键字参数选择测试。支持的值为
int
、(未转义的)str
、bool
和None
。有关更多信息,请参阅 marker 示例。
– 由 @lovetheguitar 提供
#12567: 添加了
--no-fold-skipped
命令行选项。如果设置了此选项,则简短摘要中跳过的测试不再按原因分组,而是所有测试都以与其他状态相同的方式单独打印,并带有其节点 ID。
– 由 @pbrezina 提供
现有功能的改进¶
#12469: 控制台输出现在使用 “第三方插件” 术语,取代了之前建立但令人困惑和过时的对 setuptools 的引用 – 由 @webknjaz 提供。
#12544, #12545: 通过检查
pyvenv.cfg
文件改进了 Python 虚拟环境检测,确保了在各种平台上的可靠检测 – 由 @zachsnickers 提供。#2871: 在使用
-vvv
运行的情况下,不要截断输出中函数的参数。#389: 增强了对绑定方法的断言内省的可读性 – 由 @farbodahm, @webknjaz, @obestwalter, @flub 和 @glyphack 提供。
之前,它看起来像
=================================== FAILURES =================================== _____________________________________ test _____________________________________ def test(): > assert Help().fun() == 2 E assert 1 == 2 E + where 1 = <bound method Help.fun of <example.Help instance at 0x256a830>>() E + where <bound method Help.fun of <example.Help instance at 0x256a830>> = <example.Help instance at 0x256a830>.fun E + where <example.Help instance at 0x256a830> = Help() example.py:7: AssertionError =========================== 1 failed in 0.03 seconds ===========================
现在它看起来像
=================================== FAILURES =================================== _____________________________________ test _____________________________________ def test(): > assert Help().fun() == 2 E assert 1 == 2 E + where 1 = fun() E + where fun = <test_local.Help object at 0x1074be230>.fun E + where <test_local.Help object at 0x1074be230> = Help() test_local.py:13: AssertionError =========================== 1 failed in 0.03 seconds ===========================
#7662: 在 JUnit XML 报告中添加了测试套件时间戳的时区信息。
Bug 修复¶
#11706: 修复了在使用
--maxfail
或--stepwise
时,更高作用域 fixture 中 teardown 错误的报告。最初在 pytest 8.0.0 中添加,但由于 pytest-xdist 中的回归而在 8.0.2 中还原。此回归已在 pytest-xdist 3.6.1 中修复。
#11797:
pytest.approx()
现在可以正确处理类似Sequence
的对象。#12204, #12264: 修复了 pytest 8.0 中的回归,其中由于共享的更高作用域 fixture 引发异常,导致多个测试失败时,回溯变得越来越长 – 由 @bluetech 提供。
还修复了 pytest 5.4 中收集器在设置期间引发异常的类似回归。
此修复需要内部更改,可能会影响某些插件
FixtureDef.cached_result[2]
现在是一个元组(exc, tb)
而不是exc
。SetupState.stack
失败现在是一个元组(exc, tb)
而不是exc
。
#12275: 修复了遇到
abstract
类(包括抽象unittest.TestCase
子类)时发生的收集错误。#12328: 修复了 pytest 8.0.0 中的回归,其中包作用域的参数化项目在某些情况下未正确重新排序以最小化设置/拆卸。
#12424: 修复了在使用 pytest-rerunfailures 等插件重新运行 unittest 测试时,
assert testcase is not None
断言失败导致的崩溃。在 8.2.2 中回归。#12472: 修复了从
pytest_report_teststatus
hook 返回类别"error"
或"failed"
以及自定义测试状态时发生的崩溃 – @pbrezina。#12505: 改进了
pytest.raises(match=r'...')
中无效正则表达式模式的处理,提供了清晰的错误消息。#12580: 修复了在 Windows 上使用缓存类且缓存目录同时创建时发生的崩溃。
#6962: 参数化参数现在使用
==
而不是is
进行比较(如果参数不支持==
,则仍然使用is
作为后备)。这修复了诸如列表之类的参数的使用,这些参数具有不同的id
但比较相等,导致 fixture 被重新计算而不是被缓存。#7166: 修复了在使用 pytest-xdist
-n
运行时,进度百分比(屏幕边缘的[ 87%]
)有时未正确对齐的问题。
改进的文档¶
#12153: 记录了使用
PYTEST_VERSION
检测代码是否在 pytest 运行中运行。#12469: 文档中外部插件的提及现在避免提及 setuptools entry-points,因为这个概念现在更加通用。相反,“外部”、“已安装” 或 “第三方” 插件(或软件包)的术语取代了它。
– 由 @webknjaz 提供
#12577:
CI
和BUILD_NUMBER
环境变量的角色在参考文档中进行了描述。它们现在也出现在执行pytest -h
时 – 由 @MarcBresson 提供。
面向贡献者的更改¶
#12467: 通过使用
annotations
future import,将所有内部类型注解迁移到 python3.10+ 风格。– 由 @RonnyPfannschmidt 提供
#11771, #12557: PyPy 运行时版本已从 3.8 更新到 3.9,3.8 在垃圾回收器中引入了一个不稳定的 bug,预计不会在那里修复,因为 3.8 已 EoL。
– 由 @x612skm 提供
#12493: 更改日志草稿预览集成已重构为使用第三方扩展
sphinxcontib-towncrier
。之前的仓库内脚本将更改日志预览文件放在doc/en/_changelog_towncrier_draft.rst
。该文件不再在 Git 中被忽略,并且可能会出现在贡献者的开发环境中的未跟踪文件中。为了解决这个问题,贡献者可以运行以下命令来清理它$ git clean -x -i -- doc/en/_changelog_towncrier_draft.rst
– 由 @webknjaz 提供
#12498: 所有未记录的
tox
环境现在都有描述。可以通过在终端中调用tox -av
在开发环境中列出它们。– 由 @webknjaz 提供
#12501: 更改日志配置已更新,以引入更准确的面向受众的类别。以前,有一种
trivial
更改日志片段类型,其含义不明确且范围广泛。它已被删除,我们现在有contrib
、misc
和packaging
代替它。新的更改说明类型针对下游打包者和项目贡献者。此外,杂项部分保留用于不适合任何其他位置的未指定更新。
– 由 @webknjaz 提供
#12502: 用于更新插件列表的 GitHub 自动化 UX 已更新。以前,维护人员必须关闭自动创建的 pull request 并重新打开它们以触发 CI 运行。从现在开始,他们只需要单击
Ready for review
按钮即可。– 由 @webknjaz 提供
#12522:
:pull:
RST 角色已替换为较短的:pr:
,因为开始使用第三方 sphinx-issues Sphinx 扩展的实现 – 由 @webknjaz 提供。#12531: 代码覆盖率报告配置已更新,以从代码覆盖率报告中排除 pytest 自己的标记为预期失败的测试。这具有减少不稳定测试对结果数量的影响的效果。
– 由 @webknjaz 提供
#12533:
extlinks
Sphinx 扩展不再启用。它曾经声明的:bpo:
角色已随之删除。BPO 本身已在几年前迁移到 GitHub,并且可以通过使用其 GitHub issue 编号和sphinx-issues
扩展实现的:issue:
角色来链接相应的 issue。– 由 @webknjaz 提供
#12562: 现在通过 pre-commit 工具集成来 linting 使用
:user:
RST 角色时可能出现的拼写错误 – 由 @webknjaz 提供。
pytest 8.2.2 (2024-06-04)¶
Bug 修复¶
改进的文档¶
pytest 8.2.1 (2024-05-19)¶
改进¶
#12334: 支持 Python 3.13(在编写时为 beta1)。
缺陷修复¶
琐碎/内部更改¶
#12333: pytest 版本现在使用 GitHub 最近推出的 Artifact Attestation 支持进行证明,允许用户验证 pytest 的 sdist 和 wheel 制品的出处。
pytest 8.2.0 (2024-04-27)¶
破坏性更改¶
#12089: pytest 现在要求
unittest.TestCase
子类可以使用MyTestCase('runTest')
自由实例化。如果类不允许这样做,您可能会在收集期间看到如下错误:
AttributeError: 'MyTestCase' object has no attribute 'runTest'
。不覆盖
__init__
的类,或者不在__init__
中使用getattr
或类似方法访问测试方法的类不受影响。应该注意不因给定
"runTest"
而崩溃的类,如 unittest.TestCases 的实现 中所示。或者,考虑使用setUp
而不是__init__
。如果您在使用
tornado.AsyncTestCase
时遇到此问题,请参阅 issue 12263。如果您在使用抽象
TestCase
子类时遇到此问题,请参阅 issue 12275。历史记录:此更改对自定义 TestCase 实现的影响最初未得到适当考虑,这就是为什么它在次要版本中完成。对于由此带来的不便,我们深感抱歉。
弃用¶
#12069: 当以下 hook 之一的实现请求已弃用的
py.path.local
参数而不是替换它的pathlib.Path
参数时,现在会引发弃用警告pytest_ignore_collect
-path
参数 - 请改用collection_path
。pytest_collect_file
-path
参数 - 请改用file_path
。pytest_pycollect_makemodule
-path
参数 - 请改用module_path
。pytest_report_header
-startdir
参数 - 请改用start_path
。pytest_report_collectionfinish
-startdir
参数 - 请改用start_path
。
替换参数自 pytest 7.0.0 起可用。旧参数将在 pytest 9.0.0 中删除。
有关更多详细信息,请参阅 hooks 的 py.path.local 参数已替换为 pathlib.Path。
功能特性¶
改进¶
#11523: 如果找到模块,但引发
ImportError
而不是ModuleNotFoundError
,pytest.importorskip()
现在将发出警告。可以通过将
exc_type=ImportError
传递给pytest.importorskip()
来抑制警告。有关详细信息,请参阅 pytest.importorskip 关于 ImportError 的默认行为。
#11728: 对于基于
unittest
的测试,类清理期间的异常(由使用TestCase.addClassCleanup
注册的函数引发)现在会被报告,而不是静默失败。#11777: 当给出
-vv
时,文本不再在short test summary info
部分中截断。#12112: 启用
consider_namespace_packages
后,改进了命名空间包检测,涵盖更多情况(如可编辑安装)。#9502: 添加了
PYTEST_VERSION
环境变量,该变量在 pytest 会话开始时定义,之后未定义。它包含pytest.__version__
的值,除其他外,可用于轻松检查代码是否在 pytest 运行中运行。
缺陷修复¶
#12065: 修复了 pytest 8.0.0 中的回归,其中包含
setup_method
的测试类和使用@staticmethod
或@classmethod
的测试会因AttributeError: 'NoneType' object has no attribute 'setup_method'
而崩溃。现在,使用
@staticmethod
和@classmethod
的测试的request.instance
属性不再是None
,而是该类的新实例,就像在非静态方法中一样。以前它是None
,并且此类测试的所有 fixture 将共享一个self
。#12135: 修复了 fixture 多次向其请求的 fixture 添加 finalizer 导致某些情况下不可靠且不直观的拆卸顺序的问题。
#12194: 修复了
--importmode=importlib
和--doctest-modules
的一个 bug,其中子模块未显示为父模块中的属性。#1489: 修复了某些情况下,更高作用域 fixture 的拆卸未以它们初始化的相反顺序发生的问题。
琐碎/内部更改¶
pytest 8.1.2 (2024-04-26)¶
缺陷修复¶
#12114: 修复了与
numpy
数组一起使用并与其他类型比较时pytest.approx()
中的错误。
pytest 8.1.1 (2024-03-08)¶
注意
此版本不是通常的缺陷修复版本 – 它包含功能和改进,是 8.1.0
的后续版本,该版本已从 PyPI 撤下。
功能特性¶
#11475: 添加了新的
consider_namespace_packages
配置选项,默认为False
。如果设置为
True
,pytest 将尝试在导入模块时识别属于 命名空间包 的模块。#11653: 添加了新的
verbosity_test_cases
配置选项,用于精细控制测试执行详细程度。有关更多详细信息,请参阅 精细粒度详细程度。
改进¶
#10865:
pytest.warns()
现在验证是否使用str
或Warning
调用了warnings.warn()
。目前在 Python 中可以使用其他类型,但是当使用warnings.filterwarnings()
过滤这些警告时,这会导致异常(有关讨论,请参阅 CPython #103577)。虽然这可以被认为是 CPython 中的一个 bug,但我们决定在 pytest 中设置保护,因为没有此检查的情况下产生的错误消息令人困惑。#11311: 当在没有定义配置文件的情况下为调用中的路径使用
--override-ini
时,当前工作目录用作相对目录。以前,这将引发
AssertionError
。#11475: –import-mode=importlib 现在尝试使用标准导入机制导入模块(但仍然不更改
sys.path
),仅在失败时才回退到直接导入模块。这意味着,如果可能,已安装的软件包将以其规范名称导入,例如
app.core.models
,而不是模块名称始终从其路径派生(例如.env310.lib.site_packages.app.core.models
)。#11801: 在节点上添加了
iter_parents()
帮助方法。它类似于listchain
,但从下到上,并返回迭代器,而不是列表。#11850: 添加了对 Python>=3.12 上事后调试的
sys.last_exc
的支持。#11962: 如果未找到其他合适的配置文件候选项,则
pyproject.toml
(即使没有[tool.pytest.ini_options]
表)将被视为配置文件并定义rootdir
。#11978: 向日志记录插件添加
--log-file-mode
选项,启用附加到日志文件。此选项接受"w"
或"a"
,默认为"w"
。以前,模式硬编码为
"w"
,这会在日志记录之前截断文件。#12047: 当 fixture 的多个 finalizer 引发异常时,现在所有异常都作为异常组报告。以前,仅报告第一个异常。
缺陷修复¶
#11475: 修复了
--importmode=importlib
会多次导入非测试模块的回归。#11904: 修复了 pytest 8.0.0 中的回归,该回归在使用
--pyargs
时会导致由于权限错误而导致测试收集失败。此更改改进了使用
--pyargs
指定的测试的收集树,有关与 pytest 8.0 和 <8 的比较,请参阅 #12043。#12011: 修复了 8.0.1 中的回归,其中当传递
--doctest-modules
时,不执行 xunit 样式的setup_module
fixture。#12014: 修复了警告在 fixture 上使用的 mark 时使用的
stacklevel
。#12039: 修复了
8.0.2
中的回归,其中在 Windows 下的 CI 中多次收集使用tmp_path
创建的测试。
改进的文档¶
#11790: 更详细地记录了使用
tmp_path
fixture 创建的临时目录的保留。
琐碎/内部更改¶
#11785: 对私有函数进行了一些更改,可能会影响访问它们的插件
FixtureManager._getautousenames()
现在采用Node
本身而不是 nodeid。FixtureManager.getfixturedefs()
现在采用Node
本身而不是 nodeid。_pytest.nodes.iterparentnodeids()
函数已被删除,没有替代项。最好改为遍历节点层次结构本身。如果确实需要,请从以前的 pytest 版本中复制该函数。
#12069: 将以下功能的弃用延迟到
9.0.0
在
8.1.0
发布后发现,关于即将删除的警告未显示,因此团队决定恢复删除。这是
8.1.0
被撤下的原因。
pytest 8.1.0 (已撤下)¶
pytest 8.0.2 (2024-02-24)¶
缺陷修复¶
pytest 8.0.1 (2024-02-16)¶
缺陷修复¶
#11875: 正确处理 Python 3.13 中
getpass.getuser()
中的错误。#11879: 修复了
ExceptionInfo._stringify_exception
可能导致pytest.raises()
崩溃的边缘情况。#11906: 修复了使用在其
__init__
中具有多个参数的自定义警告子类时pytest.warns()
的回归。#11907: 修复了 pytest 8.0.0 中的回归,其中在
pytest.warns()
块内调用pytest.skip()
和类似的控制流异常会被抑制而不是传播。#11929: 修复了 pytest 8.0.0 中的回归,其中模块中定义的 autouse fixture 被模块中的 doctest 忽略。
#11937: 修复了 pytest 8.0.0 中的回归,其中在某些情况下,item 会以相反的顺序收集。
pytest 8.0.0 (2024-01-27)¶
缺陷修复¶
pytest 8.0.0rc2 (2024-01-17)¶
改进¶
#11233: 改进了 xfailures 和 xpasses 的
-r
当设置
-rx
时,报告 xfailures 的回溯。当设置
-rX
时,报告 xpasses 的捕获输出。对于 xpasses,在测试名称和原因之间的摘要中添加
-
,以匹配 xfail 的显示方式。
#11825:
pytest_plugin_registered
hook 有一个新的plugin_name
参数,其中包含注册plugin
所用的名称。
缺陷修复¶
#11706: 修复了在使用
--maxfail
或--stepwise
时,更高作用域 fixture 中拆卸错误的报告。注意:此更改已在 pytest 8.0.2 中恢复,以修复它在 pytest-xdist 中引起的 回归。
#11758: 修复了
IndexError: string index out of range
在if highlighted[-1] == "\n" and source[-1] != "\n"
中的崩溃。此错误是在 pytest 8.0.0rc1 中引入的。#9765, #11816: 修复了一个令人沮丧的错误,该错误困扰了一些用户,唯一的错误是
assert mod not in mods
。问题是由于str(Path(mod))
和mod.__file__
不一定产生相同的字符串,并且在代码的某些地方被错误地互换使用。此修复程序还破坏了
PytestPluginManager.consider_conftest
的内部 API,引入了一个新参数 – 我们提到这一点是为了防止外部代码使用它,即使标记为私有。
pytest 8.0.0rc1 (2023-12-30)¶
破坏性更改¶
旧的弃用现在是错误¶
#7363: PytestRemovedIn8Warning 弃用警告现在默认为错误。
根据我们尽可能减少中断地删除弃用功能的计划,所有
PytestRemovedIn8Warning
类型的警告现在默认生成错误而不是警告消息。受影响的功能将在 pytest 8.1 中有效删除,因此请查阅文档中的 弃用和删除 部分,以获取有关如何更新现有代码的说明。
在 pytest
8.0.X
系列中,可以通过将此添加到您的pytest.ini
文件中,将错误更改回警告作为权宜之计[pytest] filterwarnings = ignore::pytest.PytestRemovedIn8Warning
但这将在 pytest
8.1
发布后停止工作。如果您对删除特定功能有疑问,请在 #7363 中添加评论。
版本兼容性¶
#11151: 放弃了对 Python 3.7 的支持,Python 3.7 在 2023-06-27 达到生命周期结束。
现在需要
pluggy>=1.3.0
。
收集更改¶
在此版本中,我们对 pytest 的收集阶段进行了一些破坏性更改,特别是围绕如何收集文件系统目录和 Python 包,修复缺陷并允许清理和改进 pytest 的内部结构。这些更改的弃用期是不可能的。
#7777: 现在以字母顺序共同收集文件和目录,除非插件更改。以前,先收集文件,然后再收集目录。有关示例,请参见下文。
#8976: 运行
pytest pkg/__init__.py
现在仅收集pkg/__init__.py
文件(模块)。以前,它收集整个pkg
包,包括目录中的其他测试文件,但不包括__init__.py
文件本身的测试(除非python_files
已更改为允许__init__.py
文件)。要收集整个包,请仅指定目录:
pytest pkg
。#11137:
pytest.Package
不再是pytest.Module
或pytest.File
的子类型。Package
收集器节点指定一个 Python 包,即包含__init__.py
文件的目录。 以前,Package
是pytest.Module
(代表单个 Python 模块)的子类型,模块是__init__.py
文件。 这已被认为是设计上的失误(详情请参阅 #11137 和 #7777)。Package
节点的path
属性现在指向包目录,而不是__init__.py
文件。请注意,
__init__.py
的Module
节点(它不是Package
)仍然可能存在,如果在收集期间被选中(例如,如果您配置了python_files
以包含__init__.py
文件)。#7777: 添加了一个新的
pytest.Directory
基础收集器节点,所有文件系统目录的收集器节点都应继承自它。 这类似于现有的文件节点pytest.File
。已将
pytest.Package
更改为pytest.Directory
的子类。Package
代表一个文件系统目录,该目录是一个 Python 包,即包含__init__.py
文件。pytest.Package
现在仅收集其自身目录中的文件; 以前它是递归收集的。 子目录被收集为它们自己的收集器节点,然后它们自己进行收集,从而创建一个镜像文件系统层次结构的收集树。添加了一个新的
pytest.Dir
具体收集器节点,它是pytest.Directory
的子类。 此节点代表一个文件系统目录,它不是pytest.Package
,即不包含__init__.py
文件。 与Package
类似,它仅收集其自身目录中的文件。pytest.Session
现在仅收集初始参数,而不再递归进入目录。 这项工作现在由目录收集器节点的递归展开过程
完成。session.name
现在是""
; 以前它是 rootdir 目录名称。 这与一直为""
的session.nodeid
相匹配。收集树现在包含直到 rootdir 的目录/包,对于在 rootdir 中找到的初始参数。 对于 rootdir 之外的文件,仅收集直接目录/包 – 但请注意,不鼓励从 rootdir 外部进行收集。
例如,给定以下文件系统树
myroot/ pytest.ini top/ ├── aaa │ └── test_aaa.py ├── test_a.py ├── test_b │ ├── __init__.py │ └── test_b.py ├── test_c.py └── zzz ├── __init__.py └── test_zzz.py
收集树,如
pytest --collect-only top/
所示,但为了清晰起见,添加了原本隐藏的Session
节点,现在如下所示<Session> <Dir myroot> <Dir top> <Dir aaa> <Module test_aaa.py> <Function test_it> <Module test_a.py> <Function test_it> <Package test_b> <Module test_b.py> <Function test_it> <Module test_c.py> <Function test_it> <Package zzz> <Module test_zzz.py> <Function test_it>
以前,它是
<Session> <Module top/test_a.py> <Function test_it> <Module top/test_c.py> <Function test_it> <Module top/aaa/test_aaa.py> <Function test_it> <Package test_b> <Module test_b.py> <Function test_it> <Package zzz> <Module test_zzz.py> <Function test_it>
依赖于特定形状收集树的代码/插件可能需要更新。
#11676: 类
Node
、Collector
、Item
、File
、FSCollector
现在被标记为抽象类(请参阅abc
)。我们不希望此更改会影响用户和插件作者,只有当代码已经错误或存在问题时,才会导致错误。
其他重大更改¶
以下是一些无法弃用的重大更改。
#11282: 规范化了定义配置选项时
default
参数的处理。以前,如果未为
parser.addini
提供default
,并且配置选项值未在测试会话中定义,则调用config.getini
会返回一个空列表或一个空字符串,具体取决于是否提供了type
,这显然是不正确的。 此外,即使在使用default=None
显式定义选项时,None
也不会被采用。现在
parser.addini
的行为如下:如果未传递
default
,但提供了type
,则将返回特定于类型的默认值。 例如,type=bool
将返回False
,type=str
将返回""
等。如果传递了
default=None
且该选项未在测试会话中定义,则无论type
如何,都将返回None
。如果既未提供
default
也未提供type
,则假定type=str
并返回""
作为默认值(这与之前的行为一致)。
团队决定不对这项更改引入弃用期,因为这样做在向社区沟通以及实施方面都很复杂,而且团队认为,除了极少数情况外,这项更改不应破坏现有插件。
#11667: pytest 的
setup.py
文件已被删除。 如果您依赖此文件,例如使用setup.py install
安装 pytest,请参阅 为什么不应直接调用 setup.py 以了解替代方案。#9288:
warns()
现在会在上下文关闭时重新发出不匹配的警告 – 以前它会消耗所有警告,从而隐藏函数未匹配到的警告。虽然这是一个新功能,但我们将其宣布为重大更改,因为许多测试套件配置为在警告时报错,因此在新重新发出的警告上将会失败。
内部
FixtureManager.getfixtureclosure
方法已更改。 使用此方法或子类化FixtureManager
并覆盖该方法的插件将需要适应此更改。
弃用¶
#10465: 返回
None
以外值的测试函数现在将发出pytest.PytestWarning
而不是pytest.PytestRemovedIn8Warning
,这意味着这将在未来保持警告状态,而不是变成错误。#3664: 现在将标记应用于 fixture 函数会发出警告:fixture 中的标记从未生效,但是将标记应用于 fixture (例如
usefixtures
)并期望它工作是常见的用户错误。这将在 pytest 9.0 中变为错误。
特性和改进¶
改进的差异显示¶
这些更改改进了断言失败时 pytest 打印的差异显示。 请注意,语法高亮显示需要 pygments
包。
#11520: 非常详细的 (
-vv
) 差异输出现在以差异显示的颜色显示,而不是一大块红色。错误报告中的 Python 代码现在以 Python 语法高亮显示。
错误报告中的各个部分现在分隔得更好。
#1531: 改进了每个标准库容器类型的非常详细的差异显示 (
-vv
)。 缩进现在是一致的,标记位于它们自己的单独行上,这应该会减少向用户显示的差异。以前,标准 Python 漂亮打印机用于生成输出,除了没有一致的缩进外,它还将开始和结束标记放在与第一个/最后一个条目相同的行上。
#10617: 为除相等
==
之外的比较添加了更全面的集合断言重写,以下操作现在提供更好的失败消息:!=
、<=
、>=
、<
和>
。
断言详细程度的单独控制¶
#11387: 添加了新的
verbosity_assertions
配置选项,用于对失败断言的详细程度进行细粒度控制。如果您曾经希望 pytest 始终向您显示完整差异,但又不想使其他所有内容都变得冗长,那么这就是为您准备的。
有关更多详细信息,请参阅 细粒度详细程度。
对于插件作者,可以使用
config.get_verbosity
来检索特定详细程度类型的详细程度级别。
对异常组和 __notes__
的附加支持¶
这些更改改进了 pytest 对异常组的支持。
#10441: 添加了
ExceptionInfo.group_contains()
,一个断言辅助函数,用于测试ExceptionGroup
是否包含匹配的异常。有关示例,请参阅 匹配异常组。
#11227: 允许
pytest.raises()
match
参数与PEP-678 <https://peps.pythonlang.cn/pep-0678/>
__notes__
进行匹配。
自定义目录收集器¶
#7777: 添加了一个新的钩子
pytest_collect_directory
,它由文件系统遍历收集器节点(例如pytest.Session
、pytest.Dir
和pytest.Package
)调用,以为子目录创建收集器节点。 它应返回pytest.Directory
的子类。 此钩子允许插件自定义目录的收集。
“新型”钩子包装器¶
#11122: pytest 现在在内部使用“新型”钩子包装器,自 pluggy 1.2.0 起可用。 有关详细信息,请参阅 pluggy 1.2.0 的更新日志 和 更新的文档。
如果插件需要
pytest>=8
,则可以使用新型包装器。
其他改进¶
#11216: 如果测试是从 xunit setup fixture 内部跳过的,则测试摘要现在显示测试位置而不是 fixture 位置。
#11314: 使用
--log-file
选项记录到文件将使用--log-level
、--log-format
和--log-date-format
作为后备,如果未分别提供--log-file-level
、--log-file-format
和--log-file-date-format
。#11610: 添加了
LogCaptureFixture.filtering()
上下文管理器,它将给定的logging.Filter
对象添加到caplog
fixture。#11447:
pytest.deprecated_call()
现在也考虑FutureWarning
类型的警告。#11600: 改进了
pytest.mark.xfail
的condition
参数的文档和类型签名,以使用False
作为默认值。#7469:
FixtureDef
现在作为pytest.FixtureDef
导出,用于类型提示。#11353: 为
PytestPluginManager
添加了类型提示。
Bug 修复¶
#10701:
pytest.WarningsRecorder.pop()
将返回列表中最接近匹配的警告,而不是作为请求类型的实例的第一个警告。#11255: 修复了在没有包存在的情况下
parametrize(..., scope="package")
上的崩溃问题。#11277: 修复了一个错误,即当间接参数有多个 fixture 时,为参数集选择了最高作用域 fixture 的作用域,而不是作用域最窄的 fixture 的作用域。
#11456: 参数化测试现在真正确保给每个输入的 id 是唯一的 - 例如,
a、 a、 a0
现在会产生a1、 a2、 a0
,而不是之前的(有 bug 的)a0、 a1、 a0
。 这必然意味着更改以前冲突的 nodeid,并且为了可读性,当非唯一 id 以数字结尾时添加下划线。#11563: 修复了多次使用空字符串作为同一参数化值时发生的崩溃。
#11712: 修复了处理
NO_COLOR
和FORCE_COLOR
以忽略空值的问题。#9036:
pytest.warns
和类似函数现在在with
块内引发异常时捕获警告。
改进的文档¶
琐碎/内部更改¶
#11208: (内部)
FixtureDef.cached_result
类型已更改。 现在,第三项cached_result[2]
(如果设置)是异常实例,而不是异常三元组。#11218: (此条目旨在帮助访问私有 pytest 内部组件以实例化
FixtureRequest
对象的插件。)FixtureRequest
现在是一个抽象类,不能直接实例化。 为测试函数中的request
fixture 添加了一个新的具体TopRequest
FixtureRequest
子类,作为 fixture 函数中request
fixture 的现有SubRequest
子类的对应物。#11315:
pytester
fixture 现在使用monkeypatch
fixture 来管理当前工作目录。 如果您将pytester
与monkeypatch.undo()
结合使用,则 CWD 可能会被恢复。 请改用monkeypatch.context()
。#11333: 更正了
Config.ArgsSource.INVOCATION_DIR
的拼写。 之前的拼写INCOVATION_DIR
仍然作为别名保留。#11638: 修复了当在调用环境中设置了
FORCE_COLOR
、NO_COLOR
或PY_COLORS
时,自测无法正确通过的问题。
pytest 7.4.4 (2023-12-31)¶
Bug 修复¶
#11140: 修复了在 Python >=3.8 上,文件顶部的非字符串常量被检测为文档字符串的问题。
#11572: 处理
sys.stderr
和sys.__stderr__
在 故障处理程序 关闭时可能已关闭的边缘情况。#11710: 修复了来自收集错误的追溯未被修剪的问题。
#7966: 从断言重写机制中删除了当在
__iter__
方法中引发异常时无益的错误消息。 现在它们被视为不可迭代。
改进的文档¶
#11091: 更新了文档以引用连字符选项:将
--junitxml
替换为--junit-xml
,将--collectonly
替换为--collect-only
。
pytest 7.4.3 (2023-10-24)¶
Bug 修复¶
#10447: 现在以相反的 mro 顺序考虑标记,以确保首先考虑基类标记 – 这解决了回归问题。
#11239: 修复了断言中的
:=
影响不相关测试用例的问题。#11439: 处理了一个边缘情况,即当 故障处理程序 正在关闭时,
sys.stderr
可能已被关闭。
pytest 7.4.2 (2023-09-07)¶
Bug 修复¶
改进文档¶
#11391: 改进了 pytest 插件参考页面上的免责声明,以更好地表明这是一个自动的、非人工管理的列表。
pytest 7.4.1 (2023-09-02)¶
Bug 修复¶
#10337: 修复了由
--import-mode=importlib
生成的伪中间模块不会将子模块包含为父模块属性的错误。#10702: 修复了在比较字典时,
None
是预期值或接收值的情况下,pytest.approx()
中的错误断言处理。#10811: 修复了将
--import-mode=importlib
与--doctest-modules
一起使用时,导致模块被多次导入的问题,从而导致具有导入副作用的模块出现问题。
pytest 7.4.0 (2023-06-23)¶
新特性¶
#10901: 添加了
ExceptionInfo.from_exception()
,一种更简单的方法,用于从异常创建ExceptionInfo
。这可以替代大多数情况下的ExceptionInfo.from_exc_info()
。
改进¶
#10872: 将测试日志报告注解更新为命名元组,并修复了
pytest_report_teststatus
hook 文档中的不一致性。#10907: 当要显示的异常回溯被完全过滤掉时(通过诸如
__tracebackhide__
、内部帧和类似机制),现在仅显示异常字符串和以下消息“所有回溯条目均已隐藏。传递
--full-trace
以查看隐藏的和内部的帧。”。以前,即使回溯的最后一帧被隐藏,也会显示出来。
#10940: 改进了
skip
和xfail
原因的详细输出 (-vv
),通过执行文本换行,同时为进度输出留出清晰的边距。添加了
TerminalReporter.wrap_write()
作为辅助方法。#10991: 添加了对
%f
指令的处理,以在日志格式选项(例如log-date-format
)中打印微秒。#11005: 将底层异常添加到缓存提供程序的路径创建和写入警告消息中。
#11013: 当设置了
testpaths
,但 glob 找不到路径时,添加警告。在这种情况下,pytest 将回退到从当前目录搜索。#11043: 当未指定
--confcutdir
且不存在配置文件时,conftest 截止目录 (--confcutdir
) 现在设置为 rootdir。以前在这些情况下,conftest.py
文件将被探测到文件系统的根目录。如果您受到此更改的严重影响,请考虑在您期望的截止目录中添加一个空配置文件,或显式设置--confcutdir
。#11081:
norecursedirs
检查现在在pytest_ignore_collect
实现中执行,因此插件可以影响它。如果在更新到此版本后,您发现您的
norecursedirs
设置未被遵守,则意味着您使用的 conftest 或插件具有错误的pytest_ignore_collect
实现。最有可能的是,您的 hook 为它不想忽略的路径返回False
,这结束了处理,并且不允许包括 pytest 本身在内的其他插件忽略该路径。修复方法是为您不想忽略的路径返回None
而不是False
。#8711:
caplog.set_level()
和caplog.at_level()
将临时启用请求的level
,如果level
已通过logging.disable(LEVEL)
全局禁用。
Bug 修复¶
#10831: 终端报告:修复了在
--tb=line
模式下运行时,pytest.fail(pytrace=False)
测试报告None
的错误。#11068: 修复了
--last-failed
针对 非 Python 测试文件 的全文件跳过功能(“跳过了 N 个文件”)。#11104: 修复了 pytest 7.3.2 中的回归,该回归导致即使
testpaths
未被使用(例如,当在命令行上给出显式路径时),也会考虑加载初始 conftest。现在,只有当testpaths
正在使用时才会被考虑。#1904: 修复了用
__tracebackhide__ = True
隐藏的回溯条目仍然显示用于链式异常(“... the above exception …” 消息之后的部分)的问题。#7781: 修复了使用
--debug
时,将非可编码文本写入日志文件的问题。
改进文档¶
#9146: 改进了
caplog.set_level()
的文档。
琐碎/内部更改¶
#11031: 增强了
-c
的 CLI 标志,现在包括--config-file
,以明确此标志适用于自定义配置文件的使用。
pytest 7.3.2 (2023-06-10)¶
Bug 修复¶
#10169: 修复了非常长的选项名称可能导致 pytest 在某些系统上因
OSError: [Errno 36] File name too long
而崩溃的错误。#10894: 支持 Python 3.12(在编写时为 beta 版)。
#10999:
monkeypatch
setitem
/delitem
类型注解现在允许TypedDict
参数。#11028: 修复了断言重写中的错误,其中使用海象运算符赋值的变量不能在后面的函数调用中使用。
#11054: 修复了
--last-failed
的针对包(带有__init__.py
文件的目录)内部文件的“(skipped N files)”功能。
pytest 7.3.1 (2023-04-14)¶
改进¶
Bug 修复¶
#10896: 修复了与
tmp_path
和新的tmp_path_retention_policy
选项相关的性能回归。#10903: 修复了当显示所有条目都被隐藏的异常时发生的崩溃
INTERNALERROR IndexError: list index out of range
。这回退了版本 7.3.0 中引入的更改 “正确处理链式异常的__tracebackhide__
。”。
pytest 7.3.0 (2023-04-08)¶
新特性¶
#10525: 用
@classmethod
装饰的测试方法现在可以像普通方法一样被发现为测试。这填补了静态方法可被发现为测试但类方法不可被发现的空白。#10755:
console_output_style
现在支持progress-even-when-capture-no
,以强制使用进度输出,即使捕获被禁用。这在捕获可能对性能产生重大影响的大型测试套件中很有用。#7431: 添加了
--log-disable
CLI 选项以禁用单个记录器。#8141: 添加了
tmp_path_retention_count
和tmp_path_retention_policy
配置选项,以控制由tmp_path
fixture 创建的目录的保留方式。
改进¶
#10226: 如果在 teardown 中引发多个错误,我们现在重新引发它们的
ExceptionGroup
,而不是丢弃除最后一个之外的所有错误。#10658: 允许
-p
参数包含空格(例如:-p no:logging
而不是-pno:logging
)。在配置文件的addopts
部分中尤其有用。#10710: 将
start
和stop
时间戳添加到TestReport
对象。#10727: 拆分了
rootdir
、config file
和testpaths
的报告标头,以便每个都有自己的行。#10840: pytest 不应再因具有病态位置属性的 AST 而崩溃,例如测试由
Hylang <https://github.com/hylang/hy>__
生成的 AST。#6267: 如果截断消息比隐藏文本长,则不再截断测试的完整输出。显示的行号也已修复。
Bug 修复¶
改进文档¶
琐碎/内部更改¶
pytest 7.2.2 (2023-03-03)¶
Bug 修复¶
#10533: 修复了
pytest.approx()
对包含一个或多个0.0
值的字典的处理。#10592: 修复了同时传递
--cache-show
和--help
时发生的崩溃。#10597: 修复了名为
teardown
的 fixture 方法会作为nose
teardown 阶段的一部分被调用的错误。#10626: 修复了同时传递
--fixtures
和--help
时发生的崩溃。#10660: 修复了
pytest.raises()
以返回 ‘ContextManager’,以便类型检查器可以将pytest.raises(...) if ... else nullcontext()
缩小到 ‘ContextManager’ 而不是 ‘object’。
改进文档¶
pytest 7.2.1 (2023-01-13)¶
Bug 修复¶
pytest 7.2.0 (2022-10-23)¶
弃用¶
#10012: 将
pytest.PytestUnhandledCoroutineWarning
更新为弃用;它将在 pytest 8 中引发错误。#10396: pytest 不再依赖于
py
库。pytest
提供了一个 vendored 副本的py.error
和py.path
模块,但如果安装了py
库,则将使用它。如果您需要其他py.*
模块,请继续单独安装已弃用的py
库,否则通常可以将其作为依赖项删除。#4562: 弃用使用属性/标记配置 hook specs/impls。
请改用
pytest.hookimpl()
和pytest.hookspec()
。有关更多详细信息,请参阅 文档。#9886: 运行为
nose
编写的测试的功能已正式弃用。这包括
纯
setup
和teardown
函数和方法:这可能会让用户感到惊讶,因为setup()
和teardown()
不是 pytest 惯用语,而是nose
支持的一部分。使用 @with_setup 装饰器的 Setup/teardown。
有关更多详细信息,请查阅 弃用文档。
#7337: 如果测试函数返回除
None
以外的其他内容,则现在会发出弃用警告。这可以防止初学者常犯的错误,他们期望返回bool
(例如return foo(a, b) == result
)会导致测试通过或失败,而不是使用assert
。计划是将从测试返回非None
的值在未来变为错误。
新特性¶
#9897: 向
testpaths
添加了 shell 样式的通配符支持。
改进¶
#10218:
@pytest.mark.parametrize()
(和类似函数) 现在接受任何Sequence[str]
作为参数名称,而不仅仅是list[str]
和tuple[str, ...]
。(请注意,
str
本身就是一个Sequence[str]
,仍然像以前一样被视为逗号分隔的名称列表)。#10381: 添加了
--no-showlocals
标志。这可以直接传递给测试,以覆盖通过addopts
声明的--showlocals
。#3426: NFC 和 NFD 形式的字符串断言失败,这些字符串规范化为相同的字符串,现在有一个专门的错误消息详细说明该问题,并且它们的 utf-8 表示形式被表达出来。
#8508: 引入多行显示,以便通过
pytest.warns()
进行警告匹配,并增强pytest.ExceptionInfo.match()
的匹配比较(由pytest.raises()
返回)。#8646: 改进了
pytest.raises()
。之前,传递一个空元组会给出令人困惑的错误。现在我们会立即抛出一个更有帮助的消息。#9741: 在 Python 3.11 上,使用标准库的
tomllib
来解析 TOML。tomli
在 Python 3.11 上不再是依赖项。#9742: 使用
-vv
显示不带转义换行符的断言消息。#9823: 改进了当找不到给定文件的收集器时显示的错误消息。
#9873: 为简短的测试摘要添加了一些颜色。
#9883: 规范化所有命令行选项的帮助描述。
#9920: 在 CI 环境中运行时,在
short test summary info
中显示完整的崩溃消息。#9987: 添加了对隐藏配置文件的支持,允许使用
.pytest.ini
作为pytest.ini
的替代方案。
Bug 修复¶
#10382: 当
raise unittest.SkipTest()
出现在文件的顶层时,不要中断进入 pdb。#7792: 现在根据测试类中的完整 MRO 继承标记。以前,如果一个测试类从两个或多个类继承,则只应用来自第一个超类的标记。
当从超类继承标记时,现在子类的标记在 MRO 顺序中排在超类的标记之前。以前是相反的。
当从超类继承标记时,子类的
pytestmark
属性现在只包含直接应用于它的标记。以前,它也包含来自其超类的标记。请注意,通常不应直接访问此属性;请改用Node.iter_markers
。#9159: 通过强制原生显示
ExceptionGroups
中的内部异常,即使在使用--tb=native
以外的显示选项时也是如此。这是在为ExceptionGroups
中的内部异常完全实现 pytest-native 显示之前的临时步骤。#9877: 确保
caplog.get_records(when)
在调用caplog.clear()
后返回当前/正确的数据。
改进的文档¶
#10344: 更新关于编写插件的信息,以使用
pyproject.toml
而不是setup.py
。#9248: 文档现在使用 Sphinx 5.x 构建(之前为 3.x)。
#9291: 更新关于
pytest.warns()
如何影响DeprecationWarning
的文档。
琐碎/内部更改¶
#10313: 使
_pytest.doctest.DoctestItem
导出pytest.DoctestItem
以用于类型检查和运行时目的。使_pytest.doctest
使用内部 API 以避免循环导入。#9906: 使
_pytest.compat
在类型检查器眼中重新导出importlib_metadata
。#9910: 修复
cacheprovider
中的默认编码警告 (EncodingWarning
)#9984: 改进了当我们尝试访问已被拆卸的 fixture 时出现的错误消息。在 docstring 中添加了一个额外的句子,解释何时不应该调用
getfixturevalue
。
pytest 7.1.3 (2022-08-31)¶
Bug 修复¶
#10060: 当使用
--pdb
运行时,对于通过unittest.skip
或pytest.mark.skip
跳过 *class* 的测试,不再调用TestCase.tearDown
。#10190: JUnit XML 报告现在正确转义 setup 或 teardown 错误消息中的无效 XML 字符。
#3396: Doctest 现在遵循
--import-mode
标志。#9514: 将
FixtureRequest.param
类型注解为Any
,作为在 #8073 修复之前的权宜之计。#9791: 修复了
rewrite.py
中的路径处理代码,该代码似乎工作正常,但实际上不正确,并且在某些系统中会失败。#9917: 修复了当用于比较元组时
pytest.approx()
的字符串表示。
改进的文档¶
琐碎/内部更改¶
#10114: 在 windows 上用
os.replace
替换 atomicwrites 依赖项。
pytest 7.1.2 (2022-04-23)¶
Bug 修复¶
#9726: 移除
pytest.approx()
内部不必要的numpy
导入。#9820: 修复了
dataclasses
与InitVar
的比较。#9869: 增加
NODE_CTOR_FSPATH_ARG
弃用警告的stacklevel
,以指向用户的代码,而不是 pytest。#9871: 修复了一个奇怪的(幸运的是很少见的)错误,其中
temp_path
fixture 在尝试获取当前用户的用户名时可能会引发内部错误。
pytest 7.1.1 (2022-03-17)¶
Bug 修复¶
#9767: 修复了 pytest 7.1.0 中的回归,其中没有拾取源树之外(例如,在
site-packages
目录中)的一些 conftest.py 文件。
pytest 7.1.0 (2022-03-13)¶
重大更改¶
改进¶
#5192: 修复了某些数据类型的测试输出,其中
-v
会显示较少的信息。此外,当显示序列的差异时,
-q
会产生完整的差异,而不是预期的差异。#9362: 当检测到默认的
__eq__
在attrs
或dataclasses
中被覆盖时,pytest 现在会避免专门的断言格式化。#9536: 当在命令行中给出
-vv
时,以完整形式显示跳过和 xfail 原因,而不是截断它们以适应终端宽度。#9644: 现在可以通过启用
tracemalloc
来获得更多关于导致 Python 引发ResourceWarning
的资源位置的信息。有关更多信息,请参见 资源警告。
#9678: 现在
@pytest.mark.parametrize
的ids
参数中接受更多类型。以前只接受str
、float
、int
和bool
;现在也接受bytes
、complex
、re.Pattern
、Enum
以及任何具有__name__
的类型。#9692: 当给定无序序列(例如
set
)时,pytest.approx()
现在会引发TypeError
。请注意,这意味着不再支持仅实现
__iter__
和__len__
的自定义类,因为它们不保证顺序。
Bug 修复¶
#8242: 撤销了弃用在 pytest 收集阶段引发
unittest.SkipTest
以跳过测试收集的行为 - 这现在再次是受支持的功能。#9493: 符号链接组件不再在 conftest 路径中解析。这意味着如果 conftest 在收集树中出现两次(使用符号链接),它将被执行两次。例如,给定
tests/real/conftest.py tests/real/test_it.py tests/link -> tests/real
运行
pytest tests
现在导入 conftest 两次,一次作为tests/real/conftest.py
,另一次作为tests/link/conftest.py
。这是一个修复程序,用于匹配 pytest 6.0 中对测试收集本身进行的类似更改(有关详细信息,请参阅 #6523)。#9626: 修复了当收集时存在错误或跳过模块时,终端收集摘要上选定测试的计数。
如果在收集时存在错误或跳过模块,pytest 会错误地从选定计数中减去这些模块。
#9645: 修复了回归,其中
--import-mode=importlib
与PYTHONPATH
或pythonpath
一起使用会导致测试套件中出现导入错误。#9708:
pytester
现在请求monkeypatch
fixture 而不是在内部创建一个。这解决了涉及 pytest 环境变量的一些问题。#9730: 格式错误的
pyproject.toml
文件现在会生成更清晰的错误消息。
pytest 7.0.1 (2022-02-11)¶
Bug 修复¶
#9608: 修复了 Python 3.9 中
importlib.readers
的无效导入。#9610: 恢复
UnitTestFunction.obj
以返回 unbound 方法而不是 bound 方法。修复了在具有非默认__init__
的 unittest TestCases 中,失败的 teardown 期间发生的崩溃。在 pytest 7.0.0 中回归。#9636:
pythonpath
插件已重命名为python_path
。这避免了与pytest-pythonpath
插件的冲突。#9642: 修复了在 parametrize 部分使用
::
按 id 运行测试。#9643: 延迟发布关于涉及
Item
和Collector
的菱形继承的PytestWarning
,以便可以使用 标准警告过滤器 对其进行过滤。
pytest 7.0.0 (2022-02-03)¶
(**请参阅此版本的所有更改,也在下面的 7.0.0rc1 注释中**)
弃用¶
#9488: 如果像
pytest.Item
这样的节点的自定义子类覆盖了__init__
方法,则它们应接受**kwargs
。有关详细信息,请参见 自定义 Node 子类的构造函数应接受 **kwargs。请注意,仅当 pytest 预期传递的参数发生冲突时,才会发出弃用警告。此弃用警告已是 pytest 7.0.0rc1 的一部分,但未记录在文档中。
Bug 修复¶
#9355: 修复了错误消息在 Python 3.8 及更高版本中使用 assert 时打印函数装饰器的问题。
#9396: 确保
pytest.Config.inifile
在pytest_cmdline_main
hook 期间可用(7.0.0rc1
期间的回归)。
改进的文档¶
琐碎/内部更改¶
#9521: 添加了对断言重写路径的测试覆盖率。
pytest 7.0.0rc1 (2021-12-06)¶
重大更改¶
#7259: Node.reportinfo() 函数的第一个返回值类型已从
py.path.local | str
扩展为os.PathLike[str] | str
。大多数引用
reportinfo()
的插件仅将其定义为自定义pytest.Item
实现的一部分。由于py.path.local
是os.PathLike[str]
,因此这些插件不受影响。调用
reportinfo()
、使用第一个返回值并将其作为py.path.local
进行交互的插件和用户,需要通过调用py.path.local(fspath)
进行调整。尽管最好是避免使用旧的py.path.local
,而使用pathlib.Path
,或改用item.location
或item.path
。注意:pytest 无法为此更改提供弃用期。
#8246:
--version
现在将版本信息写入stdout
而不是stderr
。#8733: 删除了使 pyreadline 与
--pdb
一起工作的解决方法。该解决方法在 2015 年的 #1281 中引入,但是从那时起,pyreadline 似乎已无人维护,生成警告,并且将在 Python 3.10 上停止工作。
#9061: 在布尔上下文中使用
pytest.approx()
现在会引发错误,提示正确的用法。用户显然经常错误地像这样使用
pytest.approx
assert pytest.approx(actual, expected)
而正确的用法是
assert actual == pytest.approx(expected)
新的错误消息有助于捕获这些错误。
#9277:
pytest.Instance
收集器类型已被删除。导入pytest.Instance
或_pytest.python.Instance
返回一个虚拟类型并发出弃用警告。有关详细信息,请参见 pytest.Instance 收集器。#9308: **PytestRemovedIn7Warning 弃用警告现在默认情况下是错误。**
按照我们尽可能减少中断地删除已弃用功能的计划,所有类型为
PytestRemovedIn7Warning
的警告现在默认情况下会生成错误而不是警告消息。**受影响的功能将在 pytest 7.1 中有效删除**,因此请查阅文档中的 弃用和移除 部分,以获取有关如何更新现有代码的说明。
在 pytest
7.0.X
系列中,可以通过将此添加到您的pytest.ini
文件中,将错误更改回警告作为权宜之计[pytest] filterwarnings = ignore::pytest.PytestRemovedIn7Warning
但这将在 pytest
7.1
发布时停止工作。**如果您对删除特定功能有疑虑**,请在 #9308 中添加评论。
弃用¶
#7259: 钩子的
py.path.local
参数已被弃用。有关完整详细信息,请参见 弃用说明。py.path.local
参数到 Node 构造函数已被弃用。有关完整详细信息,请参见 弃用说明。#7469: 直接构造以下类现在已弃用
_pytest.mark.structures.Mark
_pytest.mark.structures.MarkDecorator
_pytest.mark.structures.MarkGenerator
_pytest.python.Metafunc
_pytest.runner.CallInfo
_pytest._code.ExceptionInfo
_pytest.config.argparsing.Parser
_pytest.config.argparsing.OptionGroup
_pytest.pytester.HookRecorder
这些构造函数一直被认为是私有的,但现在发出弃用警告,这可能在 pytest 8 中变为硬错误。
#8242: 弃用在 pytest 收集阶段引发
unittest.SkipTest
以跳过测试收集。请改用pytest.skip()
。注意:此弃用仅与在测试收集期间使用
unittest.SkipTest
有关。您可能没有这样做。完全支持在 unittest 测试用例中正常使用unittest.SkipTest
/unittest.TestCase.skipTest()
/unittest.skip()
。注意
此弃用已在 pytest 7.1.0 中撤销。
#8315:
Parser.addoption
的几种行为现在计划在 pytest 8 中删除(自 pytest 2.4.0 起已弃用)parser.addoption(..., help=".. %default ..")
- 请改用%(default)s
。parser.addoption(..., type="int/string/float/complex")
- 请改用type=int
等。
#8447: 定义既是
Item
又是Collector
的自定义 pytest 节点类型(例如File
)现在会发出警告。它从未得到合理的支持,并且会触发难以调试的错误。有关完整详细信息,请参见 弃用说明。
#8592:
pytest_cmdline_preparse
已正式弃用。它将在未来的版本中删除。请改用pytest_load_initial_conftests
。有关完整详细信息,请参见 弃用说明。
#8645:
pytest.warns(None)
现已弃用,因为许多人使用它来表示“此代码不发出警告”,但它实际上具有检查代码是否发出至少一个任何类型的警告的效果,例如pytest.warns()
或pytest.warns(Warning)
。#8948:
pytest.skip(msg=...)
,pytest.fail(msg=...)
和pytest.exit(msg=...)
签名现在接受reason
参数而不是msg
。使用msg
仍然有效,但已弃用,并将在未来的版本中移除。此更改是为了与
pytest.mark.skip
和pytest.mark.xfail
保持一致,它们都接受reason
作为参数。#8174: 以下更改已应用于可通过
pytest.ExceptionInfo.traceback
访问的类型_pytest.code.Code
的path
属性返回Path
而不是py.path.local
。_pytest.code.TracebackEntry
的path
属性返回Path
而不是py.path.local
。
此更改没有弃用期(抱歉!)。
功能¶
#5196: 现在在更多情况下,测试按照定义顺序排序。
在类层次结构中,基类中的测试现在始终在其子类上定义的测试之前排序(反向 MRO 顺序)。
#7132: 添加了两个环境变量
PYTEST_THEME
和PYTEST_THEME_MODE
,以允许用户自定义使用的 pygments 主题。#7259: 添加了
cache.mkdir()
,它类似于现有的cache.makedir()
,但返回pathlib.Path
而不是旧的py.path.local
。为
parser.addini()
添加了paths
类型,例如parser.addini("mypaths", "my paths", type="paths")
,它类似于现有的pathlist
,但返回pathlib.Path
列表而不是旧的py.path.local
。#7469: pytest API 中使用的对象类型现在已导出,因此可以在类型注解中使用它们。
新导出的类型包括
pytest.Config
用于Config
。pytest.Mark
用于marks
。pytest.MarkDecorator
用于mark decorators
。pytest.MarkGenerator
用于pytest.mark
单例。pytest.Metafunc
用于metafunc
参数,该参数传递给pytest_generate_tests
钩子。pytest.CallInfo
用于传递给各种钩子的CallInfo
类型。pytest.PytestPluginManager
用于PytestPluginManager
。pytest.ExceptionInfo
用于从pytest.raises()
返回并传递给各种钩子的ExceptionInfo
类型。pytest.Parser
用于传递给pytest_addoption
钩子的Parser
类型。pytest.OptionGroup
用于从parser.addgroup
方法返回的OptionGroup
类型。pytest.HookRecorder
用于从Pytester
返回的HookRecorder
类型。pytest.RecordedHookCall
用于从HookRecorder
返回的RecordedHookCall
类型。pytest.LineMatcher
用于RunResult
等中使用的LineMatcher
类型。pytest.TestReport
用于各种钩子中的TestReport
类型。pytest.CollectReport
用于各种钩子中的CollectReport
类型。
大多数类型的直接构造不受支持;它们仅用于类型注解。这样做将发出弃用警告,并且可能在 pytest 8.0 中变为硬错误。
也不支持子类化它们。目前在运行时不强制执行此操作,但会被诸如 mypy 之类的类型检查器检测到。
#7856: –import-mode=importlib 现在可以与依赖于
sys.modules
上的模块的功能一起使用,例如pickle
和dataclasses
。#8144: 以下钩子现在接收一个额外的
pathlib.Path
参数,等同于现有的py.path.local
参数pytest_ignore_collect
-collection_path
参数(等同于现有的path
参数)。pytest_collect_file
-file_path
参数(等同于现有的path
参数)。pytest_pycollect_makemodule
-module_path
参数(等同于现有的path
参数)。pytest_report_header
-start_path
参数(等同于现有的startdir
参数)。pytest_report_collectionfinish
-start_path
参数(等同于现有的startdir
参数)。
#8251: 将
Node.path
实现为pathlib.Path
。无论path
还是fspath
(已弃用)是否传递给构造函数,旧的fspath
和这个新属性都会被设置。它是fspath
属性的替代品(它表示与py.path.local
相同的路径)。虽然由于像reportinfo()
这样的方法的持续迁移,fspath
尚未弃用,但我们预计在未来的版本中会弃用它。#8421:
pytest.approx()
现在可以在映射/字典和序列/列表中的Decimal
上工作。#8606: 带有
--fixtures-per-test
和--fixtures
的 pytest 调用已得到丰富,包含:夹具位置路径与夹具名称一起打印。
夹具文档字符串的第一部分在夹具名称下打印。
使用
--verbose
选项在夹具名称下打印夹具文档字符串的全部内容。
#8761: 新的 pytest.version_tuple 属性,使用户可以更轻松地执行取决于 pytest 版本的操作(例如声明在更高版本中引入的钩子)。
#8789: 将 TOML 解析器从
toml
切换到tomli
,以支持pyproject.toml
中的 TOML v1.0.0。#8920: 添加了
pytest.Stash
,这是一种用于插件将其数据以类型安全且无冲突的方式存储在Config
和Node
上的工具。有关详细信息,请参阅 在钩子函数之间存储项目数据。#8953:
RunResult
方法assert_outcomes()
现在接受warnings
参数来断言捕获的警告总数。#8954:
--debug
标志现在接受一个str
文件来路由调试日志,仍然默认为pytestdebug.log
。#9023: 现在,当在环境中找到
CI
或BUILD_NUMBER
时,即使未使用-v
,也会始终显示可迭代对象的相等性断言的完整差异。#9113:
RunResult
方法assert_outcomes()
现在接受deselected
参数来断言取消选择的测试总数。#9114: 添加了
pythonpath
设置,该设置在测试会话期间将列出的路径添加到sys.path
。如果您目前使用 pytest-pythonpath 或 pytest-srcpaths 插件,您应该能够用内置的pythonpath
设置替换它们。
改进¶
#7480: 计划在主要版本 X(例如 pytest 7、8、9 等)中删除的弃用现在使用警告类别
PytestRemovedInXWarning
,它是PytestDeprecationWarning
的子类,而不是直接使用PytestDeprecationWarning
。有关更多详细信息,请参阅 向后兼容性策略。
#7864: 改进了解析警告过滤器时的错误消息。
以前,pytest 会显示内部回溯,这除了丑陋之外,有时还会隐藏问题的原因(例如,导入特定警告类型时的
ImportError
)。#8335: 改进了数字序列的
pytest.approx()
断言消息。断言消息现在转储一个表格,其中包含每个差异的索引和错误。例子:
> assert [1, 2, 3, 4] == pytest.approx([1, 3, 3, 5]) E assert comparison failed for 2 values: E Index | Obtained | Expected E 1 | 2 | 3 +- 3.0e-06 E 3 | 4 | 5 +- 5.0e-06
#8403: 默认情况下,pytest 将截断断言错误中的长字符串,使其不会过度干扰输出,当前默认截断为
240
个字符。但是,在某些情况下,更长的输出有助于甚至对于诊断失败至关重要。使用
-v
现在会将截断阈值增加到2400
个字符,而-vv
或更高版本将完全禁用截断。#8509: 修复了自 pytest 6.2.0 以来,当测试名称中包含
/
时,unittest.TestCase.setUpClass()
未被调用的问题。这指的是 pytest 节点 ID 中的路径部分,例如节点 ID
tests/test_file.py::TestClass::test_it
中的TestClass::test_it
。现在,不是假设测试名称不包含
/
,而是假设测试路径不包含::
。我们计划在未来希望使这两者都工作。#8803: 现在可以为 CLI 日志上的自定义日志级别添加颜色。
通过使用
pytest_configure
钩子中的add_color_level
,可以添加颜色logging_plugin = config.pluginmanager.get_plugin('logging-plugin') logging_plugin.log_cli_handler.formatter.add_color_level(logging.INFO, 'cyan') logging_plugin.log_cli_handler.formatter.add_color_level(logging.SPAM, 'blue')
有关更多信息,请参阅 自定义颜色。
#8822: 在
--fixtures
或--fixtures-by-test
中显示夹具路径时,来自 pytest 本身的夹具现在显示省略路径,而不是site-packages
目录中文件的完整路径。#8898: 在生成参数化 ID 时,复数现在像浮点数和整数一样处理。
#9062:
--stepwise-skip
现在隐式启用--stepwise
,并且可以单独使用。#9205:
pytest.Cache.set()
现在在保存字典时保留键顺序。
Bug 修复¶
#7124: 修复了在提供
--doctest-modules
时,__main__.py
会引发ImportError
的问题。#8061: 修复了如果
staticmethod
测试用例是从父测试类继承的,则会失败的问题。#8192:
testdir.makefile
现在静默接受不以.
开头的值,以保持与旧版本 pytest 的向后兼容性。pytester.makefile
现在会在ext
参数中缺少.
时发出更清晰的错误。#8258: 修复了如果
faulthandler
模块在 pytest 启动期间(例如使用python -X dev -m pytest
)已经启用,则 pytest 的faulthandler
支持不会在崩溃时转储回溯的问题。#8317: 修复了从
getpass.getuser()
派生的非法目录字符引发OSError
的问题。#8367: 修复
Class.from_parent
,使其将额外的关键字参数转发给构造函数。#8377: 测试选择选项
pytest -k
和pytest -m
现在支持匹配包含正斜杠 (/
) 字符的名称。#8384:
@pytest.mark.skip
装饰器现在可以正确处理其参数。当reason
参数意外地同时以位置参数和关键字参数形式给出时(例如,因为它与skipif
混淆),现在会发生TypeError
。在此之前,此类测试会被静默跳过,并且位置参数被忽略。此外,reason
现在被正确地记录为位置参数或关键字参数(而不是仅关键字参数)。#8394: 为处理经典 setup/teardown 的内部夹具使用私有名称,以便它们不会与默认的
--fixtures
调用一起显示(但它们仍然会与--fixtures -v
一起显示)。#8456: 当安装了插件的预发布版本时,
required_plugins
配置选项现在可以正常工作,而不是错误地声称这些插件根本没有安装。#8464:
-c <config file>
现在也正确地将rootdir
定义为包含<config file>
的目录。#8503: 当未安装
setuptools
时,pytest.MonkeyPatch.syspath_prepend()
不再失败。现在,它仅在之前导入了pkg_resources
时才调用pkg_resources.fixup_namespace_packages
,因为否则不需要它。#8548: 引入修复程序以处理
log-cli-format
中的精度宽度,从而修复某些格式的输出着色。#8796: 修复了跳过 doctest 时的内部错误。
#8983: 测试选择选项
pytest -k
和pytest -m
现在支持匹配包含反斜杠 (\
) 字符的名称。反斜杠被视为字面字符,而不是转义字符(要匹配的值已经转义)。#8990: 修复了
pytest -vv
在某些情况下崩溃并出现内部异常AttributeError: 'str' object has no attribute 'relative_to'
的问题。#9077: 修复了从会话作用域的夹具访问
request.fspath
/request.path
时令人困惑的错误消息。#9163: 现在为重写的断言语句正确设置了结束行号和结束列偏移量。
#9169: 支持重写文件中的
importlib.resources
中的files
API。#9272: nose 兼容性模块级夹具
setup()
和teardown()
现在每个模块仅调用一次,而不是每个测试函数调用一次。即使定义了对象级setup
/teardown
,现在也会调用它们。
改进的文档¶
#4320: 改进了
pytester.copy_example
的文档。#5105: 添加自动生成的 Pytest 插件列表。此列表会定期更新。
#8337: 在
pytest.approx()
文档中推荐 numpy.testing 模块。#8655:
--pdbcls
的帮助文本更准确地反映了该选项的行为。#9210: 移除关于
confcutdir
作为配置选项的不正确文档:它只能通过--confcutdir
命令行选项设置。#9242: 升级 readthedocs 配置以使用
newer Ubuntu version <https://blog.readthedocs.com/new-build-specification/>`__
,从而为 PDF 文档提供更好的 Unicode 支持。#9341: 常用于 处理非 Python 测试 的各种方法现在已在参考文档中正确记录。 之前这些方法未被记录。
琐碎/内部更改¶
#8133: 迁移到
setuptools_scm
6.x 以使用SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST
,从而实现更强大的发布工具。#8174: 以下更改已应用于内部 pytest 类型/函数
_pytest.code.getfslineno()
函数现在返回Path
而不是py.path.local
。_pytest.python.path_matches_patterns()
函数现在接受Path
而不是py.path.local
。_pytest._code.Traceback.cut()
函数现在接受任何os.PathLike[str]
,而不仅仅是py.path.local
。
#8248: 内部重构:让
python.PyObjMixin
继承自nodes.Node
以传递类型信息。#8432: 改进了当在模块级别使用
pytest.skip()
而未传递allow_module_level=True
时的错误消息。#8818: 确保
regendoc
退出TOX_ENV
缓存目录选择,以确保独立的示例测试运行。#8913: 在内部重构之后,私有的
CallSpec2._arg2scopenum
属性已被移除。#8967:
pytest_assertion_pass
不再被认为是实验性的,未来对其的更改将更加谨慎地考虑。#9202: 添加 github action 以将覆盖率报告上传到 codecov,而不是 bash uploader。
#9225: 更改了用于创建 sdist 和 wheel 工件的命令:使用 build 包而不是 setup.py。
#9351: 修正了 doc/en/example/special.rst 中的一些小错误。
pytest 6.2.5 (2021-08-29)¶
琐碎/内部更改¶
pytest 6.2.4 (2021-05-04)¶
Bug 修复¶
#8539: 修复了 Python 3.10 上的断言重写。
pytest 6.2.3 (2021-04-03)¶
Bug 修复¶
#8414: pytest 过去常常在
/tmp
下创建具有全局可读权限的目录。这意味着系统中的任何用户都能够读取测试在临时目录(例如由tmp_path
/tmpdir
fixture 创建的目录)中写入的信息。现在,目录以私有权限创建。pytest 过去常常静默地使用预先存在的
/tmp/pytest-of-<username>
目录,即使该目录由其他用户拥有。这意味着其他用户可以预先创建这样一个目录,并获得对另一个用户的临时目录的控制权。现在,这种情况会导致错误。
pytest 6.2.2 (2021-01-25)¶
Bug 修复¶
pytest 6.2.1 (2020-12-15)¶
Bug 修复¶
#7678: 修复了在主机中编译的文件,稍后从 UNC 挂载路径 (Windows) 加载时,会引发
ImportPathMismatchError
的错误。#8132: 修复了
approx
中的回归:在 6.2.0 版本中,当处理非数字类型时,approx
不再引发TypeError
,而是回退到正常比较。在 6.2.0 版本之前,像 tf.DeviceArray 这样的数组类型会回退到标量情况,并且如果它们只有一个元素,则恰好可以正确地与标量进行比较。在 6.2.0 版本之后,这些类型开始失败,因为它们既没有从标准的 Python 数字层次结构继承,也没有从numpy.ndarray
继承。approx
现在将参数转换为numpy.ndarray
,如果它们公开了数组协议并且不是标量。这会将类数组对象视为 numpy 数组,无论大小如何。
pytest 6.2.0 (2020-12-12)¶
重大更改¶
#7808: pytest 现在仅支持 python3.6+。
弃用¶
#7469: 直接构造/调用以下类/函数现已弃用
_pytest.cacheprovider.Cache
_pytest.cacheprovider.Cache.for_config()
_pytest.cacheprovider.Cache.clear_cache()
_pytest.cacheprovider.Cache.cache_dir_from_config()
_pytest.capture.CaptureFixture
_pytest.fixtures.FixtureRequest
_pytest.fixtures.SubRequest
_pytest.logging.LogCaptureFixture
_pytest.pytester.Pytester
_pytest.pytester.Testdir
_pytest.recwarn.WarningsRecorder
_pytest.recwarn.WarningsChecker
_pytest.tmpdir.TempPathFactory
_pytest.tmpdir.TempdirFactory
这些类/函数一直被认为是私有的,但现在会发出弃用警告,这可能会在 pytest 8.0.0 中变为硬错误。
#7530:
--strict
命令行选项已被弃用,请改用--strict-markers
。我们计划将来可能会重新引入
--strict
,并使其成为所有严格性相关选项(目前为--strict-markers
和--strict-config
,将来可能会引入更多)的包容性标志。#7988:
@pytest.yield_fixture
装饰器/函数现已弃用。请改用pytest.fixture()
。yield_fixture
长期以来一直是fixture
的别名,因此可以安全地搜索/替换。
新特性¶
#5299: 对于 Python>=3.8 上测试中发生的无法引发的异常和未处理的线程异常,pytest 现在会发出警告。 有关更多信息,请参阅 关于无法引发的异常和未处理的线程异常的警告。
#7425: 新的
pytester
fixture,它与testdir
相同,但其方法在适当的时候返回pathlib.Path
而不是py.path.local
。这是在内部使用
pathlib.Path
对象以在未来移除对py
的依赖的举措的一部分。在内部,旧的
pytest.Testdir
现在是Pytester
的一个薄包装器,保留了旧的接口。#7695: 添加了一个新的 hook,
pytest_markeval_namespace
,它应该返回一个字典。此字典将用于扩充可用于评估 skipif/xfail/xpass 标记的“全局”变量。伪代码示例
conftest.py
:def pytest_markeval_namespace(): return {"color": "red"}
test_func.py
:@pytest.mark.skipif("color == 'blue'", reason="Color is not red") def test_func(): assert False
#8006: 现在可以直接使用
pytest.MonkeyPatch()
构造MonkeyPatch
对象,在无法使用monkeypatch
fixture 的情况下。 以前,一些用户从私有的_pytest.monkeypatch.MonkeyPatch
命名空间导入它。此外,
MonkeyPatch.context
现在是一个类方法,可以像with MonkeyPatch.context() as mp: ...
这样使用。 这是直接使用MonkeyPatch
的推荐方法,因为与monkeypatch
fixture 不同,直接创建的实例不会自动undo()
。
改进¶
#1265: 为
LineMatcher
类添加了__str__
实现,该类从pytester.run_pytest().stdout
和类似方法返回。 它返回整个输出,就像现有的str()
方法一样。#2044: 详细模式现在在测试的终端行中,在 “SKIPPED”、“XFAIL” 或 “XPASS” 之后显示测试被跳过的原因。
#7469 内置 pytest fixtures 的类型现在已导出,因此可以在测试函数的类型注释中使用它们。 新导出的类型包括
pytest.FixtureRequest
用于request
fixture。pytest.Cache
用于cache
fixture。pytest.CaptureFixture[bytes]
用于capfdbinary
和capsysbinary
fixtures。pytest.LogCaptureFixture
用于caplog
fixture。pytest.Pytester
用于pytester
fixture。pytest.Testdir
用于testdir
fixture。pytest.TempdirFactory
用于tmpdir_factory
fixture。pytest.TempPathFactory
用于tmp_path_factory
fixture。pytest.MonkeyPatch
用于monkeypatch
fixture。pytest.WarningsRecorder
用于recwarn
fixture。
不支持构造它们(
MonkeyPatch
除外);它们仅用于类型注释。 这样做会发出弃用警告,并且可能会在 pytest 8.0 中变为硬错误。也不支持子类化它们。目前在运行时不强制执行此操作,但会被诸如 mypy 之类的类型检查器检测到。
#7527: 当相同类型的
namedtuple
实例之间的比较失败时,pytest 现在显示不同的字段名称(可能是嵌套的),而不是它们的索引。#7615:
Node.warn
现在允许Warning
的任何子类,而不仅仅是PytestWarning
。#7701: 改进了使用
--collected-only
时的报告。 现在,它将在摘要统计信息中显示收集的测试数量。#7710: 在
pytest.approx()
中对非数字类型使用严格相等比较,而不是引发TypeError
。这是 3.7 之前的未记录行为,但现在已正式成为受支持的功能。
#7938: 新增
--sw-skip
参数,它是--stepwise-skip
的简写。#8023: 将
'node_modules'
添加到norecursedirs
的默认值中。#8032: 现在可以适当地调用
doClassCleanups
(在 Python 3.8 和unittest
模块中引入)。
Bug 修复¶
#4824: 修复了二次行为,并提高了使用 autouse fixtures 和 xunit fixtures 收集项目的性能。
#7758: 修复了一个问题,即使程序包中的某些文件包含失败的测试,也会从
--lf
中丢失。 在 pytest 5.4.0 中回归。#7911: 由
tmp_path
和tmpdir
创建的目录现在在 3 天未修改后被认为是过时的(以前的值为 3 小时),以避免删除仍在长时间运行的测试套件中使用的目录。#7913: 修复了当涉及到
readline
模块时,pytester.spawn
中的崩溃或挂起问题。#7951: 修复了收集测试时递归符号链接的处理。
#7981: 修复了在收集期间未跟踪符号链接目录的问题。 在 pytest 6.1.0 中回归。
#8016: 修复了当使用
pytest --doctest-modules path/to/an/__init__.py
时只收集一个 doctest 的问题。
改进的文档¶
琐碎/内部更改¶
pytest 6.1.2 (2020-10-28)¶
Bug 修复¶
改进的文档¶
#7815: 改进了
pytest._fillfuncargs()
的弃用警告消息。
pytest 6.1.1 (2020-10-03)¶
Bug 修复¶
pytest 6.1.0 (2020-09-26)¶
重大更改¶
#5585: 按照我们的政策,以下在 5.X 系列中已弃用的功能现已移除
FixtureRequest
、Metafunc
和Function
类的funcargnames
只读属性。 请使用fixturenames
属性。@pytest.fixture
不再支持位置参数,请改为通过关键字传递所有参数。现在直接构造
Node
子类会引发错误,请改用from_parent
。junit_family
的默认值已更改为xunit2
。 如果您需要旧格式,请将junit_family=xunit1
添加到您的配置文件中。TerminalReporter
不再具有writer
属性。 插件作者可以使用TerminalReporter
的公共函数,而不是直接访问TerminalWriter
对象。--result-log
选项已被移除。 建议用户改用 pytest-reportlog 插件。
有关更多信息,请查阅文档中的 弃用和移除。
弃用¶
#6981:
pytest.collect
模块已弃用:其所有名称都可以直接从pytest
导入。#7097:
pytest._fillfuncargs
函数已弃用。 保留此函数是为了向后兼容旧版本的插件。它的功能不打算直接使用,但如果您必须替换它,请改用
function._request._fillfixtures()
,但请注意这不是公共 API,并且将来可能会中断。#7210:
-k '-expr'
到-k
的特殊语法已弃用。 请改用-k 'not expr'
。特殊的
-k 'expr:'
到-k
的语法已弃用。 如果您使用此语法并需要替代方案,请提出 issue。#7255:
pytest_warning_captured
hook 已弃用,建议使用pytest_warning_recorded
,并将在未来版本中移除。#7648:
FSCollector
和Package
的gethookproxy()
和isinitpath()
方法已弃用;请改用self.session.gethookproxy()
和self.session.isinitpath()
。 这应该适用于所有 pytest 版本。
新特性¶
#7667: 新的
--durations-min
命令行标志控制包含在--durations
显示的最慢测试列表中的最小持续时间。 以前,这被硬编码为0.005s
。
改进¶
#6681: 在初始化早期阶段发出的内部 pytest 警告现在已得到正确处理,并且可以通过
filterwarnings
或--pythonwarnings/-W
进行过滤。#7572: 当
required_plugins
中列出的插件丢失或将未知配置键与--strict-config
一起使用时,现在会显示简单的错误消息,而不是堆栈跟踪。#7685: 向
Config
添加了两个新属性rootpath
和inipath
。 这些属性是现有rootdir
和inifile
属性的pathlib.Path
版本,应尽可能优先使用它们。#7780: 未设计为被继承的公共类现在被标记为
@final
。从这些类继承的代码将触发类型检查(例如 mypy)错误,但在运行时仍然可以工作。目前final
标识未出现在 API 参考中,但希望将来会添加。
Bug Fixes¶
#1953: 修复了在重写参数化 fixture 的同时,也重用父 fixture 值时发生的错误。
# conftest.py import pytest @pytest.fixture(params=[1, 2]) def foo(request): return request.param # test_foo.py import pytest @pytest.fixture def foo(foo): return foo * 2
#4984: 修复了在收集以装饰器函数开头的模块时,当装饰器引发异常且启用了断言重写时,发生的内部错误崩溃,错误信息为
IndexError: list index out of range
。#7628: 修复了在 Windows 上将不带驱动器号的完整路径传递给 pytest 时(例如
\projects\tests\test.py
而不是c:\projects\tests\pytest.py
)的测试收集问题。#7638: 修复了处理在 Windows 上作为路径出现但触发操作系统级别语法错误的命令行选项的问题,例如
pytest-xdist
内部使用的选项。#7742: 修复了使用错误的
exec
访问 locals / globals 时发生的 INTERNALERROR。
Improved Documentation¶
#1477: 删除了 faq.rst 及其在 contents.rst 中的引用。
Trivial/Internal Changes¶
#7536: 内部
junitxml
插件已重写为使用xml.etree.ElementTree
。XML 元素中属性的顺序可能不同。一些不必要的转义不再执行。#7587: 移除了对
more-itertools
包的依赖。#7631:
capfd.readouterr()
(以及类似的)的结果类型不再是 namedtuple,但在所有方面都应表现得像一个 namedtuple。这样做是出于技术原因。#7671: 在收集测试时,pytest 通过检查 python 对象(模块、类和实例)的属性来查找测试类和函数。为了加速此过程,pytest 现在忽略内置属性(例如
__class__
、__delattr__
和__new__
),而无需查阅python_classes
和python_functions
配置选项,也无需使用pytest_pycollect_makeitem
hook 将它们传递给插件。
pytest 6.0.2 (2020-09-04)¶
Bug Fixes¶
pytest 6.0.1 (2020-07-30)¶
Bug Fixes¶
#7394: 现在接受将空的
help
值传递给Parser.add_option
,而不是在运行pytest --help
时崩溃。传递None
会引发更具信息性的TypeError
。#7558: 修复了 pylint 对
pytest.mark.parametrize()
和其他内置标记的not-callable
lint 警告:skip
,skipif
,xfail
,usefixtures
,filterwarnings
。#7559: 修复了当
TestReport.longrepr
不是字符串时,使用TestReport.longreprtext
的插件(例如pytest-html
)中的回归问题。#7569: 修复了在调用
caplog.set_level()
后,日志捕获处理程序的级别未在拆卸时重置的问题。
pytest 6.0.0 (2020-07-28)¶
(请在下面的 6.0.0rc1 注释中查看此版本的完整更改集)
Breaking Changes¶
#5584: PytestDeprecationWarning 现在默认是错误。
根据我们尽可能减少中断地移除已弃用功能的计划,所有类型为
PytestDeprecationWarning
的警告现在会生成错误,而不是警告消息。受影响的功能将在 pytest 6.1 中有效移除,因此请查阅文档中的 弃用和移除 部分,以获取有关如何更新现有代码的说明。
在 pytest
6.0.X
系列中,可以通过将以下内容添加到您的pytest.ini
文件中,将错误改回警告作为权宜之计[pytest] filterwarnings = ignore::pytest.PytestDeprecationWarning
但这将在 pytest
6.1
发布时停止工作。如果您对移除特定功能有任何疑虑,请在 #5584 中添加评论。
#7472: 移除了
_pytest._code.Frame
的exec_()
和is_true()
方法。
Features¶
#7464: 添加了对
NO_COLOR
和FORCE_COLOR
环境变量的支持,以控制彩色输出。
Improvements¶
#7467:
--log-file
命令行选项和log_file
ini 标记现在会在需要时创建子目录。#7489: 当
match
等于获得的字符串但不是正则表达式匹配时,pytest.raises()
函数具有更清晰的错误消息。在这种情况下,建议转义正则表达式。
Bug Fixes¶
Improved Documentation¶
Trivial/Internal Changes¶
#7389: Fixture 作用域
package
不再被认为是实验性的。
pytest 6.0.0rc1 (2020-07-08)¶
Breaking Changes¶
#1316:
TestReport.longrepr
现在始终是ReprExceptionInfo
的实例。以前,当测试因pytest.fail(..., pytrace=False)
失败时,它是一个str
。#5965: 在收集和匹配带有测试文件路径的
conftest.py
文件期间,不再解析符号链接。在 3.9.0 版本中,引入了解析当前目录的符号链接以及在收集期间解析符号链接的功能,作为错误修复,但实际上这是一个新功能,在 Windows 中造成了不幸的后果,并在其他平台中产生了令人惊讶的结果。
团队决定退回到完全不解析符号链接的状态,并计划在未来使用更可靠的解决方案重新审视此问题(有关详细信息,请参阅 #6523 中的讨论)。
这可能会破坏利用此功能的测试套件;修复方法是为整个测试树创建符号链接,而不仅仅是像以前那样为部分文件/树创建符号链接。
#6505:
Testdir.run().parseoutcomes()
现在始终以复数形式返回解析的名词。最初,
parseoutcomes()
将始终以复数形式返回名词,但旨在通过对单个项目使用单数形式(1 warning
或1 error
)来改进终端摘要的更改,导致了意外的回归,更改了parseoutcomes()
返回的键。现在,API 保证始终返回复数形式,因此像这样的调用
result = testdir.runpytest() result.assert_outcomes(error=1)
需要更改为
result = testdir.runpytest() result.assert_outcomes(errors=1)
#6903: 现在假定
os.dup()
函数存在。我们不知道任何不支持它的受支持 Python 3 实现。#7040:
-k
不再匹配测试会话根目录之外的目录名称。此外,
pytest.Package.name
现在只是包含包的__init__.py
文件的目录名称,而不是完整路径。这与其他节点的命名方式一致,也是-k
将匹配包含测试套件的任何目录的原因之一。#7122: 给定给
-m
和-k
选项的表达式不再使用 Python 的eval()
进行评估。该格式支持or
、and
、not
、括号和通用标识符进行匹配。Python 常量、关键字或其他运算符不再以不同的方式评估。#7135: Pytest 现在使用其自己的
TerminalWriter
类,而不是使用来自py
库的类。插件通常通过TerminalReporter.writer
、TerminalReporter.write()
(和类似方法)或_pytest.config.create_terminal_writer()
访问此类。进行了以下重大更改
输出(
write()
方法和其他方法)不再隐式刷新;尊重底层文件的刷新行为。要显式刷新(例如,如果您希望在打印行尾符之前显示输出),请使用write(flush=True)
或terminal_writer.flush()
。移除了显式的 Windows 控制台支持,委托给 colorama 库。
移除了对写入
bytes
的支持。移除了
reline
方法和chars_on_current_line
属性。移除了
stringio
和encoding
参数。移除了对传递可调用对象而不是文件的支持。
#7224: 由 logging 插件设置且从未打算公开的
item.catch_log_handler
和item.catch_log_handlers
属性不再可用。已弃用的
--no-print-logs
选项和log_print
ini 选项已移除。请改用--show-capture
。#7226: 从
pytest.Function.__init__
中移除了未使用的args
参数。#7418: 移除了
pytest_doctest_prepare_content
hook 规范。此 hook 至少 10 年未被 pytest 触发。#7438: 对内部
_pytest._code.source
进行了一些更改,此处列出这些更改是为了方便可能正在使用它的插件作者已移除
Source()
的deindent
参数,现在始终为 true。移除了对
Source()
的零个或多个参数的支持。移除了对将
Source
与str
进行比较的支持。移除了
Source.isparseable()
和Source.putaround()
方法。移除了
Source.compile()
方法和_pytest._code.compile()
函数;请改用普通的compile()
。移除了
_pytest._code.source.getsource()
函数;请改用Source()
直接代替。
Deprecations¶
Features¶
#1556: pytest 现在支持
pyproject.toml
文件进行配置。配置选项与其他格式中可用的选项类似,但必须在
[tool.pytest.ini_options]
表中定义才能被 pytest 拾取# pyproject.toml [tool.pytest.ini_options] minversion = "6.0" addopts = "-ra -q" testpaths = [ "tests", "integration", ]
更多信息可以在 文档中 找到。
#3342: pytest 现在包含内联类型注解,并将它们暴露给用户程序。涵盖了大多数面向用户的 API 以及内部代码。
如果您在测试中运行类型检查器(例如 mypy),您可能会开始注意到指示不正确用法的类型错误。如果您遇到您认为不正确的错误,请在 issue 中告知我们。
这些类型是针对 mypy 版本 0.780 开发的。已知 0.750 之前的版本无法工作。我们建议使用最新版本。其他类型检查器也可能工作,但尚未经过 pytest 官方验证。
#4049: 引入了一个名为
pytest_warning_recorded
的新 hook,以传达有关内部pytest
警告插件捕获的警告的信息。此 hook 旨在取代
pytest_warning_captured
,后者已被弃用,将在未来的版本中移除。#6471: 新的命令行标志
--no-header
: 禁用初始标头,包括平台、版本和插件。--no-summary
: 禁用最终测试摘要,包括警告。
#6856: 现在,当从 config INI 文件中读取未知键时,会显示警告。
添加了
--strict-config
标志,将这些警告视为错误。#6906: 添加了
--code-highlight
命令行选项,用于启用/禁用终端输出中的代码高亮显示。#7245: 新的
--import-mode=importlib
选项,该选项使用importlib
导入测试模块。传统上,pytest 使用
__import__
,同时更改sys.path
以导入测试模块(这也改变了sys.modules
作为副作用),这种方法可行,但存在许多缺点,例如要求不在包中的测试模块具有唯一的名称(因为它们需要以唯一的名称驻留在sys.modules
中)。--import-mode=importlib
使用来自importlib
的更细粒度的导入机制,这些机制不需要 pytest 更改sys.path
或sys.modules
,从而消除了先前模式的大部分缺点。我们计划在未来的版本中将
--import-mode=importlib
作为默认设置,因此鼓励用户尝试新模式并在 issue #7245 中提供反馈(正面或负面)。您可以在 文档 中阅读有关此选项的更多信息。
#7305: 新的
required_plugins
配置选项允许用户指定 pytest 运行所需的插件列表,包括版本信息。如果在运行 pytest 时未找到任何必需的插件,则会引发错误。
Improvements¶
#4375:
pytest
命令现在会抑制BrokenPipeError
错误消息,该消息在pytest
的输出通过管道传输,并且管道被管道传输到的程序关闭时打印到 stderr(常见示例为less
和head
)。#4391: 提高了测试持续时间测量的精度。
CallInfo
项现在有一个新的<CallInfo>.duration
属性,使用time.perf_counter()
创建。此属性用于填充<TestReport>.duration
属性,该属性比之前的<CallInfo>.stop - <CallInfo>.start
更准确(因为这些属性基于time.time()
)。#4675: 现在,对 dataclass 和
attrs
-classes 的丰富比较是递归的。#6285: 公开了
pytest.FixtureLookupError
异常,当无法返回具有给定名称的 fixture 时,request.getfixturevalue()
(其中request
是FixtureRequest
fixture)会引发该异常。#6433: 如果在格式化日志调用中的消息时遇到错误,例如
logging.warning("oh no!: %s: %s", "first")
(缺少第二个参数),pytest 现在会传播错误,很可能导致测试失败。以前,这样的错误会导致错误打印到 stderr,默认情况下,对于通过的测试,stderr 不会显示。此更改使错误在测试期间可见。
您可以暂时或永久地通过设置
logging.raiseExceptions = False
来抑制此行为。#6817: 保留了命令行选项的帮助文本中的显式换行符,从而使插件可以更好地控制向用户显示的帮助。
#6940: 当使用
--duration
选项时,终端消息输出现在可以更精确地显示隐藏项目的数量和持续时间。#6991: 收集的文件显示在来自 hook 的任何报告之后,例如来自
--lf
的状态。#7091: 当通过
--capture=fd
或capfd
和capfdbinary
fixtures 使用fd
捕获,并且文件描述符(0、1、2)无法复制时,仍然会执行 FD 捕获。以前,在这种情况下,直接写入文件描述符将失败或丢失。#7119: 如果
--basetemp
参数为空、当前工作目录或父目录之一,则退出并显示错误。这样做是为了防止意外数据丢失,因为传递给此参数的任何目录都会被清除。#7128:
pytest --version
现在仅显示 pytest 版本,而pytest --version --version
显示更详细的信息,包括插件。这与其他工具显示--version
的方式更加一致。#7133:
caplog.set_level()
现在将覆盖通过 CLI 或配置文件设置的任何log_level
。#7159:
caplog.set_level()
和caplog.at_level()
不再影响 Captured log report 报告部分中显示的日志级别。#7348: 改进了对 dataclasses / attrs 进行比较断言的递归 diff 报告。
#7385:
--junitxml
现在在设置和拆卸期间的故障的message
XML 属性中包含异常原因。之前
<error message="test setup failure">
现在
<error message="failed on setup with "ValueError: Some error during setup"">
Bug 修复¶
#4677: SKIPPED 测试的摘要报告中显示路径现在始终是相对路径。以前有时是绝对路径。
#5456: 修复了尝试删除用于控制对
tmp_path
和tmpdir
创建的文件夹的访问的锁文件时,可能发生的竞争条件。#6240: 修复了在收集步骤中记录日志导致日志消息重复输出到 stderr 的问题。
#6428: 如果自会话开始以来当前工作目录已更改,则错误消息中显示的路径现在是正确的。
#6871: 修复了使用
capsysbinary
时捕获输出导致的崩溃。#6909: 回滚了 #6330 引入的更改,该更改要求
@pytest.mark.parametrize
的所有参数都在函数签名中显式定义。原始更改的意图是删除预期之外/令人惊讶的行为,但事实证明很多人依赖它,因此限制已被回滚。
#6910: 修复了当插件在使用
--reportlog
选项时返回未知统计信息时发生的崩溃。#6924: 确保
unittest.IsolatedAsyncioTestCase
实际上被等待。#6925: 修复
TerminalRepr
实例使其再次可哈希。#6947: 修复了在测试失败时,使用
unittest.TestCase.addCleanup()
注册的函数未被调用的回归问题。#6951: 允许用户仍然设置已弃用的
TerminalReporter.writer
属性。#6956: 防止 pytest 将
ConftestImportFailure
回溯打印到 stdout。#6991: 修复了自 pytest 5.4 以来
--lf
过滤过多的回归问题。#7061: 当 yield fixture 未能 yield 值时,报告测试 setup 错误而不是崩溃。
#7076: 在 SKIPPED 报告中,被
@pytest.mark.skip
跳过的文件的路径现在相对于调用目录。以前它相对于根目录。#7110: 修复了回归问题:
asyncbase.TestCase
测试再次正确执行。#7126: 当使用
-bb
标志调用 Python 时,--setup-show
现在不会在 bytes 值用作parametrize
参数时引发错误。#7143: 修复
pytest.File.from_parent
,使其将额外的关键字参数转发给构造函数。#7145: 具有损坏的
__getattribute__
方法的类在失败期间正确显示。#7150: 防止在引发
ConfTestImportFailure
时隐藏底层异常。#7180: 修复以不同于 locale 编码的文件的
_is_setup_py
。#7215: 修复了使用
--pdb
运行时,会为跳过的测试调用unittest.TestCase.tearDown()
的回归问题。#7253: 当直接在函数上使用
pytest.fixture
时,例如pytest.fixture(func)
,如果还传递了autouse
或params
参数,则该函数不再被忽略,而是被标记为 fixture。#7360: 修复了传递给
pytest.mark.skipif
和pytest.mark.xfail
的字符串表达式可能不正确的评估,在极少数情况下,使用完全相同的字符串但引用不同的全局值。#7383: 修复了整个代码库中的异常原因,即在包装异常时使用
raise new_exception from old_exception
。
文档改进¶
琐碎/内部更改¶
pytest 5.4.3 (2020-06-02)¶
Bug 修复¶
pytest 5.4.2 (2020-05-08)¶
Bug 修复¶
#6871: 修复了使用
capsysbinary fixture
时捕获输出导致的崩溃。#6924: 确保
unittest.IsolatedAsyncioTestCase
实际上被等待。#6925: 修复 TerminalRepr 实例使其再次可哈希。
#6947: 修复了在测试失败时,使用
TestCase.addCleanup
注册的函数未被调用的回归问题。#6951: 允许用户仍然设置已弃用的
TerminalReporter.writer
属性。#6992: 回滚 “tmpdir: 清理工厂的间接引用” #6767,因为它破坏了 pytest-xdist。
#7110: 修复了回归问题:
asyncbase.TestCase
测试再次正确执行。#7143: 修复
File.from_parent
,使其将额外的关键字参数转发给构造函数。#7145: 具有损坏的
__getattribute__
方法的类在失败期间正确显示。#7180: 修复以不同于 locale 编码的文件的
_is_setup_py
。
pytest 5.4.1 (2020-03-13)¶
Bug 修复¶
pytest 5.4.0 (2020-03-12)¶
破坏性更改¶
#6316:
-k EXPRESSION
与测试名称的匹配现在不区分大小写。#6443: 使用
-p
指定的插件现在在内部插件之后加载,这导致它们的钩子在内部插件之前被调用。这使得
-p
行为与PYTEST_PLUGINS
一致。#6637: 删除了长期弃用的
pytest_itemstart
钩子。这个钩子已被标记为弃用,并且甚至在过去 10 年中都没有被 pytest 调用过。
#6673: 反转/修复了错误差异中“+/-”的含义。“-”表示结果中缺少预期内容,“+”表示结果中存在意外的额外内容。
#6737: 当结果不可用时,
FixtureDef
的cached_result
属性现在设置为None
,而不是被删除。如果您的插件执行类似
hasattr(fixturedef, 'cached_result')
的检查,例如在pytest_fixture_post_finalizer
钩子实现中,请将其替换为fixturedef.cached_result is not None
。如果您del
该属性,请将其设置为None
代替。
弃用¶
#3238: 选项
--no-print-logs
已弃用,并计划在未来的版本中删除。如果您使用--no-print-logs
,请尝试使用--show-capture
并提供反馈。--show-capture
命令行选项在pytest 3.5.0
中添加,并允许指定在测试失败时如何显示捕获的输出:no
、stdout
、stderr
、log
或all
(默认值)。#571: 弃用未使用的/损坏的
pytest_collect_directory
钩子。自从 2010 年删除Directory
收集器以来,它一直错位,并且一旦收集与测试执行分离,它就变得不正确/不可用。#5975: 弃用直接构造
Nodes
的使用。相反,它们现在通过
Node.from_parent
构建。这种过渡机制使我们能够通过强制执行更受控制的创建/配置模式来解开非常复杂的
Node
关系。作为此更改的一部分,session/config 已经是禁止的参数,并且随着我们处理细节,我们可能还需要禁止更多参数。
子类如果打算扩展
Nodes
的创建,则应使用super().from_parent
。#6779:
TerminalReporter.writer
属性已被弃用,不应再使用。这是作为该插件的公共 API 的一部分无意中暴露出来的,并且将其与py.io.TerminalWriter
绑定得太紧密。
新特性¶
#4597: 新的 –capture=tee-sys 选项,允许实时打印和捕获测试输出。
#5712: 现在,
@pytest.mark.parametrize
的所有参数都需要在函数签名中显式声明,或者通过indirect
声明。以前,如果存在同名的 fixture,则可以省略参数,这只是实现上的巧合,并非 API 的一部分。#6454: 将
-r
的默认值更改为fE
,这会在 简短的测试摘要 中显示失败和错误。-rN
可用于禁用它(旧行为)。#6469: 为
junit_logging
选项添加了新选项:log
、out-err
和all
。#6834: 过多的警告摘要现在按文件折叠,以确保警告摘要的可读显示。
改进¶
#1857:
pytest.mark.parametrize
再次接受ids
的整数,并将其转换为字符串。#449: 对任何 XPASSED 测试使用“黄色”主色。
#4639: 回滚 “现在为
None
的断言发出警告”。事实证明,该警告不如最初预期的那么有用,并且有很多误报情况。
#5686: 当给定绝对路径和非规范化路径时,
tmpdir_factory.mktemp
现在会失败。#5984:
pytest_warning_captured
钩子现在接收一个location
参数,其中包含生成警告的代码位置。#6213: pytester:
testdir
fixture 尊重来自内部运行的monkeypatch
fixture 的环境设置。#6247:
--fulltrace
在收集错误时也有效。#6384: 使
--showlocals
也适用于--tb=short
。#6653: 添加了对使用
LineMatcher
的fnmatch_lines()
和re_match_lines()
连续匹配行的支持。#6658: 当安装
pygments
时,代码现在在回溯中突出显示。鼓励用户将
pygments
安装到他们的环境中并提供反馈,因为计划在未来使pygments
成为常规依赖项。#6795: 导入带有无效
-o
选项的用法错误消息。#759:
pytest.mark.parametrize
支持ids
的迭代器和生成器。
Bug 修复¶
#310: 添加了对使用 doctest 调用
pytest.xfail()
和pytest.importorskip()
的支持。#3823:
--trace
现在可以与 unittest 一起使用。#4445: 修复了 pytest 产生的一些警告报告,使其指向用户代码中警告的正确位置。
#5301: 修复
--last-failed
以从具有已知失败的文件中收集新测试。#5928: 在用户代码级别报告
PytestUnknownMarkWarning
,而不是pytest
的级别。#5991: 修复了与
--pdb
和 unittest 的交互:不要使用 unittest 的TestCase.debug()
。#6334: 修复了当在
-r
命令行选项中同时使用f/F
和s/S
报告字符时(例如-rFf
),摘要条目出现两次的问题。大写变体从未记录在案,首选形式应为小写。
#6409: 对于没有先前通过的非最后一个项目,使用绿色(而不是黄色)作为彩色终端进度指示器回退颜色。
#6454:
--disable-warnings
在-ra
和-rA
中被遵守。#6497: 修复了 fixture 中请求键与缓存键比较的错误。
构造
if key == cached_key:
可能会失败,原因可能是显式禁止==
,或者对于例如 NumPy 数组,其中a == b
的结果通常无法转换为bool
。已实现的修复将==
替换为is
。#6557: 使捕获输出流
.write()
方法从原始流返回相同的返回值。#6566: 修复
EncodedFile.writelines
以调用底层缓冲区的writelines
方法。#6575: 修复了当
faulthandler
开始初始化时(例如,设置了PYTHONFAULTHANDLER=1
环境变量)以及在配置文件中定义了faulthandler_timeout
时发生的内部崩溃。#6597: 修复了包含参数化空字符串变量的节点 ID。
#6646: 断言重写钩子已(重新)存储用于当前项目,这修复了在例如 pytester 的
testdir.runpytest
等之后仍然使用它们的问题。#6660: 从
pytest_sessionfinish
钩子发出的pytest.exit()
被处理。这包括从调试器退出。#6752: 当
pytest.raises()
用作函数(而不是上下文管理器)时,match
关键字参数现在传递给被测试的函数。以前它被吞没并忽略了(pytest 5.1.0 中的回归)。#6801: 不要为 doctest 的意外异常的回溯显示空行。
#6802:
testdir fixture
现在在 doctest 中工作。
文档改进¶
琐碎/内部更改¶
#6404: 删除 Python 3.9 中已弃用的
parser
模块的使用。
pytest 5.3.5 (2020-01-29)¶
Bug 修复¶
#6517: 修复了 pytest 5.3.4 中的回归问题,该问题导致由于错误的断言而出现 INTERNALERROR。
pytest 5.3.4 (2020-01-20)¶
Bug 修复¶
pytest 5.3.3 (2020-01-16)¶
Bug 修复¶
#2780: 在 teardown 期间捕获的输出现在会通过
-rP
显示。#5971: 修复了处理由
multiprocessing
模块创建的子进程中引发的异常时,pytest-xdist
崩溃的问题。#6436:
FixtureDef
对象现在能够正确地将其 finalizer 注册到 autouse 和参数化的 fixture 中,这些 fixture 在 fixture 堆栈中先于它们执行,以便它们在正确的时间以正确的顺序被 teardown。#6532: 修复了使用
testdir
结果解析包含多个错误的 outcomes 的问题 (5.3.0 版本中的回归)。
琐碎/内部更改¶
#6350: 优化了测试参数 ID 的自动重命名。
pytest 5.3.2 (2019-12-13)¶
改进¶
#4639: 回滚 “现在为
None
的断言发出警告”。事实证明,该警告不如最初预期的那么有用,并且有很多误报情况。
Bug 修复¶
pytest 5.3.1 (2019-11-25)¶
改进¶
#6231: 改进了对 pytest.mark.parametrize 拼写错误的检查。
#6257: 处理通过
pytest_internalerror
使用pytest.exit()
的情况,例如从 post mortem 中退出 pdb 时。
Bug 修复¶
#5914: pytester: 修复了在正向匹配后使用
no_fnmatch_line()
的问题。#6082: 修复了
property
docstring 中 doctest 示例的行检测问题,作为 python/cpython#61648 的一个变通方案。#6254: 修复了与 pytest-parallel 的兼容性问题 (pytest 5.3.0 版本中的回归)。
#6255: 通过删除
sys.last_traceback
,sys.last_type
和sys.last_value
属性来清除它们,而不是将它们设置为None
。这更好地匹配了 Python 标准库的行为。
pytest 5.3.0 (2019-11-19)¶
弃用¶
#6179:
junit_family
选项的默认值将在 pytest 6.0 中更改为"xunit2"
,因为这是现代工具默认支持的版本,用于操作此类文件。为了平滑过渡,如果在命令行中给出了
--junitxml
选项,但junit_family
未在pytest.ini
中显式配置,pytest 将发出警告。有关更多信息,请参阅文档。
新特性¶
#4488: pytest 团队创建了 pytest-reportlog 插件,该插件提供了一个新的
--report-log=FILE
选项,该选项在测试会话执行时将报告日志写入文件。报告日志的每一行都包含一个自包含的 JSON 对象,该对象对应于一个测试事件,例如集合或测试结果报告。文件保证在写入每一行后都会被刷新,因此系统可以实时读取和处理事件。
该插件旨在取代
--resultlog
选项,该选项已被弃用,并计划在未来的版本中删除。如果您使用--resultlog
,请尝试使用pytest-reportlog
并提供反馈。#4730: 当设置
sys.pycache_prefix
(Python 3.8+) 时,pytest 将使用它来缓存断言重写机制更改的测试文件。这使得即使在没有权限的文件系统上也能更容易地受益于缓存的
.pyc
文件。#5515: 允许选择性地自动缩进多行日志消息。
添加了命令行选项
--log-auto-indent
,配置选项log_auto_indent
,并支持对logging.log()
的调用进行每个条目的缩进行为配置。将自动缩进的默认值从
"on"
更改为"off"
。这恢复了 v4.6.0 之前的旧行为。恢复到早期行为是因为最好显式激活可能导致测试失败的新功能,而不是隐式激活。#5914:
testdir
学习了两个新函数,no_fnmatch_line()
和no_re_match_line()
。这些函数用于确保捕获的文本不匹配给定的模式。
之前的习惯用法是使用
re.match()
result = testdir.runpytest() assert re.match(pat, result.stdout.str()) is None
或者
in
运算符result = testdir.runpytest() assert text in result.stdout.str()
但是新函数在失败时产生更好的输出。
#6057: 在打印
pytest.approx
时,为复数值添加了公差。例如,
repr(pytest.approx(3+4j))
返回(3+4j) ± 5e-06 ∠ ±180°
。这是极坐标表示法,指示围绕期望值的圆,半径为 5e-06。为了使approx
比较返回True
,实际值应落在此圆内。#6061: 将 pluginmanager 作为参数添加到
pytest_addoption
,以便在设置命令行选项时可以调用 hook。这对于让一个插件与另一个插件进行通信很有用,例如默认值或要添加的命令行选项集。
改进¶
#5061: 在终端摘要统计信息中使用多种颜色。
#5630: 从调试器退出现在在
doctest
项目中得到正确处理。#5924: 改进了序列的详细 diff 输出。
之前
E AssertionError: assert ['version', '...version_info'] == ['version', '...version', ...] E Right contains 3 more items, first extra item: ' ' E Full diff: E - ['version', 'version_info', 'sys.version', 'sys.version_info'] E + ['version', E + 'version_info', E + 'sys.version', E + 'sys.version_info', E + ' ', E + 'sys.version', E + 'sys.version_info']
之后
E AssertionError: assert ['version', '...version_info'] == ['version', '...version', ...] E Right contains 3 more items, first extra item: ' ' E Full diff: E [ E 'version', E 'version_info', E 'sys.version', E 'sys.version_info', E + ' ', E + 'sys.version', E + 'sys.version_info', E ]
#5934:
ExceptionInfo
对象的repr
已得到改进,以遵循底层异常的__repr__
方法。#5936: 使用
-vv
显示未截断的断言消息。#5990: 修复了测试摘要中的复数形式不匹配问题 (例如,显示 “1 error” 而不是 “1 errors”)。
#6008:
Config.InvocationParams.args
现在始终是一个tuple
,以更好地表达它应该是不可变的,并避免意外修改。#6023:
pytest.main
现在返回一个pytest.ExitCode
实例,除非使用自定义退出代码 (在这种情况下,它仍然返回int
)。#6026: 对齐了 pytester 的
LineMatcher
输出中的前缀。#6059: 集合错误在终端的简短测试摘要中报告为错误 (而不是像以前那样报告为失败)。
#6069:
pytester.spawn
不再无条件地在 FreeBSD 上跳过/xfail 测试。#6097: 测试摘要中的 “[…%]” 指示器现在根据最终 (新的) 多色行的主颜色着色。
#6116: 添加了
--co
作为--collect-only
的同义词。#6148:
atomicwrites
现在仅在 Windows 上使用,修复了 Unix 上断言重写的性能回归。#6152: 现在参数化将对任何对象的 id 使用
__name__
属性 (如果存在)。以前,它仅对函数和类使用__name__
。#6176: 改进了 pytester 的
Hookrecorder.assertoutcome
的失败报告。#6181: 会话停止的原因,例如使用
--maxfail
/-x
,现在会在测试摘要中报告。#6206: 改进了
cache.set
的鲁棒性和性能。
Bug 修复¶
#2049: 修复了
--setup-plan
显示有关 fixture 生命周期不准确信息的问题。#2548: 修复了终端摘要中跳过测试的行偏移不匹配问题。
#6039: 当取消配置 doctest 插件时,
PytestDoctestRunner
现在被正确地失效。这在使用
pytester
的runpytest_inprocess
时很重要。#6047:
saferepr
现在处理 BaseExceptions,其中包括pytest.fail.Exception
等。#6074: pytester: 修复了在清理临时目录时
rm_rf
警告中参数的顺序,并且不为os.open
的错误发出警告。#6189: 修复了
getmodpath
方法的结果。
琐碎/内部更改¶
#4901: 来自
pytester
的RunResult
现在在其为有效的pytest.ExitCode
值时显示ret
属性的助记符。
pytest 5.2.4 (2019-11-15)¶
Bug 修复¶
pytest 5.2.3 (2019-11-14)¶
Bug 修复¶
pytest 5.2.2 (2019-10-24)¶
Bug 修复¶
pytest 5.2.1 (2019-10-06)¶
Bug 修复¶
#5902: 修复了
attrs>=19.2
中关于已弃用的cmp
属性的警告。
pytest 5.2.0 (2019-09-28)¶
弃用¶
#1682: 将参数作为位置参数传递给 pytest.fixture() 已被弃用 - 请改为将其作为关键字参数传递。
新特性¶
Bug 修复¶
琐碎/内部更改¶
#5056: HelpFormatter 使用
py.io.get_terminal_width
来获得更好的宽度检测。
pytest 5.1.3 (2019-09-18)¶
Bug 修复¶
pytest 5.1.2 (2019-08-30)¶
Bug 修复¶
#2270: 修复了在插件类中定义的函数作用域 fixture 中的
self
引用: 以前self
将是对测试类的引用,而不是插件类。#570: 修复了长期存在的问题,即在参数化期间使用间接 fixture 时,fixture 作用域未得到遵守。
#5782: 修复了打印来自
--pastebin
的错误响应时的解码错误。#5786: 测试和集合报告中的链式异常现在可以正确序列化,从而允许像
pytest-xdist
这样的插件正确显示它们。#5792: Windows: 修复了在从工作目录加载
conftest.py
时在某些情况下发生的错误,该工作目录的大小写与文件系统中存储的大小写不同 (例如,c:\test
而不是C:\test
)。
pytest 5.1.1 (2019-08-20)¶
Bug 修复¶
#5751: 修复了在 Python 3.5.0 和 3.5.1 上导入 pytest 时的
TypeError
。
pytest 5.1.0 (2019-08-15)¶
移除¶
#5180: 根据我们的政策,以下功能已在 4.X 系列中弃用,现在已删除
Request.getfuncargvalue
: 请改用Request.getfixturevalue
。pytest.raises
和pytest.warns
不再支持将字符串作为第二个参数。pytest.raises
的message
参数。pytest.raises
,pytest.warns
和ParameterSet.param
现在使用原生仅关键字语法。这可能会更改先前版本的异常消息,但它们仍然像以前一样对未知的关键字参数引发TypeError
。pytest.config
全局变量。tmpdir_factory.ensuretemp
方法。pytest_logwarning
hook。RemovedInPytest4Warning
警告类型。request
现在是 fixture 的保留名称。
有关更多信息,请查阅文档中的 弃用和移除。
#5565: 删除了对 unittest2 的未使用支持代码。
由于 Python 3.3+ 之后不再需要
unittest2
backport 模块,并且 pytest 中支持它的一小部分代码似乎也没有被使用:删除后,所有测试仍然不变地通过。尽管我们的政策是在删除任何功能或对第三方库的支持之前引入弃用期,但由于此代码显然根本没有被使用 (即使
unittest2
被 pytest 执行的测试套件使用),因此决定在此版本中删除它。如果您因此遇到回归问题,请提交 issue。
#5615:
pytest.fail
,pytest.xfail
和pytest.skip
不再支持将字节作为 message 参数。Python 2 支持此功能,在 Python 2 中,很容易使用
"message"
而不是u"message"
。Python 3 代码不太可能将
bytes
传递给这些函数。如果您这样做,请事先将其解码为str
。
新特性¶
改进¶
Bug 修复¶
#4344: 修复了尝试仅使用 “__init__.py” 收集软件包时的 RuntimeError/StopIteration 错误。
#5115: 在
pytest_configure
期间发出的警告被明确地不视为错误,即使配置为错误也是如此,因为它会完全破坏 pytest。#5477:
--junitxml
生成的 XML 文件现在正确地包含<testsuites>
根元素。#5524: 修复了
tmp_path
和tmpdir
不会删除包含标记为只读文件的目录的问题,这可能会导致在第二次使用--basetemp
选项执行 pytest 时崩溃。#5537: 将
importlib_metadata
backport 替换为 Python 3.8+ 标准库中的importlib.metadata
。#5578: 改进了一些引发异常的函数 (
pytest.xfail
,pytest.skip
等) 的类型检查,以便在用户打算使用标记时提供更好的错误消息 (例如@pytest.xfail
而不是@pytest.mark.xfail
)。#5606: 修复了当测试函数使用无法与其他对象进行真值比较的对象 (例如
numpy
数组) 进行修补时发生的内部错误。#5634:
unittest
用例现在可以正确处理pytest.exit
。这使得unittest
用例可以正确处理来自 pytest pdb 的quit
。#5650: 改进了在解析 ini 配置文件失败时的输出。
#5701: 修复了收集使用
functools.partial
定义的staticmethod
对象的问题。#5734: 跳过异步生成器测试函数,并更新警告消息以引用
async def
函数。
改进的文档¶
#5669: 为
Testdir.copy_example
添加了文档字符串。
琐碎/内部更改¶
#5095:
xunit2
系列的 XML 文件现在已通过 pytest 自己的测试套件针对 schema 进行了验证,以避免未来的回归。#5516: 缓存节点拆分函数,可以提高非常大的测试套件中的集合性能。
#5603: 简化了内部
SafeRepr
类并删除了一些死代码。#5664: 当使用
PYTHONDONTWRITEBYTECODE=1
调用 pytest 自己的测试套件时,test_xfail_handling
测试不再失败。#5684: 将代码库中
OSError.errno
的手动处理替换为新的OSError
子类 (PermissionError
,FileNotFoundError
等)。
pytest 5.0.1 (2019-07-04)¶
Bug 修复¶
改进的文档¶
#5517: 改进“编写插件”章节中的“声明新钩子”部分
pytest 5.0.0 (2019-06-28)¶
重要¶
此版本仅支持 Python 3.5+。
有关更多详细信息,请参阅我们的Python 2.7 和 3.4 支持计划。
移除¶
#1149: Pytest 不再接受命令行参数的前缀,例如输入
pytest --doctest-mod
代替--doctest-modules
。以前在ArgumentParser
认为没有歧义的情况下是允许的,但这可能是错误的,因为插件的选项解析被延迟了。例如,请参阅问题 #1149、#3413 和 #4009。#5402: PytestDeprecationWarning 现在默认是错误。
根据我们尽可能减少中断地移除已弃用功能的计划,所有类型为
PytestDeprecationWarning
的警告现在会生成错误,而不是警告消息。受影响的功能将在 pytest 5.1 中被有效移除,因此请查阅文档中的弃用和移除章节,了解如何更新现有代码的指导。
在 pytest
5.0.X
系列中,可以通过将以下内容添加到您的pytest.ini
文件中,将错误改回警告作为权宜之计[pytest] filterwarnings = ignore::pytest.PytestDeprecationWarning
但是当 pytest
5.1
发布时,这将停止工作。如果您对特定功能的移除有疑虑,请在 #5402 中添加评论。
#5412:
ExceptionInfo
对象(由pytest.raises
返回)现在具有与repr
相同的str
表示形式,这避免了用户使用print(e)
检查对象时的一些混淆。这意味着像这样的代码
with pytest.raises(SomeException) as e: ... assert "some message" in str(e)
需要更改为
with pytest.raises(SomeException) as e: ... assert "some message" in str(e.value)
弃用¶
功能¶
#3457: 新的
pytest_assertion_pass
钩子,在断言通过时使用上下文信息调用。此钩子仍然是实验性的,因此请谨慎使用。
#5440:
faulthandler
标准库模块现在默认启用,以帮助用户诊断 C 模块中的崩溃。此功能通过将外部 pytest-faulthandler 插件集成到核心中来提供,因此如果使用了该插件,用户应从其 requirements 中删除该插件。
有关更多信息,请参阅文档:故障处理程序。
#5452: 当警告配置为错误时,pytest 警告现在显示为源自
pytest.
而不是内部的_pytest.warning_types.
模块。#5125:
Session.exitcode
值现在在pytest.ExitCode
中编码,这是一个IntEnum
。这使得退出代码可用于消费者代码,并且比仅仅文档更明确。用户定义的退出代码仍然有效,但应谨慎使用。团队不希望此更改会破坏一般的测试套件或插件,除非在深奥/特定的场景中。
pytest-xdist 用户应升级到
1.29.0
或更高版本,因为pytest-xdist
由于此更改需要兼容性修复。
Bug 修复¶
#1403: 从
imp
切换到importlib
。#1671: 断言写入器缓存的
.pyc
文件的名称现在包含 pytest 版本,以避免陈旧的缓存。#5078: 使用
--pyargs
时,测试模块不再被双重导入。#5260: 改进了字节字符串的比较。
当比较字节时,断言消息过去在显示差异时显示字节数值
def test(): > assert b'spam' == b'eggs' E AssertionError: assert b'spam' == b'eggs' E At index 0 diff: 115 != 101 E Use -v to get the full diff
现在它显示实际的 ascii 表示形式,这通常更有用
def test(): > assert b'spam' == b'eggs' E AssertionError: assert b'spam' == b'eggs' E At index 0 diff: b's' != b'e' E Use -v to get the full diff
#5335: 当日志格式中的级别使用 ‘%(levelname).Xs’ (截断的固定宽度对齐) 格式化时,对级别名称进行着色,其中 X 是一个整数。
#5354: 修复了当 argvalues 是迭代器时
pytest.mark.parametrize
的问题。#5370: 还原
all()
的展开以修复嵌套推导式上的NameError
。#5371: 还原
all()
的展开以修复带有if
的生成器的不正确处理。#5372: 还原
all()
的展开以修复在使用表达式中的all()
时的不正确断言。#5383: 当使用
--log-cli-level
时,-q
再次对收集项的样式 (--collect-only
) 产生影响。#5389: 修复了 #5063 对于
importlib_metadata.PathDistribution
的回归,它们的files
属性为None
。#5390: 修复了
TestCase
项的obj
属性不再绑定到方法的回归。#5432: 防止在进程内多次调用 pytest 时,断言重写器发出“已导入”警告。
#5433: 修复了包 (
__init__.py
) 中的断言重写。#5444: 修复了当命令行上传递的第一个文件收集失败时
--stepwise
模式的问题。#5482: 修复了 4.6.0 中引入的 bug,该 bug 在向
pytest.mark.parametrize
传递超过 2 个位置参数时导致收集错误。#5505: 修复了在使用
-p no:terminal
时发现失败时的崩溃。
改进的文档¶
pytest 4.6.11 (2020-06-04)¶
Bug 修复¶
#6334: 修复了当在
-r
命令行选项中同时使用f/F
和s/S
报告字符时(例如-rFf
),摘要条目出现两次的问题。大写变体从未记录在案,首选形式应为小写。
#7310: 修复了当插件以非常规状态返回报告对象时,
_pytest.terminal.pytest_report_teststatus()
中的UnboundLocalError: local variable 'letter' referenced before assignment
。这导致
pytest_report_teststatus()
跳过声明letter
变量的 if-block 分支。修复方法是在 if-block 级联之前设置
letter
的初始值,以便它始终具有一个值。
pytest 4.6.10 (2020-05-08)¶
功能¶
琐碎/内部更改¶
#6404: 删除 Python 3.9 中已弃用的
parser
模块的使用。
pytest 4.6.9 (2020-01-04)¶
Bug 修复¶
#6301: 修复了基于 egg 的发行版和
editable
安装 (pip install --editable
) 的断言重写。
pytest 4.6.8 (2019-12-19)¶
功能¶
#5471: JUnit XML 现在在 testsuite 标签中包含时间戳和主机名。
Bug 修复¶
#5430: junitxml: 失败测试的日志现在会在测试在 call 阶段失败时传递给 junit 报告。
琐碎/内部更改¶
#6345: 仅对于 Python 3.4,将
colorama
钉住到0.4.1
,以便较新的 Python 版本仍然可以接收 colorama 更新。
pytest 4.6.7 (2019-12-05)¶
Bug 修复¶
pytest 4.6.6 (2019-10-11)¶
Bug 修复¶
琐碎/内部更改¶
#5801: 修复了 Python 版本检查 (由
flake8-2020
检测到),以防 python4 成为现实。
pytest 4.6.5 (2019-08-05)¶
Bug 修复¶
pytest 4.6.4 (2019-06-28)¶
Bug 修复¶
pytest 4.6.3 (2019-06-11)¶
Bug 修复¶
pytest 4.6.2 (2019-06-03)¶
Bug 修复¶
pytest 4.6.1 (2019-06-02)¶
Bug 修复¶
pytest 4.6.0 (2019-05-31)¶
重要¶
4.6.X
系列将是最后一个支持 Python 2 和 Python 3.4 的系列。
有关更多详细信息,请参阅我们的Python 2.7 和 3.4 支持计划。
功能¶
#4559: 添加了
junit_log_passing_tests
ini 值,该值可用于启用或禁用在 Junit XML 文件中记录通过的测试输出。#4956: pytester 的
testdir.spawn
使用tmpdir
作为 HOME/USERPROFILE 目录。#5062: 将
all
的调用展开为完整的 for 循环,并进行断言重写,以获得更好的失败消息,尤其是在使用生成器表达式时。#5063: 从
pkg_resources
切换到importlib-metadata
以进行入口点检测,从而提高性能和导入时间。#5091:
--help
中 ini 选项的输出已得到改进。#5269:
pytest.importorskip
现在在默认的reason
中包含ImportError
。#5311: 为每个失败的测试输出的捕获日志使用 ColoredLevelFormatter 格式化。
#5312: 改进了 Python 3 中多行日志消息的格式。
Bug 修复¶
#2064: 调试插件现在按需导入包装的
Pdb
类 (--pdbcls
)。#4908:
pytest_enter_pdb
钩子被使用事后调试 (--pdb
) 调用。#5036: 修复了依赖于其他参数化 fixture 的 fixture 会被错误地参数化的问题。
#5256: 处理由于 Jython 中无法表示的孤立代理 unicode 字符引起的内部错误。
#5257: 确保
sys.stdout.mode
不包含'b'
,因为它是一个文本流。#5278: Pytest 的内部 python 插件可以使用
-p no:python
再次禁用。#5286: 修复了当在参数化测试中使用测试 ID 列表时,
disable_test_id_escaping_and_forfeit_all_rights_to_community_support
选项不起作用的问题。#5330: 当为具有
__init__
和__new__
方法的测试类发出PytestCollectionWarning
消息时,显示正在收集的测试模块,以便更容易查明问题。#5333: 修复了 4.5.0 中
--lf
不重新运行来自非选定测试的已知失败的所有测试的回归。
改进的文档¶
#5250: 扩展了关于
setenv
和delenv
与monkeypatch
一起使用的文档。
pytest 4.5.0 (2019-05-11)¶
功能¶
#4826: 现在当未知标记用作装饰器时会发出警告。这通常是由于拼写错误造成的,这可能导致测试在不知不觉中被破坏。
#4907: 在 JUnitXML 消息字段中显示 XFail 原因。
#5013: 来自崩溃报告的消息现在显示在测试摘要中,并截断为终端宽度。
#5023: 新标志
--strict-markers
,当在测试套件中使用未知标记(例如,那些未使用配置文件的markers
选项注册的标记)时,会触发错误。现有的
--strict
选项目前具有相同的行为,但将来可能会针对其他检查进行增强。#5026: 序列和字典的断言失败消息现在包含不同项目的数量。
#5034: 改进了使用
--lf
和--ff
(run-last-failure) 的报告。#5035:
--cache-show
选项/操作接受一个可选的 glob,以仅显示匹配的缓存条目。#5059: 标准输入 (stdin) 可以提供给 pytester 的
Testdir.run()
和Testdir.popen()
。#5068:
-r
选项了解了A
以在简短的测试摘要中显示所有报告(包括通过的报告)。#5108: 简短的测试摘要在带有输出的通过测试后显示 (
-rP
)。#5172:
--last-failed
(--lf
) 选项变得更智能,如果该测试文件的所有测试在之前的运行中都已通过,则现在将跳过整个文件,从而大大加快收集速度。#5177: 引入新的特定警告
PytestWarning
子类,以便更容易地基于类而不是消息来过滤警告。新的子类是PytestAssertRewriteWarning
PytestCacheWarning
PytestCollectionWarning
PytestConfigWarning
PytestUnhandledCoroutineWarning
PytestUnknownMarkWarning
#5202: 新的
record_testsuite_property
session 作用域 fixture 允许用户使用junitxml
插件在testsuite
级别记录<property>
标签。生成的 XML 与最新的 xunit 标准兼容,这与
record_property
和record_xml_attribute
记录的属性相反。#5214: 默认日志格式已更改以提高可读性。这是一个先前日志消息的示例
test_log_cli_enabled_disabled.py 3 CRITICAL critical message logged by test
现在已变为
CRITICAL root:test_log_cli_enabled_disabled.py:3 critical message logged by test
可以通过
log_format
配置选项更改格式。#5220:
--fixtures
现在也显示作用域不是"function"
的 fixture 的作用域。
Bug 修复¶
改进的文档¶
#4935: 扩展了关于注册标记和
--strict
效果的文档。
琐碎/内部更改¶
#4942:
logging.raiseExceptions
不再设置为False
。#5059: pytester 的
Testdir.popen()
现在通过带有默认值 (subprocess.PIPE
) 的关键字参数使用stdout
和stderr
。#5069: 终端中简短测试摘要的代码已移动到终端插件。
#5082: 改进了 pytester 插件中各种方法的 kwargs 的验证。
#5202: 当与
junit_family=xunit2
一起使用时,record_property
现在发出PytestWarning
:fixture 生成property
标签作为testcase
的子项,这根据最新的 最新模式是不允许的。#5239: 将
pluggy
钉住到< 1.0
,这样我们就不会在1.0
发布时自动更新到1.0
:计划有破坏性更改,我们希望确保 pytest 正确支持pluggy 1.0
。
pytest 4.4.2 (2019-05-08)¶
Bug 修复¶
改进的文档¶
琐碎/内部更改¶
#5182: 删除了内部和未使用的
_pytest.deprecated.MARK_INFO_ATTRIBUTE
。
pytest 4.4.1 (2019-04-15)¶
Bug 修复¶
pytest 4.4.0 (2019-03-29)¶
功能特性¶
#2224: 当未安装合适的异步插件(例如
pytest-asyncio
或pytest-trio
)时,async
测试函数将被跳过并发出警告。此前,
async
函数根本不会执行,但仍会被标记为“已通过”。#2482: 包含新的
disable_test_id_escaping_and_forfeit_all_rights_to_community_support
选项,用于禁用参数化值中的 ascii 转义。这可能会导致一系列问题,并且顾名思义,使用风险自负。#4718: 现在可以使用
-p
选项通过入口点名称(而不仅仅是通过模块名称)来提前加载插件。这使得可以在命令行中提前加载外部插件,例如
pytest-cov
pytest -p pytest_cov
#4855:
--pdbcls
选项现在通过模块属性处理类(例如,使用 pdbpp 的pdb:pdb.Pdb
),并且其验证已得到改进。#4875: 如果
testpaths
配置选项生效(即,目录或文件名未在命令行中显式传递),则该选项现在会显示在 pytest 标头中的rootdir
和inifile
行旁边。此外,只有当存在配置文件时才会显示
inifile
,而不是空的inifile:
字符串。#4911: 现在可以使用
pytest.skip()
动态跳过 doctest。#4920: 为了使 pytest-subtests 插件的实现成为可能,已经进行了内部重构,该插件添加了 unittest 子测试支持和一个新的
subtests
fixture,如 #1367 中所述。有关内部重构的详细信息,请参阅相关 PR 上的详细信息。
#4931: pytester 的
LineMatcher
断言传递的行是一个序列。#4936: 处理
-p plug
在-p no:plug
之后的情况。这可以用于从命令行等覆盖被阻止的插件(例如,在“addopts”中)。
#4951: 当仅通过 fixtures (capsys, capfs) 使用
pdb.set_trace()
进行捕获时,输出捕获可以正确处理。#4956:
pytester
在测试运行期间将$HOME
和$USERPROFILE
设置为临时目录。这确保不会从真实用户的 home 目录加载配置文件。
#4980: 使用
monkeypatch.syspath_prepend
和testdir.syspathinsert
(通过pkg_resources.fixup_namespace_packages
)更好地处理命名空间包。#4993: stepwise 插件现在报告状态信息。
#5008: 如果
setup.cfg
文件包含[tool:pytest]
以及不再支持的[pytest]
部分,pytest 将使用[tool:pytest]
并忽略[pytest]
。此前,它会无条件地报错。这使得插件更容易支持旧版本的 pytest。
Bug 修复¶
#1895: 修复了通过
request.getfixturevalue()
动态请求的 fixtures 可能在请求 fixture 之前被 teardown 的 bug。#4851: pytester 现在会取消设置
PYTEST_ADDOPTS
,以便不将外部选项与testdir.runpytest()
一起使用。#4903: 在重写的
.pyc
文件中使用正确的修改时间来处理 2038 年之后的年份。#4928: 修复
ScopeMismatch
错误中的行偏移量。#4957: 现在可以正确处理默认(内部)插件的
-p no:plugin
,例如使用-p no:capture
。此前,它们总是被加载(导入),从而使例如
capfd
fixture 可用。#4975: 修复
-qq
选项的解释,此前它被视为-v
。#4978:
outcomes.Exit
不再在assertrepr_compare
中被吞噬。#4988: 在会话结束时显式关闭 logging 的文件处理程序。
#5003: 修复标记收集错误的行偏移量(偏差一)。
文档改进¶
#4974: 更新
pytest_cmdline_parse
hook 的文档,以注明可用性限制
琐碎/内部更改¶
#4718: 现在需要
pluggy>=0.9
。#4815: 现在 Python 2.7 需要
funcsigs>=1.0
。#4829: 移除了一些与
yield
测试相关的遗留内部代码。#4890: 从 pytester 插件中删除内部未使用的
anypython
fixture。#4912: 删除已弃用的 Sphinx 指令
add_description_unit()
,将 sphinx-removed-in 锁定为 >= 0.2.0 以支持 Sphinx 2.0。#4913: 修复使用自定义
PYTHONPATH
调用 pytest 测试。#4965: 新的
pytest_report_to_serializable
和pytest_report_from_serializable
**实验性** hook。这些 hook 将被
pytest-xdist
、pytest-subtests
和 resultlog 的替代品用于序列化和自定义报告。它们是实验性的,这意味着它们的细节可能会在未来的补丁版本中更改,甚至完全删除,恕不另行通知。
欢迎来自插件作者和用户的反馈。
#4987:
Collector.repr_failure
尊重--tb
选项,但现在仅默认为short
(使用auto
)。
pytest 4.3.1 (2019-03-11)¶
Bug 修复¶
琐碎/内部更改¶
#4768: 避免在顶层导入 pkg_resources。
pytest 4.3.0 (2019-02-16)¶
弃用¶
#4724: 当
pytest.warns()
接收到未知关键字参数时,现在会发出警告。将来这将更改为错误。
功能特性¶
#2753: 将来自 argparse 的用法错误映射到 pytest 的
UsageError
。#3711: 添加
--ignore-glob
参数以排除带有 Unix shell 风格通配符的测试模块。为conftest.py
添加collect_ignore_glob
以排除带有 Unix shell 风格通配符的测试模块。#4698: 删除了关于 pytest 5.0 不再支持 Python 2.7 和 3.4 的警告。
最终认为这更多的是一种麻烦,而不是实际的效用,并且这些 Python 版本的用户不应该遇到问题,因为
pip
不会在这些解释器上安装 pytest 5.0。#4707: 借助新的
set_log_path()
方法,可以通过 hooks 设置log_file
路径。
Bug 修复¶
pytest 4.2.1 (2019-02-12)¶
Bug 修复¶
#2895: 现在也会在
--collect-only
中调用pytest_report_collectionfinish
hook。#3899: 当导入的包具有
pytest_plugins.py
子模块时,不再引发UsageError
。#4347: 修复在使用带有递归调试的 pdb++ 时的输出捕获。
#4592: 修复通过父
conftest.py
处理collect_ignore
。#4700: 修复回归问题,即使子类中应用了
unittest.skip()
装饰器跳过了所有测试,setUpClass
也会始终在子类中被调用。#4739: 修复当函数返回非字符串时
parametrize(... ids=<function>)
。#4745: 修复/改进在传入
__init__.py
和测试文件时收集 args。#4770: 当需要 Python 2.7 兼容性时,
more_itertools
现在被限制为 <6.0.0。#526: 修复在符号链接到实际源的构建目录中运行时出现的“ValueError: Plugin already registered”异常。
文档改进¶
琐碎/内部更改¶
#4741: TerminalReporter 插件的一些 verbosity 相关属性现在是只读属性。
pytest 4.2.0 (2019-01-30)¶
功能特性¶
#3094: 经典 xunit 风格 函数和方法现在遵守 autouse fixtures 的作用域。
这修复了许多令人惊讶的问题,例如在会话作用域的 autouse fixtures 之前调用
setup_method
(有关示例,请参阅 #517)。#4627: 在 Python 2.7 和 3.4 下运行时,在测试会话结束时显示一条消息,说明 pytest 5.0 将不再支持这些 Python 版本。
#4660: 当使用
-k
或-m
标志时,现在也会显示选定的测试数量。#4688:
pytest_report_teststatus
hook 现在也可以接收config
参数。#4691:
pytest_terminal_summary
hook 现在也可以接收config
参数。
Bug 修复¶
#3547:
--junitxml
可以发出与 Jenkins xUnit 兼容的 XML。junit_family
INI 选项接受legacy|xunit1
,它产生旧式输出,以及xunit2
,它更严格地符合 https://github.com/jenkinsci/xunit-plugin/blob/xunit-2.3.2/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd#4280: 改进从 pdb 退出,特别是使用
--trace
。在
pdb.set_trace()
之后使用q[quit]
也会退出 pytest。#4402: 警告摘要现在按消息而不是按测试 ID 分组警告。
这使得输出更紧凑,并更好地传达了实际生成警告的代码量,而不是调用该代码的测试数量的总体思路。
#4536:
monkeypatch.delattr
处理类描述符,如staticmethod
/classmethod
。#4649: 恢复将 marks 视为关键字表达式的关键字。
#4653:
tmp_path
fixture 和其他相关 fixture 提供解析后的路径(也称为真实路径)#4667:
pytest_terminal_summary
使用来自pytest_report_teststatus
hook 的结果,而不是硬编码的字符串。#4669: 正确处理 Python 2 上包含非 ascii 字符的
unittest.SkipTest
异常。#4680: 确保
tmpdir
和tmp_path
fixtures 是同一个文件夹。#4681: 确保
tmp_path
始终是真实路径。
琐碎/内部更改¶
pytest 4.1.1 (2019-01-12)¶
Bug 修复¶
文档改进¶
#3375: 文档说明使用
setup.cfg
可能会导致其他工具崩溃或导致难以追踪的问题,因为它使用的解析器与pytest.ini
或tox.ini
文件不同。
琐碎/内部更改¶
#4602: 在 regen tox env 中卸载
hypothesis
。
pytest 4.1.0 (2019-01-05)¶
移除¶
#2169:
pytest.mark.parametrize
:在以前的版本中,id 函数引发的错误会被抑制并更改为警告。现在,异常会连同 pytest 消息一起传播,告知异常发生的节点、参数值和索引。#3078: 移除遗留的内部警告系统:
config.warn
、Node.warn
。pytest_logwarning
现在在实现时会发出警告。请参阅我们的 文档,了解如何更新代码的信息。
#3079: 移除对 yield 测试的支持 - 它们从根本上被破坏,因为它们不支持 fixtures,因为收集和测试执行是分开的。
请参阅我们的 文档,了解如何更新代码的信息。
#3082: 移除对直接将 marks 应用于
@pytest.mark.parametrize
中的值的支持。请改用pytest.param
。请参阅我们的 文档,了解如何更新代码的信息。
#3083: 移除
Metafunc.addcall
。这是@pytest.mark.parametrize
的前身机制。请参阅我们的 文档,了解如何更新代码的信息。
#3085: 移除对将字符串传递给
pytest.main
的支持。现在,始终传递字符串列表。请参阅我们的 文档,了解如何更新代码的信息。
#3086: 不再支持 setup.cfg 文件中的
[pytest]
部分,请改用[tool:pytest]
。setup.cfg
文件旨在与distutils
一起使用,而名为pytest
的部分一直以来是冲突和 bug 的根源。请注意,对于 pytest.ini 和 tox.ini 文件,该部分仍为
[pytest]
。#3616: 移除
node.Class/Function/Module
的已弃用兼容性属性 - 现在请使用pytest.Class/Function/Module
。请参阅我们的 文档,了解如何更新代码的信息。
#4421: 移除
pytest_namespace
hook 的实现。请参阅我们的 文档,了解如何更新代码的信息。
#4489: 移除
request.cached_setup
。这是现代 fixtures 的前身机制。请参阅我们的 文档,了解如何更新代码的信息。
#4535: 移除已弃用的
PyCollector.makeitem
方法。此方法很久以前被错误地公开。#4543: 移除使用
pytest_funcarg__
前缀定义 fixtures 的支持。请改用@pytest.fixture
装饰器。请参阅我们的 文档,了解如何更新代码的信息。
#4545: 直接调用 fixtures 现在始终是一个错误,而不是警告。
请参阅我们的 文档,了解如何更新代码的信息。
#4546: 移除
Node.get_marker(name)
,其返回值除了存在性检查外不可用。请使用
Node.get_closest_marker(name)
作为替代。#4547: 已移除已弃用的
record_xml_property
fixture,请改用更通用的record_property
。有关更多信息,请参阅我们的 文档。
#4548: 如果在非顶层
conftest.py
文件(即,不在rootdir
中)中定义了pytest_plugins
变量,则现在会引发错误。有关更多信息,请参阅我们的 文档。
#891: 移除
testfunction.markername
属性 - 请使用Node.iter_markers(name=None)
来迭代它们。
弃用¶
#3050: 弃用
pytest.config
全局变量。有关理由,请参阅 pytest.config 全局变量。
#3974: 传递
pytest.raises
的message
参数现在会发出DeprecationWarning
。通常会犯一个常见的错误,认为此参数会匹配异常消息,但实际上它仅用于在
pytest.raises
检查失败时提供自定义消息。为了避免这个错误,并且因为认为它很少被使用,pytest 正在弃用它,目前没有提供替代方案。如果您对此有任何疑虑,请在 #3974 上评论。
#4435: 已弃用
raises(..., 'code(as_a_string)')
和warns(..., 'code(as_a_string)')
。请参阅 使用字符串作为第二个参数的 raises / warns 以了解原理和示例。
功能特性¶
#3191: 现在,当对
None
进行断言时,会发出警告。这是新用户常犯的困惑来源,他们会写成:
assert mocked_object.assert_called_with(3, 4, 5, key="value")
但他们应该写成:
mocked_object.assert_called_with(3, 4, 5, key="value")
因为 mock 对象的
assert_called_with
方法已经执行了断言。当显式检查
None
时,不会发出此警告。像这样的断言:assert variable is None
不会发出警告。
#3632: 针对使用 attrs 或
dataclasses
(Python 3.7+, 向后移植到 3.6) 创建的对象的AssertionError
,提供更丰富的相等性比较内省。#4278:
CACHEDIR.TAG
文件现在在缓存目录内创建。这些文件是 缓存目录标记标准 的一部分,可以被备份或同步程序用来将 pytest 的缓存目录识别出来。
#4292:
pytest.outcomes.Exit
派生自SystemExit
而不是KeyboardInterrupt
。这使我们能够更好地处理pdb
退出。#4371: 更新了
--collect-only
选项,使其在使用--verbose
运行时显示测试描述。#4386: 重构了
ExceptionInfo
对象的构造,并确保不完整的实例具有repr
/str
。#4416: pdb: 为
pdb.set_trace
添加了对关键字参数的支持。它处理
header
的方式与 Python 3.7 类似,并将任何其他关键字参数转发到Pdb
构造函数。这允许使用
__import__("pdb").set_trace(skip=["foo.*"])
。#4483: 添加了 ini 参数
junit_duration_report
,用于选择性地报告测试调用持续时间,排除 setup 和 teardown 时间。JUnit XML 规范和默认的 pytest 行为是在测试持续时间报告中包含 setup 和 teardown 时间。您可以通过将此添加到您的
pytest.ini
文件中,改为仅包含调用持续时间(排除 setup 和 teardown):[pytest] junit_duration_report = call
#4532:
-ra
现在会将错误和失败显示在最后,而不是作为摘要中的第一个项目。这使得更容易获得错误和失败列表,以便有选择地运行测试。
#4599:
pytest.importorskip
现在支持reason
参数,当请求的模块无法导入时,将显示该参数。
Bug 修复¶
改进的文档¶
琐碎/内部更改¶
#4447: 将
--result-log
的弃用类型更改为PytestDeprecationWarning
。已决定在下一个主要版本中删除此功能。
pytest 4.0.2 (2018-12-13)¶
Bug 修复¶
改进的文档¶
#1495: 记录常见的 doctest fixture 目录树结构陷阱
pytest 4.0.1 (2018-11-23)¶
Bug 修复¶
#3952: 再次在 “short test summary info” 之前显示警告,但仍将稍后的警告显示在最后。
#4386: 处理 repr/str 中未初始化的 exceptioninfo。
#4393: 不要在现有的缓存目录中创建
.gitignore
/README.md
文件。#4400: 重新排列 yield 测试错误的警告处理,以便 4.0.x 中的选择退出能正确工作。
#4405: 修复使用
--pyargs
收集 testpaths 的问题。#4412: 修复涉及
Starred
+ 副作用的断言重写。#4425: 确保当给定的
--basetemp
是相对路径时,我们解析绝对路径。
琐碎/内部更改¶
pytest 4.0.0 (2018-11-13)¶
移除¶
#3737: **RemovedInPytest4Warnings 默认情况下现在是错误。**
根据我们尽可能减少中断地移除已弃用功能的计划,所有类型为
RemovedInPytest4Warnings
的警告现在都生成错误而不是警告消息。受影响的功能将在 pytest 4.1 中有效移除,因此请查阅文档中的 弃用和移除 部分,以获取有关如何更新现有代码的指导。
在 pytest
4.0.X
系列中,可以通过将此添加到您的pytest.ini
文件中,将错误改回警告作为权宜之计:[pytest] filterwarnings = ignore::pytest.RemovedInPytest4Warning
但这将在 pytest
4.1
发布后停止工作。如果您对移除特定功能有任何疑虑,请在 #4348 上添加评论。
#4358: 移除
::()
符号以表示节点 ID 中的测试类实例。以前,包含测试实例的节点 ID 将使用
::()
来表示实例,如下所示:test_foo.py::Test::()::test_bar
额外的
::()
对大多数用户来说令人困惑,并且已被删除,因此测试 ID 现在变为:test_foo.py::Test::test_bar
此更改无法像通常在面向用户的功能更改时那样伴随弃用期,因为它实际上不可能检测到何时显式使用了该功能。
额外的
::()
可能已经在内部的某些地方被移除,这导致了在期望它的地方的混乱,例如使用--deselect
(#4127)。测试类实例也不再与
--collect-only
一起列出。
功能特性¶
#4270:
cache_dir
选项使用$TOX_ENV_DIR
作为前缀(如果在环境中设置)。默认情况下,这为每个 tox 环境使用不同的缓存。
Bug 修复¶
#3554: 修复了当调用尚未完成时
CallInfo.__repr__
的问题。
pytest 3.10.1 (2018-11-11)¶
Bug 修复¶
#4287: 修复了调试插件 (pdb) 的嵌套使用,例如与 pytester 的
testdir.runpytest
一起使用。#4304: 如果
cacheprovider
也被阻止,则阻止stepwise
插件,因为一个依赖于另一个。#4306: 将
minversion
解析为实际版本,而不是点分隔的字符串。#4310: 修复了由于多个参数匹配相同的包而导致的重复收集。
#4321: 修复了带有已解析符号链接的
item.nodeid
。#4325: 修复了直接符号链接文件的收集,其中目标与
python_files
不匹配。#4329: 修复了 report_collect 中带有 _collect_report_last_write 的 TypeError。
琐碎/内部更改¶
#4305: 在 test_capture 中用 python 级别语法替换 byte/unicode 助手。
pytest 3.10.0 (2018-11-03)¶
功能特性¶
#2619: 在
__import__("pdb").set_trace()
中使用continue
后恢复捕获输出。这也添加了一个新的
pytest_leave_pdb
钩子,并将pdb
传递给现有的pytest_enter_pdb
钩子。#4147: 添加
--sw
,--stepwise
作为--lf -x
的替代方案,用于在第一次失败时停止,但从该测试开始下一次测试调用。请参阅 文档 以获取更多信息。#4188: 使
--color
在未以 verbose 模式运行时发出彩色点。之前,只有在也传递了--verbose
时,才会对逐个测试的输出进行着色。#4225: 提高在非 quiet 模式下使用终端进行收集报告的性能。
“collecting …” 消息仅每 0.5 秒打印/更新一次。
Bug 修复¶
#2701: 修复了错误的
RemovedInPytest4Warning: usage of Session... is deprecated, please use pytest
警告。#4046: 修复了在包
__init__.py
文件中运行测试的问题。#4260: 吞咽在匿名编译源代码期间的警告。
#4262: 修复了删除由
tmpdir
/tmp_path
创建的陈旧目录时出现的拒绝访问错误。#611: 将 fixture 命名为
request
现在会引发警告:request
fixture 是内部的,不应被覆盖,因为它会导致内部错误。#4266: 处理(忽略)在收集期间引发的异常,例如使用 Django 的 LazySettings 代理类。
改进的文档¶
#4255: 添加了关于传递给过滤器警告的模块名称未进行 regex 转义的事实的缺失文档。
琐碎/内部更改¶
pytest 3.9.3 (2018-10-27)¶
Bug 修复¶
改进的文档¶
#3851: 在
@pytest.mark.parametrize
的文档中添加了对empty_parameter_set_mark
ini 选项的引用
琐碎/内部更改¶
pytest 3.9.2 (2018-10-22)¶
Bug 修复¶
#2909: 改进了检测到 fixture 之间的递归依赖关系时的错误消息。
#3340: 修复了日志消息未在钩子
pytest_sessionstart()
和pytest_sessionfinish()
中显示的问题。#3533: 修复了 JUnit 报告中跳过测试的未转义 XML 原始对象
#3691: Python 2: 安全地格式化关于将 unicode 字符串传递给
warnings.warn
的警告消息,当 monkey patchingwarnings.warn
本身时,可能会导致意外的MemoryError
异常。#4026: 改进了无法确定函数签名时的错误消息。
#4177: 锁定
setuptools>=40.0
以支持setup.cfg
中的py_modules
#4179: 恢复符号链接当前测试运行的 tmpdir 行为。
#4192: 修复了在 python2 下使用
recwarn
时warnings.warn
报告的文件名。
pytest 3.9.1 (2018-10-16)¶
功能特性¶
#4159: 对于包含测试类的测试套件,只有在指定更高 verbosity 级别(至少 “-vv”)时,才会输出关于子类模块的信息。
pytest 3.9.0 (2018-10-15 - 由于发布自动化错误而未发布)¶
弃用¶
#3616: 以下访问已被记录为弃用多年,但现在实际上发出了弃用警告。
通过
Node
实例访问Module
,Function
,Class
,Instance
,File
和Item
。现在用户将收到此警告:usage of Function.Module is deprecated, please use pytest.Module instead
用户应该只
import pytest
并使用pytest
模块访问这些对象。request.cached_setup
,这是 fixture 可用的 setup/teardown 机制的前身。您可以查阅 文档中的 funcarg 比较部分。使用名为
"Class"
的对象来自定义在Collector
子类中收集的节点类型已被弃用。用户应该使用pytest_collect_make_item
在收集期间自定义节点类型。此问题应仅影响创建新收集类型的高级插件,因此如果您看到此警告消息,请联系作者,以便他们可以更改代码。
产生以下消息的警告已更改为
RemovedInPytest4Warning
getfuncargvalue is deprecated, use getfixturevalue
#3988: 为 pytest.ensuretemp 添加弃用警告,因为它已被弃用一段时间。
功能特性¶
#2293: 通过隐藏可能分散注意力和嘈杂的内部细节,改进了使用错误消息。
这有一个副作用,就是以前引发通用错误(例如未注册标记的
ValueError
)的某些错误条件现在引发Failed
异常。#3332: 改进了当
conftest.py
文件无法导入时显示的错误。为了实现这一点,向
ExceptionInfo.getrepr
添加了一个新的chain
参数,以在 Python 3 中显示或隐藏链接的回溯(默认为True
)。#3849: 添加了
empty_parameter_set_mark=fail_at_collect
ini 选项,用于在 parametrize 收集空集时引发异常。#3964: 在启用实时日志记录和/或记录到文件时,会显示在收集阶段生成的日志消息。
#3985: 引入
tmp_path
作为提供 Path 对象的 fixture。还引入tmp_path_factory
作为会话范围的 fixture,用于从任何其他 fixture 或测试创建任意临时目录。#4013: 即使您自己自定义警告过滤器,现在也会显示弃用警告。在以前的版本中,任何自定义都会覆盖 pytest 的过滤器,并且弃用警告将默认回退为隐藏。
#4073: 允许为
Testdir.runpytest_subprocess()
和Testdir.run()
指定超时时间。#4098: 向 pytest.exit() 添加 returncode 参数,以使用特定的返回代码退出 pytest。
#4102: 使用
pytest.warns
重新实现pytest.deprecated_call
,使其支持match='...'
关键字参数。这有一个副作用,
pytest.deprecated_call
现在引发pytest.fail.Exception
而不是AssertionError
。#4149: 需要 setuptools>=30.3 并将大部分元数据移动到
setup.cfg
。
Bug 修复¶
#2535: 改进了当
unittest.TestCase
子类的测试函数使用参数化 fixture 时的错误消息。#3057:
request.fixturenames
现在可以正确返回由request.getfixturevalue()
创建的 fixture 的名称。#3946: 使用
-W
作为命令行选项传递的警告过滤器现在优先于在ini
配置文件中定义的过滤器。#4066: 通过直接使用
textwrap.dedent
修复了源代码重新缩进的问题。#4102:
pytest.warn
将捕获 Python 2 中先前警告过的警告。以前,它们从未被引发。#4108: 解析 args 的符号链接。
这修复了运行
pytest tests/test_foo.py::test_bar
的问题,其中tests
是指向project/app/tests
的符号链接:以前,project/app/conftest.py
将在 fixture 中被忽略。#4132: 修复了使用
--pdb
时重复打印内部错误的问题。#4135: 基于 pathlib 的 tmpdir 清理现在可以正确处理文件夹中的符号链接。
#4152: 遇到
SyntaxWarning
时显示文件名。
改进的文档¶
琐碎/内部更改¶
pytest 3.8.2 (2018-10-02)¶
弃用和移除¶
#4036:
pytest_warning_captured
钩子的item
参数现在被记录为已弃用。我们在3.8
版本发布后才意识到此参数与pytest-xdist
不兼容。我们的政策是在错误修复版本期间不弃用功能,但在这种情况下,我们认为这样做是有意义的,因为我们只是将其记录为已弃用,而没有发出可能破坏测试套件的警告。这将传达给 hook 实现者不应使用此参数的信息。
在未来的版本中,
item
将始终为None
,并且当 hook 实现使用它时,将发出适当的警告。
Bug 修复¶
#3539: 修复断言重写模块的重新加载。
#4034:
TestReport
对象的.user_properties
属性是一个 (name, value) 元组的列表,但有时可能会被实例化为元组的元组。现在它始终是一个列表。#4039: 当使用
--pyargs
时,不再发出关于在非顶层目录中使用pytest_plugins
的警告:当前的--pyargs
机制不可靠,可能会产生误报。#4040: 当使用
-rP
选项时,排除通过测试的空报告。#4051: 改进将无效 Python 表达式传递给
-m
选项时的错误消息。#4056: 如果环境变量名称在 Python 2 上不是
str
,则MonkeyPatch.setenv
和MonkeyPatch.delenv
会发出警告。在 Python 2 中,向
os.environ
添加unicode
键会导致subprocess
(以及可能的其他模块)出现问题,当与from __future__ import unicode_literals
一起使用时,这尤其是一个不易察觉的错误。
改进的文档¶
#3928: 向文档添加 fixture 作用域的可能值。
pytest 3.8.1 (2018-09-22)¶
Bug 修复¶
#3286:
.pytest_cache
目录现在由 Git 自动忽略。希望为其他 SCM 贡献解决方案的用户请查阅/评论此问题。#3749: 修复在包内收集测试期间的以下错误
TypeError: object of type 'Package' has no len()
#3941: 修复间接参数化会考虑测试函数使用的所有 fixture 的作用域来确定参数化作用域的错误,而不仅仅是被参数化的 fixture 的作用域。
#3973: 修复如果测试在之后更改了当前工作目录而没有恢复,断言重写器崩溃的问题。
#3998: 修复当使用
--pdb
进入调试器时,某些 caplog 属性(例如record_tuples
)无法使用的问题。#3999: 修复 python2.x 中的
UnicodeDecodeError
,当类在也包含非 ASCII 文本的断言中返回非 ASCII 二进制__repr__
时。
改进的文档¶
琐碎/内部更改¶
pytest 3.8.0 (2018-09-05)¶
弃用和移除¶
#2452:
Config.warn
和Node.warn
已被弃用,有关理由和示例,请参阅 Config.warn 和 Node.warn。#3936:
@pytest.mark.filterwarnings
的第二个参数不再进行 regex 转义,使其可以真正使用正则表达式来检查警告消息。注意:对匹配字符串进行 regex 转义是一个实现疏忽,可能会破坏依赖于旧行为的测试套件。
功能¶
#2452: 内部 pytest 警告现在使用标准的
warnings
模块发出,使其可以使用标准的警告过滤器来管理这些警告。这引入了PytestWarning
、PytestDeprecationWarning
和RemovedInPytest4Warning
警告类型作为公共 API 的一部分。有关更多信息,请查阅 文档。
#2908: 如果未配置其他警告过滤器,则默认情况下现在显示
DeprecationWarning
和PendingDeprecationWarning
。这使得 pytest 更符合 PEP 506#recommended-filter-settings-for-test-runners。有关更多信息,请参阅 文档。#3251: 现在在测试收集期间捕获并显示警告。
#3784: 设置
PYTEST_DISABLE_PLUGIN_AUTOLOAD
环境变量会禁用插件自动加载。#3829: 向
console_output_style
添加了count
选项,以启用将进度显示为计数而不是百分比。#3837: 为
pytester.RunResult.assert_outcomes
签名添加了对“xfailed”和“xpassed”结果的支持。
Bug 修复¶
改进的文档¶
琐碎/内部更改¶
#3853: 当没有失败的测试时,删除使用
--failed-first
和--last-failed
打印的"run all (no recorded failures)"
消息。
pytest 3.7.4 (2018-08-29)¶
Bug 修复¶
改进的文档¶
#3902: 修复 pytest.org 链接
pytest 3.7.3 (2018-08-26)¶
Bug 修复¶
#3033: teardown 期间的 Fixture 可以再次使用
capsys
和capfd
来检查测试期间捕获的输出。#3773: 如果
__init__.py
文件与python_files
配置选项匹配,则修复从这些文件中收集测试的问题。#3796: 修复连续子包的 fixture 的 teardown 在外部包结束时执行一次的问题。
#3816: 修复
--show-capture=no
选项仍然显示 fixture teardown 期间打印的日志的问题。#3819: 修复当实时 cli 日志记录处于活动状态时,
stdout/stderr
未被捕获的问题。#3843: 修复当使用
test.py::test
语法以及--doctest-modules
一起在命令行中直接指定测试函数时,收集错误的问题。#3848: 修复在 Python 2 上 unicode 参数无法传递给
testdir.runpytest
的错误。#3854: 修复当文件名以大写字母开头时,包内测试被双重收集的问题。
改进的文档¶
琐碎/内部更改¶
pytest 3.7.2 (2018-08-16)¶
Bug 修复¶
#3671: 修复
filterwarnings
未注册为内置标记的问题。#3771: 修复如果
pytest_ignore_collect
hook 返回False
而不是None
,则收集期间发生无限递归的问题。#3774: 修复装饰的 fixture 会丢失功能(例如
@mock.patch
)的错误。#3775: 修复导入带有前缀
pytest_
的模块或其他对象会引发PluginValidationError
的错误。#3788: 修复在
TestCase
子类的 teardown 期间发生AttributeError
的问题,这些子类在__init__
期间引发异常。#3804: 修复具有
__cause__
循环的异常的 traceback 报告。
改进的文档¶
#3746: 为
metafunc.config
添加了文档,该文档之前被错误地隐藏了。
pytest 3.7.1 (2018-08-02)¶
Bug 修复¶
#3473: 如果
approx()
被赋予了它不理解的类型(例如字符串、嵌套字典等)的预期值,则立即引发异常。#3712: 在
approx()
上调用repr()
时,正确表示 numpy 数组的维度。#3742: 修复收集期间与第三方插件的不兼容性,这会产生错误
object has no attribute '_collectfile'
。#3745: 如果
cache_dir
不相对于rootdir
,则显示绝对路径,而不是失败。#3747: 修复插件的兼容性问题以及 fixture 函数直接调用时发出的警告代码。
#3748: 修复
pytest.approx
在numpy<1.13
中使用数组时的无限递归。#3757: 将 pathlib2 锁定到
>=2.2.0
,因为我们需要__fspath__
支持。#3763: 修复 python 3 中断言消息为
bytes
时的TypeError
。
pytest 3.7.0 (2018-07-30)¶
弃用和移除¶
功能¶
#2283: 新的
package
fixture 作用域:fixture 在包的最后一个测试完成时最终确定。此功能被认为是实验性的,因此请谨慎使用。#3576:
Node.add_marker
现在支持append=True/False
参数,以确定标记是最后(默认)还是最先出现。#3579: Fixture
caplog
现在具有messages
属性,提供对格式插值日志消息的便捷访问,而无需格式化程序/处理程序提供的额外数据。#3610: 新的
--trace
选项,用于在测试开始时进入调试器。#3623: 引入
pytester.copy_example
作为助手,用于针对项目中的示例执行验收测试。
Bug 修复¶
改进的文档¶
#3295: 通过在提供的示例中添加缺失的
--last-failed
参数来更正--last-failed-no-failures
的用法文档,因为它们具有误导性,并导致人们认为不需要缺失的参数。
琐碎/内部更改¶
#3519: 现在在
.pytest_cache
中创建了一个README.md
文件,以明确说明该目录存在的原因。
pytest 3.6.4 (2018-07-28)¶
Bug 修复¶
使用
-mpytest
调用 pytest,这样sys.path
就不会被安装在site-packages
中的包污染。 (#742)
改进的文档¶
在 fixture 文档中使用
smtp_connection
而不是smtp
,以避免可能的混淆。 (#3592)
琐碎/内部更改¶
pytest 3.6.3 (2018-07-04)¶
Bug 修复¶
改进的文档¶
现在
@pytest.mark.skipif
示例上方的描述更好地匹配了代码。 (#3611)
琐碎/内部更改¶
pytest 3.6.2 (2018-06-20)¶
Bug 修复¶
改进的文档¶
为
--strict
标志添加文档。 (#3549)
琐碎/内部更改¶
pytest 3.6.1 (2018-06-05)¶
Bug 修复¶
改进的文档¶
在 fixture 文档中添加了关于如何将 fixture 用作工厂的部分。 (#3461)
琐碎/内部更改¶
pytest 3.6.0 (2018-05-23)¶
功能¶
改进了
pytest.mark
实现的内部结构,采用正确的节点处理方式,修复了旧设计导致的一些长期存在的 bug。这引入了新的Node.iter_markers(name)
和Node.get_closest_marker(name)
API。强烈建议 用户阅读 文档中关于改进原因的历史记录,或跳转到关于 更新现有代码以使用新 API 的详细信息。( #3317 )现在,当对同一个函数多次应用
@pytest.fixture
时,会引发ValueError
异常。这种有 bug 的行为会引起令人惊讶的问题,如果它在测试套件中工作,那大多是偶然的。( #2334 )支持 Python 3.7 的内置
breakpoint()
方法,详情请参阅 使用内置 breakpoint 函数。( #3180 )monkeypatch
现在支持context()
函数,该函数充当上下文管理器,撤消在with
代码块内完成的所有 patching 操作。( #3290 )--pdb
选项现在会导致 KeyboardInterrupt 进入调试器,而不是停止测试会话。在 python 2.7 上,再次按 CTRL+C 退出调试器。在 python 3.2 及更高版本上,使用 CTRL+D。( #3299 )当
log-level
参数的数值大于根 logger 的级别时,pytest 不再更改根 logger 的日志级别,这使其在用户代码中更好地与自定义日志配置协同工作。( #3307 )
Bug 修复¶
改进的文档¶
将文档版权年份更改为每次发布时自动更新范围的年份范围。( #3303 )
琐碎/内部更改¶
pytest
现在依赖于 python-atomicwrites 库。( #3008 )将所有 pypi.python.org URL 更新为 pypi.org。( #3431 )
使用内部插件管理器检测以
pytest_
为前缀的 hooks,因为pluggy
正在弃用PluginManager
的implprefix
参数。( #3487 )从
_pytest.compat
而不是直接从collections
导入Mapping
和Sequence
,在python_api.py::approx
中。将Mapping
添加到_pytest.compat
,在 python 2 上从collections
导入它,但在 Python 3 上从collections.abc
导入,以避免在 Python 3.7 或更高版本上出现DeprecationWarning
。( #3497 )
pytest 3.5.1 (2018-04-23)¶
Bug 修复¶
改进的文档¶
修复
caplog
fixture 文档中的拼写错误,该文档错误地将某些属性标识为方法。( #3406 )
琐碎/内部更改¶
当参数化一个参数带有默认值的函数时,添加了更具指示性的错误消息。( #3221 )
删除内部
_pytest.terminal.flatten
函数,转而使用more_itertools.collapse
。( #3330 )从
collections.abc
而不是collections
导入一些模块,因为前者模块在 Python 3.7 中触发DeprecationWarning
。( #3339 )record_property 不再是实验性的,忘记删除警告。( #3360 )
在文档和 CLI 帮助中提及,只有添加
-v
选项时,pytest --fixtures
才会打印带有前导_
的 fixtures。( #3398 )
pytest 3.5.0 (2018-03-21)¶
弃用和删除¶
功能¶
新的
--show-capture
命令行选项,允许指定在测试失败时如何显示捕获的输出:no
、stdout
、stderr
、log
或all
(默认值)。( #1478 )新的
--rootdir
命令行选项,用于覆盖发现根目录的规则。有关详细信息,请参阅文档中的 customize。( #1642 )Fixtures 现在根据其作用域进行实例化,作用域较高的 fixtures (例如
session
) 比作用域较低的 fixtures (例如function
) 先实例化。相同作用域的 fixtures 的相对顺序保持不变,基于其声明顺序及其依赖关系。( #2405 )record_xml_property
重命名为record_property
,现在与 xdist、markers 和任何 reporter 兼容。record_xml_property
名称现在已被弃用。( #2770 )新的
--nf
,--new-first
选项:首先运行新测试,然后运行其余测试,在这两种情况下,测试也按文件修改时间排序,最近修改的文件排在前面。( #3034 )新的
--last-failed-no-failures
命令行选项,允许指定当上次运行没有测试失败时 (或未找到缓存时) 缓存插件的`--last-failed
功能的行为:none
或all
(默认值)。( #3139 )新的
--doctest-continue-on-failure
命令行选项,使 doctests 能够为每个代码片段显示多个失败,而不是在第一次失败时停止。( #3149 )如果
junit_logging
ini 选项设置为system-out
,则捕获的日志消息将添加到生成的 junit xml 文件中的<system-out>
标签中。如果此 ini 选项的值为system-err
,则日志将写入<system-err>
。junit_logging
的默认值为no
,这意味着捕获的日志不会写入输出文件。( #3156 )允许 logging 插件在启用实时日志时处理
pytest_runtest_logstart
和pytest_runtest_logfinish
hooks。( #3189 )在命令行中传递
--log-cli-level
现在会自动激活实时日志记录。( #3190 )添加命令行选项
--deselect
,以允许在收集时取消选择单个测试。( #3198 )捕获的日志在进入 pdb 之前打印。( #3204 )
取消选择的项目计数现在在测试运行之前显示,例如
collected X items / Y deselected
。( #3213 )内置模块
platform
现在可用于pytest.mark
中的表达式。( #3236 )short test summary info 部分现在在终端的 tracebacks 和 warnings 之后显示。( #3255 )
新的
--verbosity
标志,用于显式设置 verbosity 级别。( #3296 )pytest.approx
现在接受将 numpy 数组与标量进行比较。( #3312 )
Bug 修复¶
改进的文档¶
琐碎/内部更改¶
将
attrs
的最低要求更改为17.4.0
。( #3228 )重命名示例目录,以便从基本目录运行时所有测试都通过。( #3245 )
内部
mark.py
模块已转换为包。( #3250 )pytest
现在依赖于 more-itertools 包。( #3265 )当
[pytest]
部分用于通过-c
传递的.cfg
文件中时,添加警告 ( #3268 )nodeids
现在可以显式传递给FSCollector
和Node
构造函数。( #3291 )内部重构
FormattedExcinfo
以使用attrs
功能并删除对旧 Python 版本的旧支持代码。( #3292 )重构以统一内部处理 verbosity 的方式。( #3296 )
内部重构以更好地与 argparse 集成。( #3304 )
修复 doc/en/usage.rst 中调用 fixture 的 python 示例 ( #3308 )
pytest 3.4.2 (2018-03-04)¶
Bug 修复¶
改进的文档¶
将 logging 插件添加到插件列表。( #3209 )
琐碎/内部更改¶
修复 fixture.rst 中的小拼写错误 ( #3259 )
pytest 3.4.1 (2018-02-20)¶
Bug 修复¶
将
doctest.UnexpectedException
的导入移动到顶层,以避免在使用--pdb
时可能发生的错误。( #1810 )添加了在进入 pdb 之前打印捕获的 stdout/stderr 的功能,并改进了一个关于输出捕获的测试,该测试给出了误报。( #3052 )
修复了使用参数化 fixtures 的测试排序,这可能会导致 fixtures 被创建超过必要的次数。( #3161 )
修复了在“test run” hooks 之外的 hooks 中发生 logging 会导致内部错误的问题。( #3184 )
当安装并导入 pypi
mock.patch
时,正确检测由unittest.mock.patch
decorator 注入的参数。( #3206 )当
pytest.raises()
与match=
失败时显示的错误现在更清晰地说明了发生了什么:当没有引发异常时,删除了“matching ‘…’”部分,因为它错误地暗示引发了异常但它不匹配。当引发了错误的异常时,现在会抛出它 (就像没有match=
的pytest.raised()
一样),而不是抱怨不匹配的文本。( #3222 )修复了 macOS 上 doctests 中的输出捕获处理。( #985 )
改进的文档¶
为
pytest.raises
添加match
和message
参数的 Sphinx 参数文档。( #3202 )
琐碎/内部更改¶
pytest 3.4.0 (2018-01-30)¶
弃用和删除¶
所有 pytest 类现在都继承
object
,以获得更好的 Python 2/3 兼容性。除了极少数边缘情况外,这不应影响用户代码。( #2147 )
功能¶
引入
empty_parameter_set_mark
ini 选项,以选择当@pytest.mark.parametrize
给定一个空参数集时要应用的标记。有效选项为skip
(默认) 和xfail
。请注意,计划在未来的版本中将默认值更改为xfail
,因为这被认为不易出错。( #2527 )不兼容的更改: 在社区反馈之后,logging 功能进行了一些更改。有关详细信息,请参阅 logging 文档。( #3013 )
当禁用捕获 (
-s
) 时,控制台输出回退到“经典”模式,否则输出会变得乱码,以至于毫无用处。( #3038 )新的
pytest_runtest_logfinish
hook,在测试项执行完成后调用,类似于pytest_runtest_logstart
。( #3101 )提高使用许多 fixtures 收集测试时的性能。( #3107 )
新的
caplog.get_records(when)
方法,提供对"setup"
、"call"
和"teardown"
测试阶段捕获的记录的访问。( #3117 )新的 fixture
record_xml_attribute
,允许在 JUnit 报告中修改和插入<testcase>
xml 节点上的属性。( #3130 )默认缓存目录已从
.cache
重命名为.pytest_cache
,这是在社区反馈后进行的,社区认为名称.cache
没有明确说明它是由 pytest 使用的。( #3138 )在实时日志输出中,对 levelname 列进行着色。( #3142 )
Bug 修复¶
通过使用 flush() 而不是 wait(),修复 macOS 上挂起的 pexpect 测试。( #2022 )
修复使用
pytester
插件在进程内 pytest 运行后恢复 Python 状态;如果后面的测试依赖于早期的测试泄漏全局解释器更改,这可能会破坏使用多个进程内 pytest 运行的测试。( #3016 )修复在插件 setup hook 之前测试中止时跳过插件报告 hook 的问题。( #3074 )
修复 teardown 期间测试失败时报告的进度百分比。( #3088 )
不兼容的更改:
-o/--override
选项不再吞噬所有剩余的选项,这可能会导致令人惊讶的行为:例如,pytest -o foo=1 /path/to/test.py
将会失败,因为/path/to/test.py
将被视为-o
命令行参数的一部分。由此产生的一个结果是,现在多个配置覆盖需要多个-o
标志:pytest -o foo=1 -o bar=2
。( #3103 )
改进的文档¶
记录不能与
hookwrapper=True
一起使用的 hooks (使用historic=True
定义)。( #2423 )澄清警告捕获默认情况下不会更改警告过滤器。( #2457 )
在使用 pytest_fixture_setup 和返回 None 的 fixture 函数时,澄清一个可能的混淆。( #2698 )
修复了 pytest 中使用的 doctest 标志的句子措辞。( #3076 )
在文档中,对于链接,首选
https://*.readthedocs.io
而不是http://*.rtfd.org
。( #3092 )提高 Getting Started 指南的可读性 (措辞,语法) ( #3131 )
添加注释,说明由于导入缓存,不建议从同一进程多次调用 pytest.main。( #3143 )
琐碎/内部更改¶
pytest 3.3.2 (2017-12-25)¶
Bug 修复¶
改进的文档¶
添加关于多个参数化参数行为的澄清说明 ( #3001 )
琐碎/内部更改¶
pytest 3.3.1 (2017-12-05)¶
Bug 修复¶
修复关于
-p no:<plugin>
无效的问题。( #2920 )修复了 Python 2 中参数包含非字符串的警告回归问题。( #2956 )
在设置
PYTEST_CURRENT_TEST
时,始终转义空字节。( #2957 )修复当实际未收集任何测试时使用
testmon
插件时的ZeroDivisionError
。( #2971 )带回
TerminalReporter.writer
作为TerminalReporter._tw
的别名。此别名在3.3.0
版本中被意外删除。( #2984 )pytest-capturelog
插件现在也被列入黑名单,避免在仍安装该插件的情况下运行 pytest 时出错。( #3004 )
改进的文档¶
修复指向插件
pytest-localserver
的断开链接。( #2963 )
琐碎/内部更改¶
更新
CONTRIBUTING.rst
中的 github “bugs” 链接 ( #2949 )
pytest 3.3.0 (2017-11-23)¶
弃用和删除¶
pytest 不再支持 Python 2.6 和 3.3。这些 Python 版本已经 EOL 一段时间了,并且给 pytest 核心团队带来了维护和兼容性成本,并且在与社区其他成员沟通后,我们决定从这个版本开始不再支持它们。仍然需要这些版本的用户应将 pytest 锁定到
<3.3
。( #2812 )移除内部的
_preloadplugins()
函数。此移除是pytest_namespace()
hook 弃用的一部分。 (#2636)内部更改
CallSpec2
以使用标记列表而不是损坏的关键字映射。 这会移除内部CallSpec2
类的 keywords 属性。 (#2672)移除 ParameterSet.deprecated_arg_dict - 它不是公共 API,缺少下划线是一个命名错误。 (#2675)
移除内部多类型属性
Node._evalskip
并将其替换为布尔值Node._skipped_by_mark
。 (#2767)传递给
pytest.fixture
的params
列表现在在pytest.fixture
调用时被视为不可变和冻结的。 以前,列表可以在 fixture 的首次调用之前更改,从而允许某种形式的动态参数化(例如,从命令行选项更新),但这是一种不需要的实现细节,它使内部结构复杂化并阻止了一些内部清理。 有关详细信息和推荐的解决方法,请参阅 issue #2959。
功能¶
pytest_fixture_post_finalizer
hook 现在可以接收request
参数。 (#2124)在 compat.py 中替换旧的内省代码,该代码使用 Python 3 上的 inspect.signature 和 Python 2 上的 funcsigs.signature 确定 fixture 的可用参数。 这应该尊重函数上的
__signature__
声明。 (#2267)仅报告具有全局
pytestmark
变量的测试一次。 (#2549)现在 pytest 在运行测试时显示总进度百分比。 可以通过将
console_output_style
设置配置为classic
来设置以前的输出样式。 (#2657)通过添加
match
关键字,使warns
签名与raises
匹配。 (#2708)pytest 现在捕获并显示来自标准
logging
模块的输出。 用户可以通过在pytest.ini
、命令行以及使用 markers 在各个测试期间指定选项来控制要捕获的日志级别。 此外,还提供了一个caplog
fixture,使用户可以在特定测试期间测试捕获的日志(类似于capsys
例如)。 有关更多信息,请参阅 logging 文档。 此功能是通过合并流行的 pytest-catchlog 插件引入的,感谢 @thisch。 请注意,在合并期间,已删除与已失效的pytest-capturelog
的向后兼容性接口。 (#2794)向
pytest.skip()
添加allow_module_level
kwarg,从而可以跳过整个模块。 (#2808)允许在 PYTEST_ADDOPTS 中设置
file_or_dir
、-c
和-o
。 (#2824)将 stdout/stderr 捕获结果作为
namedtuple
返回,因此可以通过属性访问out
和err
。 (#2879)添加
capfdbinary
,它是capfd
的一个版本,它从readouterr()
返回字节。 (#2923)添加
capsysbinary
,它是capsys
的一个版本,它从readouterr()
返回字节。 (#2934)实现功能以在使用
--doctest-modules
运行时跳过setup.py
文件。 (#502)
Bug 修复¶
在
capsys/capfd.disabled()
上下文管理器之后恢复输出捕获。 (#1993)现在为所有
conftest.py
文件调用pytest_fixture_setup
和pytest_fixture_post_finalizer
hooks。 (#2124)如果在加载插件时发生异常,pytest 不再隐藏原始回溯。 在 Python 2 中,它将显示原始回溯,并显示一条新消息,解释在哪个插件中。 在 Python 3 中,它将显示 2 个规范化的异常,即加载插件时的原始异常以及 pytest 抛出的关于加载插件的异常。 (#2491)
capsys
和capfd
现在可以被其他 fixtures 使用。 (#2709)内部
pytester
插件正确编码bytes
参数为utf-8
。 (#2738)testdir
现在使用与tmpdir
相同的方法来创建其临时目录。 这稍微改变了testdir
目录的最终结构,但应该不会影响正常使用,并避免了许多潜在问题。 (#2751)pytest 不再抱怨带有 unicode 消息的警告与非 ascii 兼容,即使对于 ascii 兼容的消息也是如此。 因此,带有 unicode 消息的警告首先转换为 ascii 表示形式以确保安全。 (#2809)
当
--maxfail
达到时,将 pytest 命令的返回值从2
(中断)更改为1
(失败)。 (#2845)修复断言重写中的问题,该问题可能导致它重写不应重写的模块。 (#2939)
处理
pytest.ini
中没有描述的 marks。 (#2942)
琐碎/内部更改¶
重构内部 Python 2/3 兼容性代码以使用
six
。 (#2642)停止 vendoring
pluggy
- 我们因为没有获得太多好处而错过了它的最新更改 (#2719)内部重构:通过在新版本的 Python 3 中使用反斜杠替换错误处理程序来简化 ascii 字符串转义。 (#2734)
移除 unittest 插件中不必要的 mark evaluator (#2767)
调用
Metafunc.addcall
现在会发出弃用警告。 此功能计划在pytest-4.0
中移除。 (#2876)参数集提取的内部移动到一个更易于维护的位置。 (#2877)
内部重构以简化 scope node 查找。 (#2910)
配置
pytest
以防止 pip 在不支持的 Python 版本中安装 pytest。 (#2922)
pytest 3.2.5 (2017-11-15)¶
Bug 修复¶
从
pytest
中移除py<1.5
限制,因为这可能会在某些安装中导致版本冲突。 (#2926)
pytest 3.2.4 (2017-11-13)¶
Bug 修复¶
改进的文档¶
pytest 3.2.3 (2017-10-03)¶
Bug 修复¶
改进的文档¶
琐碎/内部更改¶
pytest 3.2.2 (2017-09-06)¶
Bug 修复¶
改进的文档¶
琐碎/内部更改¶
pytest 3.2.1 (2017-08-08)¶
Bug 修复¶
改进的文档¶
明确记录哪些 pytest 功能与
unittest
一起使用。 (#2626)
pytest 3.2.0 (2017-07-30)¶
弃用和移除¶
功能¶
添加对 numpy 数组(和 dicts)对 approx 的支持。 (#1994)
现在,测试函数对象具有
pytestmark
属性,其中包含直接应用于测试函数的 marks 列表,而不是从父类或模块继承的 marks。 (#2516)集合默认忽略本地 virtualenvs;
--collect-in-virtualenv
覆盖此行为。 (#2518)允许装饰为
@staticmethod
的类方法作为测试函数集合的候选对象。 (仅适用于 Python 2.7 及更高版本。Python 2.6 仍将忽略静态方法。)(#2528)引入
mark.with_args
以允许将函数/类作为唯一参数传递给 marks。 (#2540)新的
cache_dir
ini 选项:设置存储缓存插件内容的目录。 目录可以是相对路径或绝对路径:如果是相对路径,则目录是相对于rootdir
创建的,否则按原样使用。 此外,路径可能包含在运行时扩展的环境变量。 (#2543)引入
PYTEST_CURRENT_TEST
环境变量,该变量使用当前正在执行的测试的nodeid
和阶段(setup
、call
和teardown
)设置。 有关更多信息,请参阅 文档。 (#2583)引入
@pytest.mark.filterwarnings
mark,它允许在每个测试、类或模块级别覆盖 warnings 过滤器。 有关更多信息,请参阅 文档。 (#2598)--last-failed
现在永远记住测试何时失败,只有在再次通过时才会忘记它。 这使得通过选择性地运行文件和逐步修复测试来轻松修复测试套件。 (#2621)新的
pytest_report_collectionfinish
hook,允许插件在集合成功完成后向终端报告添加消息。 (#2622)添加了对 PEP 415 的
Exception.__suppress_context__
的支持。 现在,如果raise exception from None
被 pytest 捕获,pytest 将不再在测试报告中链接上下文。 该行为现在与 Python 的回溯行为匹配。 (#2631)pytest.fail
、pytest.skip
和pytest.xfail
引发的异常现在是 BaseException 的子类,使得它们更难被普通代码意外捕获。 (#580)
Bug 修复¶
在
pytester.py.Testdir.popen()
中将stdin
设置为关闭的PIPE
,以避免不需要的交互式pdb
(#2023)在使用
capsys
捕获模式时,向sys.std*
流添加缺少的encoding
属性。 (#2375)修复了如果在
conftest.py
文件中导入colorama
,Windows 上终端颜色更改为黑色的问题。 (#2510)修复了报告跳过测试摘要时的行号。 (#2548)
capture: 确保 EncodedFile.name 是一个字符串。 (#2555)
选项
--fixtures
和--fixtures-per-test
现在将保留 docstrings 中的缩进。 (#2574)doctests 行号现在已正确报告,修复了 pytest-sugar#122。 (#2610)
修复了 fixture 集合顺序中的非确定性。 为 Python 2.6 添加了新的依赖项 (ordereddict)。 (#920)
改进的文档¶
琐碎/内部更改¶
更新
--strict
的帮助消息,以使其清楚它仅处理未注册的 markers,而不是 warnings。 (#2444)内部代码移动:将 pytest.approx/pytest.raises 的代码移动到自己的文件中,以减少 python.py 的大小 (#2489)
将实用程序函数
_pytest.compat._escape_strings
重命名为_ascii_escaped
,以更好地传达该函数的功能。 (#2533)改进带有 skip/skipif 的 CollectError 的错误消息。 (#2546)
仅对每个 generator 发出一次关于
yield
测试已弃用的警告。 (#2562)确保最终收集的行不包含先前写入的 artifacts。 (#2571)
修复了所有 flake8 错误和警告。 (#2581)
添加了
fix-lint
tox 环境,以在代码上运行自动 pep8 修复。 (#2582)在 pytest 自己的测试套件中将 warnings 转换为 errors,以便更及时地捕获由于弃用导致的回归。 (#2588)
在 CHANGELOG 条目中显示多个 issue 链接。 (#2620)
pytest 3.1.3 (2017-07-03)¶
Bug 修复¶
修复 Python 2 中 docstrings 中 doctests 的解码错误。 (#2434)
在 teardown 期间由 finalizers 引发的异常现在被抑制,直到调用所有 finalizers,并重新引发初始异常。 (#2440)
修复了在命令行上指定测试时,不正确的“collected items”报告。 (#2464)
上下文管理器形式的
deprecated_call
现在捕获弃用警告,即使已引发相同的警告。 此外,deprecated_call
将始终生成相同的错误消息(以前,在上下文管理器与函数调用模式下会生成不同的消息)。 (#2469)修复了 pytest 收集的路径可能具有三重前导
/
字符的问题。 (#2475)修复了尝试检测递归回溯的开始时的内部错误。 (#2486)
改进的文档¶
明确说明在第一个非 None 结果之后调用停止的 hooks。 (#2493)
琐碎/内部更改¶
pytest 3.1.2 (2017-06-08)¶
Bug 修复¶
通过
pytest_addoption
添加的必需选项将不再阻止在不传递它们的情况下使用 –help。 (#1999)尊重断言重写中的
python_files
。 (#2121)修复了当回溯中的 frames 包含无法比较的对象(如
numpy
数组)时的递归错误检测。 (#2459)UnicodeWarning
仅在消息包含非 ascii unicode 时从内部 pytest warnings 插件发出(仅限 Python 2)。 (#2463)为 Python 3.6
WindowsConsoleIO
破坏添加了一个解决方法,原因是 Pytests 的FDCapture
。 其他使用控制台句柄的代码可能仍然受到相同问题的影响,并且可能需要进一步的解决方法/修复,即colorama
。 (#2467)
改进的文档¶
修复了指向
pluggy
对象的内部 API 链接。 (#2331)明确指出
pytest.xfail
会在调用点停止测试执行,并改进skipping
文档的整体流程。( #810)
pytest 3.1.1 (2017-05-30)¶
Bug Fixes¶
pytest 警告捕获不再覆盖现有的警告过滤器。之前的行为会覆盖所有过滤器,并在配置警告过滤器以满足其需求的测试套件中引起回归。请注意,作为其副作用,
DeprecationWarning
和PendingDeprecationWarning
默认不再显示。( #2430)修复了 doctest 文本文件中非 ASCII 内容的问题。( #2434)
修复了 Python 2 中 Unicode 警告的编码错误。( #2436)
pytest.deprecated_call
现在可以在上下文管理器形式中捕获PendingDeprecationWarning
。( #2441)
Improved Documentation¶
为变更日志管理添加了 towncrier。( #2390)
3.1.0 (2017-05-22)¶
New Features¶
pytest-warnings
插件已集成到核心中,现在pytest
会在测试会话结束时自动捕获并显示警告。Warning
此功能可能会扰乱应用和处理警告本身的测试套件,并且可以在您的
pytest.ini
中禁用[pytest] addopts = -p no:warnings
有关更多信息,请参阅 warnings documentation page。
感谢 @nicoddemus 的 PR。
添加了
junit_suite_name
ini 选项,用于为 JUnit XML 报告指定根<testsuite>
名称 (#533)。添加了一个 ini 选项
doctest_encoding
,用于指定 doctest 文件使用的编码。感谢 @wheerd 的 PR (#2101)。pytest.raises
现在断言错误消息与带有match
关键字参数的文本或正则表达式匹配。感谢 @Kriechi 的 PR。pytest.param
可用于声明带有标记和测试 ID 的测试参数集。感谢 @RonnyPfannschmidt 的 PR。
Changes¶
删除所有内部对 pytest_namespace hooks 的使用,这是为了准备在 pytest 4.0 中移除 preloadconfig。感谢 @RonnyPfannschmidt 的 PR。
当参数化测试中的可调用 ids 引发异常时,pytest 现在会发出警告。感谢 @fogo 的 PR。
现在可以通过在类体中将
__test__
属性设置为False
来跳过测试类的收集 (#2007)。感谢 @syre 的报告和 @lwm 的 PR。更改 junitxml.py 以生成符合 Junitxml 模式的报告。如果同一个测试在调用中失败,然后在 teardown 中出错,我们会将 testcase 元素拆分为两个,一个包含错误,另一个包含失败。( #2228) 感谢 @kkoukiou 的 PR。
带有
url
属性的 Testcase 报告现在将正确地将其写入 junitxml。感谢 @fushi 的 PR (#1874)。当 verbosity=1 时,从字典比较输出中删除常见项。同时更新截断消息,使其更清楚地表明如果 verbosity < 2,pytest 会截断所有断言消息 (#1512)。感谢 @mattduck 的 PR
--pdbcls
不再暗示--pdb
。这使得可以在pytest.ini
上使用addopts=--pdbcls=module.SomeClass
。感谢 @davidszotten 的 PR (#1952)。修复 #2013: 将 RecordedWarning 转换为
namedtuple
,以便为其提供可理解的 repr,同时防止不必要的修改。修复 #2208: 确保
_pytest.compat.get_real_func
的迭代限制。感谢 @RonnyPfannschmidt 的报告和 PR。现在在收集完成后而不是在加载已安装的插件后立即验证 Hooks。这使得为将在收集期间加载的插件编写 hooks 变得容易,例如使用
pytest_plugins
特殊变量 (#1821)。感谢 @nicoddemus 的 PR。修改
pytest_make_parametrize_id()
hook 以接受argname
作为附加参数。感谢 @unsignedint 的 PR。将
venv
添加到默认的norecursedirs
设置。感谢 @The-Compiler 的 PR。PluginManager.import_plugin
现在在 Python 2 中接受 Unicode 插件名称。感谢 @reutsharabani 的 PR。用占位符替换文档中的次要/补丁级别版本号。这显著减少了变更噪音,因为不同的贡献者在不同的平台上重新生成文档。感谢 @RonnyPfannschmidt 的 PR。
修复 #2391: 考虑所有插件模块上的 pytest_plugins。感谢 @RonnyPfannschmidt 的 PR。
Bug Fixes¶
修复了在 python 3 中使用
capsys
fixture 时sys.stdout.buffer
/sys.stderr.buffer
上的AttributeError
。( #1407)。感谢 @asottile。更改 capture.py 的
DontReadFromInput
类,使其在fileno
方法中抛出io.UnsupportedOperation
错误而不是 ValueErrors (#2276)。感谢 @metasyn 和 @vlad-dragos 的 PR。修复了当异常消息包含非 ASCII 字符时导入模块的异常格式化问题 (#2336)。感谢 @fabioz 的报告和 @nicoddemus 的 PR。
添加了与问题相关的文档 (#1937) 感谢 @skylarjhdownes 的 PR。
允许收集具有任何文件扩展名的文件作为 Python 模块 (#2369)。感谢 @Kodiologist 的 PR。
当收集带有错误参数的 “parametrize” 函数时,显示正确的错误消息 (#2383)。感谢 @The-Compiler 的报告和 @robin0371 的 PR。
3.0.7 (2017-03-14)¶
修复了由于模块在导入失败时静默丢弃其他模块而导致的断言重写中断问题。值得注意的是,导入
anydbm
模块的问题已修复。( #2248)。感谢 @pfhayes 的 PR。junitxml: 修复了 XML 报告中每个 testcase 元素出现两次 system-out 标签的问题。感谢 @kkoukiou 的 PR。
修复了回归,如果使用
--pdb
运行,pytest 现在可以正确跳过 unittest (#2137)。感谢 @gst 的报告和 @mbyt 的 PR。--override-ini
现在可以正确覆盖一些基本选项,例如python_files
(#2238)。感谢 @sirex 的报告和 @nicoddemus 的 PR。根据 PEP 479 (#2160),用简单的
returns
替换代码中raise StopIteration
的用法以完成生成器。感谢 @nicoddemus 的 PR。修复了在测试中引发无法打印的
AssertionError
时发生的内部错误。感谢 @omerhadari 的 PR。无条件
xfail
标记不再依赖于底层测试项是PyobjMixin
的实例,因此可以应用于非内置 python 测试收集器收集的测试。感谢 @barneygale 的 PR。
3.0.6 (2017-01-22)¶
pytest 不再从其自身的操作生成
PendingDeprecationWarning
,这是在版本3.0.5
中错误引入的 (#2118)。感谢 @nicoddemus 的报告和 @RonnyPfannschmidt 的 PR。由
PYTEST_PLUGINS
环境变量加载的插件现在自动被视为用于断言重写 (#2185)。感谢 @nicoddemus 的 PR。改进了 pytest.warns 失败时的错误消息 (#2150)。预期警告的类型和捕获的警告列表已添加到错误消息中。感谢 @lesteve 的 PR。
修复
pytester
内部插件以与最新版本的zope.interface
正确工作 (#1989)。感谢 @nicoddemus 的 PR。pytester
插件的断言语句再次受益于断言重写 (#1920)。感谢 @RonnyPfannschmidt 的报告和 @nicoddemus 的 PR。对于子目录中带有 ini 配置文件的测试,指定带有冒号的测试(如
test_foo.py::test_bar
)现在使用正确的 ini 文件 (#2148)。感谢 @pelme。如果依赖的 pytest 终端输出丢失,则显式失败
testdir.runpytest().assert_outcomes()
。感谢 @eli-b 的 PR。
3.0.5 (2016-12-05)¶
当未将
option=value
正确传递给-o/--override-ini
时添加警告 (#2105)。同时改进了帮助文档。感谢 @mbukatov 的报告和 @lwm 的 PR。现在,如果
--confcutdir
和--junit-xml
分别是目录和文件名,则对其进行正确验证 (#2089 和 #2078)。感谢 @lwm 的 PR。在错误消息中添加提示,提示可能缺少
__init__.py
(#478)。感谢 @DuncanBetts。更准确地描述了 fixture 终结在文档中发生的时间 (#687)。感谢 @DuncanBetts。
为
recwarn.rst
提供:ref:
目标,以便我们可以使用 intersphinx 引用。感谢 @dupuy 的报告和 @lwm 的 PR。在 Python 2 中,在
pytest.approx
的字符串表示中使用简单的+-
ASCII 字符串(例如"4 +- 4.0e-06"
),因为它在 pytest 中的不同上下文和内部表示中处理起来很脆弱,这可能会导致诸如 #2111 之类的错误。在 Python 3 中,表示仍然使用±
(例如4 ± 4.0e-06
)。感谢 @kerrick-lyft 的报告和 @nicoddemus 的 PR。使用
item.Function
、item.Module
等现在会发出弃用警告,请优先使用pytest.Function
、pytest.Module
等 (#2034)。感谢 @nmundar 的 PR。修复了将
approx
与复数一起使用时的错误消息 (#2082)。感谢 @adler-j 的报告和 @nicoddemus 的 PR。修复了由
pytest_plugins
机制多次导入的模块的断言重写 hook 产生的误报警告。感谢 @nicoddemus 的 PR。删除了一个内部缓存,该缓存可能导致子目录中
conftest.py
文件中的 hooks 在其他目录中被错误调用 (#2016)。感谢 @d-b-w 的报告和 @nicoddemus 的 PR。删除了旨在支持早期 Python 3 版本的内部代码,这些代码产生了当 pytest 评估表达式时(例如,将条件作为字符串传递给
pytest.mark.skipif
)在sys.modules
中留下None
的副作用(#2103)。感谢 @jaraco 的报告和 @nicoddemus 的 PR。
3.0.4 (2016-11-09)¶
收集测试模块时的导入错误现在显示完整的追溯信息 (#1976)。感谢 @cwitty 的报告和 @nicoddemus 的 PR。
修复了具有两个或多个
metavar
属性的自定义选项的令人困惑的命令行帮助消息 (#2004)。感谢 @okulynyak 和 @davehunt 的报告和 @nicoddemus 的 PR。加载插件时,包含非 ASCII 消息的导入错误现在在 Python 2 中得到正确处理 (#1998)。感谢 @nicoddemus 的 PR。
修复了在上下文管理器形式中使用
pytest.raises
时的循环引用问题 (#1965)。此外,作为此修复的结果,sys.exc_info()
在上下文管理器和函数调用用法中都留空。以前,即使发生了预期的异常,sys.exc_info
也将包含上下文管理器捕获的异常。感谢 @MSeifert04 的报告和 PR。修复了对于已被重写但后来被
pytest.register_assert_rewrite
显式标记或隐式标记为插件的模块,断言重写 hook 产生的误报警告 (#2005)。感谢 @RonnyPfannschmidt 的报告和 @nicoddemus 的 PR。修复了生成的 xUnit XML 中的 teardown 错误消息。感谢 @gdyuldin 的 PR。
正确处理
multiprocessing
任务中的异常 (#1984)。感谢 @adborden 的报告和 @nicoddemus 的 PR。
3.0.3 (2016-09-28)¶
parametrize
的ids
参数再次接受 Python 2 中的unicode
字符串 (#1905)。感谢 @philpep 的报告和 @nicoddemus 的 PR。现在为开发模式 (
pip install -e
) 中的插件重写断言 (#1934)。感谢 @nicoddemus 的 PR。修复了 Jython 项目中的 pkg_resources 导入错误 (#1853)。感谢 @raquelalegre 的 PR。
摆脱了 Python 3 中的
AttributeError: 'Module' object has no attribute '_obj'
异常 (#1944)。感谢 @axil 的 PR。解释了传递给
@fixture
声明或MetaFunc.parametrize()
调用的错误 scope 值。此版本包含
pluggy-0.4.0
,它可以正确处理插件中的VersionConflict
错误 (#704)。感谢 @nicoddemus 的 PR。
3.0.2 (2016-09-01)¶
改进了将非字符串 ids 传递给
pytest.mark.parametrize
时的错误消息 (#1857)。感谢 @okken 的报告和 @nicoddemus 的 PR。将
buffer
属性添加到 stdin stub 类pytest.capture.DontReadFromInput
感谢 @joguSD 的 PR。修复了与 unicode 字符串比较失败时的
UnicodeEncodeError
。( #1864) 感谢 @AiOO 的 PR。当模块被考虑用于断言重写时,如果
pytest_plugins
定义为字符串(而不是字符串序列),则现在可以正确处理。由于此错误,如果测试套件使用pytest_plugins
加载内部插件,则会重写更多不必要的模块 (#1888)。感谢 @jaraco 的报告和 @nicoddemus 的 PR (#1891)。当启用
--pdb
时,不要从unittest.TestCase
子类运行测试时调用 tearDown 和 cleanups。这允许为所有在其 tearDown 机制中具有重要逻辑的应用程序进行适当的事后调试 (#1890)。感谢 @mbyt 的 PR。修复了内部 doctest 插件中已弃用的
getfuncargvalue
方法的使用。感谢 @ViviCoder 的报告 (#1898)。
3.0.1 (2016-08-23)¶
修复了在模块级别使用
importorskip
时的回归问题 (#1822)。感谢 @jaraco 和 @The-Compiler 的报告和 @nicoddemus 的 PR。修复了在同一调用中将会话 fixture 与普通参数结合使用时的参数化范围问题 (#1832)。感谢 @The-Compiler 的报告、 @Kingdread 和 @nicoddemus 的 PR。
修复了在使用空
ids
参数参数化测试或 fixture 时的内部错误 (#1849)。感谢 @OPpuolitaival 的报告和 @nicoddemus 的 PR。修复了在 zipfile 中嵌入
pytest
时加载器错误。感谢 @mbachry 的 PR。
3.0.0 (2016-08-18)¶
Incompatible changes
在此版本中进行了一些不兼容的更改,目的是删除长期弃用的功能或更改现有行为,以使其不那么令人惊讶/更有用。
现在已删除重新解释模式。只有 plain 和 rewrite 模式可用,因此
--assert=reinterp
选项不再可用。这也意味着从插件或conftest.py
导入的文件默认情况下不会从改进的断言中受益,您应该使用pytest.register_assert_rewrite()
来显式打开这些文件的断言重写。感谢 @flub 的 PR。以下已弃用的命令行选项已被删除
--genscript
: 不再支持;--no-assert
: 使用--assert=plain
代替;--nomagic
: 使用--assert=plain
代替;--report
: 使用-r
代替;
感谢 @RedBeardCode 贡献了 PR (#1664)。
插件中的 ImportError 现在是致命错误,而不是发出 pytest 警告 (#1479)。 感谢 @The-Compiler 贡献了 PR。
移除了对 Python 3 版本低于 3.3 的支持 (#1627)。
移除了所有
py.test-X*
入口点。 版本后缀的入口点从未被记录在文档中,是虚拟环境时代之前的遗留物。 这些入口点还在 wheels 中创建了损坏的入口点,因此移除它们也消除了用户的困惑来源 (#1632)。 感谢 @obestwalter 贡献了 PR。pytest.skip()
现在在用于装饰测试函数时会引发错误,这与它的最初意图(在测试函数内部命令式地跳过测试)相反。 以前,这种用法会导致整个模块被跳过 (#607)。 感谢 @omarkohl 贡献了完整的 PR (#1519)。如果发生收集错误,则退出测试。 一项调查表明,大多数用户在看到收集错误时无论如何都会按下 CTRL-C,因此 pytest 不妨将其作为默认行为 (#1421)。 已添加
--continue-on-collection-errors
选项以恢复以前的行为。 感谢 @olegpidsadnyi 和 @omarkohl 贡献了完整的 PR (#1628)。将 pytest 的
pdb
模块(插件)重命名为debugging
,以避免与内置的pdb
模块冲突。当在运行时请求参数化的 fixture 时(例如使用
request.getfixturevalue
),引发有用的失败消息。 以前,这些参数根本没有定义,因此像@pytest.fixture(params=[0, 1, 2])
这样装饰的 fixture 只运行一次 (#460)。 感谢 @nikratio 提交了 bug 报告,@RedBeardCode 和 @tomviner 贡献了 PR。_pytest.monkeypatch.monkeypatch
类已重命名为_pytest.monkeypatch.MonkeyPatch
,这样它就不会与monkeypatch
fixture 冲突。--exitfirst / -x
现在可以被后续的--maxfail=N
覆盖,并且只是--maxfail=1
的同义词。
新功能
支持 nose 风格的
__test__
属性在类的方法上,包括 unittest 风格的类。 如果设置为False
,则该测试将不会被收集。新的
doctest_namespace
fixture,用于将名称注入到运行 doctest 的命名空间中。 感谢 @milliams 贡献了完整的 PR (#1428)。新的
--doctest-report
选项可用于更改运行(失败)doctest 时 diff 的输出格式 (实现了 #1749)。 感谢 @hartym 贡献了 PR。新的
name
参数添加到pytest.fixture
装饰器,它允许为 fixture 自定义名称(以解决 funcarg-shadowing-fixture 问题)。 感谢 @novas0x2a 贡献了完整的 PR (#1444)。新的
approx()
函数,用于轻松比较测试中的浮点数。 感谢 @kalekundert 贡献了完整的 PR (#1441)。通过访问内部
junitxml
插件(实验性的),可以在最终的 xunit 输出文件中添加全局属性。 感谢 @tareqalayan 贡献了完整的 PR #1454)。新的
ExceptionInfo.match()
方法,用于在异常的字符串表示上匹配正则表达式 (#372)。 感谢 @omarkohl 贡献了完整的 PR (#1502)。__tracebackhide__
现在也可以设置为可调用对象,然后该对象可以根据传递给它的ExceptionInfo
对象来决定是否过滤回溯。 感谢 @The-Compiler 贡献了完整的 PR (#1526)。新的
pytest_make_parametrize_id(config, val)
hook,插件可以使用它为自定义类型提供友好的字符串。 感谢 @palaviv 贡献了 PR。capsys
和capfd
现在有一个disabled()
上下文管理器方法,可用于临时禁用测试中的捕获。 感谢 @nicoddemus 贡献了 PR。新的 cli 标志
--fixtures-per-test
:显示每个选定的测试项正在使用的 fixture。 默认情况下显示 fixture 的文档字符串。 如果与-v
结合使用,还可以显示 fixture 的定义位置。 感谢 @hackebrot 贡献了 PR。引入
pytest
命令作为推荐的入口点。 请注意,py.test
仍然有效,并且不计划移除。 关闭了提案 #1629。 感谢 @obestwalter 和 @davehunt 贡献了完整的 PR (#1633)。新的 cli 标志
--setup-plan
:执行正常的收集并报告潜在的 setup 和 teardown,并且不执行任何 fixture 和测试;--setup-only
:执行正常的收集,执行 fixture 的 setup 和 teardown 并报告它们;--setup-show
:执行正常的测试执行,并额外显示 fixture 的 setup 和 teardown;--keep-duplicates
:py.test 现在忽略命令行中给出的重复路径。 要保留以前的行为(可以通过在命令行中多次指定相同的测试来多次运行),请传递--keep-duplicates
参数 (#1609);
感谢 @d6e, @kvas-it, @sallner, @ioggstream 和 @omarkohl 贡献了 PR。
新的 CLI 标志
--override-ini
/-o
:覆盖 ini 文件中的值。 例如:"-o xfail_strict=True"
’。 感谢 @blueyed 和 @fengxx 贡献了 PR。新的 hooks
pytest_fixture_setup(fixturedef, request)
:执行 fixture setup;pytest_fixture_post_finalizer(fixturedef)
:在 fixture 的 finalizer 之后调用,并且可以访问 fixture 的结果缓存。
对于测试是元组字面量的断言,发出警告。 这样的断言永远不会失败,因为元组总是真值,并且通常是错误的(参见 #1562)。 感谢 @kvas-it 贡献了 PR。
允许传递自定义调试器类(例如
--pdbcls=IPython.core.debugger:Pdb
)。 感谢 @anntzer 贡献了 PR。
变更
插件现在受益于断言重写。 感谢 @sober7, @nicoddemus 和 @flub 贡献了 PR。
将
xpassed
测试的report.outcome
在非严格模式下更改为"passed"
,在严格模式下更改为"failed"
。 感谢 @hackebrot 贡献了 PR (#1795),以及 @gprasad84 提交了报告 (#1546)。用
xfail(strict=False)
(默认值)标记的测试现在在 JUnitXML 报告中显示为通过的测试,而不是跳过的测试。 感谢 @hackebrot 贡献了 PR (#1795)。用
@pytest.fixture
标记的 fixture 现在可以像用@pytest.yield_fixture
装饰器标记的 fixture 一样使用yield
语句。 此更改使得@pytest.yield_fixture
被弃用,并使带有yield
语句的@pytest.fixture
成为编写 teardown 代码的首选方式 (#1461)。 感谢 @csaftoiu 引起了人们的注意,以及 @nicoddemus 贡献了 PR。显式传递的 parametrize id 不会被转义为 ascii (#1351)。 感谢 @ceridwen 贡献了 PR。
当在测试函数中声明了未知的 fixture 时,fixture 现在在错误消息中按字母顺序排序。 感谢 @nicoddemus 贡献了 PR。
pytest_terminal_summary
hook 现在接收测试会话的exitstatus
作为参数。 感谢 @blueyed 贡献了 PR (#1809)。Parametrize id 可以接受
None
作为特定的测试 id,在这种情况下,将使用该参数的自动生成的 id。 感谢 @palaviv 贡献了完整的 PR (#1468)。xunit 风格的 setup/teardown 方法 (
setup_method
,setup_module
等) 的参数现在是可选的,可以省略。 感谢 @okken 引起了人们的注意,以及 @nicoddemus 贡献了 PR。改进了在 parametrize 中出现重复 id 时自动 id 生成选择。 感谢 @palaviv 贡献了完整的 PR (#1474)。
现在默认显示 pytest 警告摘要。 添加了一个新的标志
--disable-pytest-warnings
以显式禁用警告摘要 (#1668)。通过提醒用户检查测试模块/包的名称,使收集期间的 ImportError 更加明确 (#1426)。 感谢 @omarkohl 贡献了完整的 PR (#1520)。
将
build/
和dist/
添加到默认的--norecursedirs
列表中。 感谢 @mikofski 提交了报告,以及 @tomviner 贡献了 PR (#1544)。pytest.raises
在上下文管理器形式中接受自定义的message
,以便在未发生异常时引发。 感谢 @palaviv 贡献了完整的 PR (#1616)。conftest.py
文件现在受益于断言重写; 以前它仅适用于测试模块。 感谢 @flub, @sober7 和 @nicoddemus 贡献了 PR (#1619)。没有任何 doctest 的文本文档不再显示为“跳过”。 感谢 @graingert 报告并提供了完整的 PR (#1580)。
确保当在命令行上与
--pyargs
选项一起指定命名空间包中的模块时,可以找到该模块。 感谢 @taschini 贡献了 PR (#1597)。始终包含完整的断言解释,在断言重写期间。 之前的行为是隐藏碰巧为
False
的子表达式,假设这是冗余信息。 感谢 @bagerard 报告了问题 (#1503)。 感谢 @davehunt 和 @tomviner 贡献了 PR。OptionGroup.addoption()
现在检查是否已添加了选项名称,以便更容易地跟踪诸如 #1618 之类的问题。 以前,您只会从argparse
库中稍后获得异常,而没有给出有关重复添加选项的实际原因的线索。基于
yield
的测试被认为是已弃用的,将在 pytest-4.0 中移除。 感谢 @nicoddemus 贡献了 PR。setup.cfg
文件中的[pytest]
部分现在应命名为[tool:pytest]
,以避免与其他 distutils 命令冲突(参见 #567)。pytest.ini
或tox.ini
文件中的[pytest]
部分仍然受支持且未更改。 感谢 @nicoddemus 贡献了 PR。使用
pytest_funcarg__
前缀声明 fixture 被认为是已弃用的,将在 pytest-4.0 中移除 (#1684)。 感谢 @nicoddemus 贡献了 PR。将命令行字符串传递给
pytest.main()
被认为是已弃用的,并计划在 pytest-4.0 中移除。 建议改为传递参数列表 (#1723)。将
getfuncargvalue
重命名为getfixturevalue
。getfuncargvalue
仍然存在,但现在被认为是已弃用的。 感谢 @RedBeardCode 和 @tomviner 贡献了 PR (#1626)。optparse
类型的使用现在会触发 DeprecationWarnings (#1740)。optparse
向后兼容性支持 float/complex 类型 (#457)。改进了确定
rootdir
的逻辑,仅考虑有效路径,这修复了许多问题: #1594, #1435 和 #1471。 根据当前行为更新了文档。 感谢 @blueyed, @davehunt 和 @matthiasha 贡献了 PR。始终包含完整的断言解释。 之前的行为是隐藏碰巧为 False 的子表达式,假设这是冗余信息。 感谢 @bagerard 报告了问题 (#1503)。 感谢 @davehunt 和 @tomviner 贡献了 PR。
改进了不使用参数化变量时的消息(参见 #1539)。 感谢 @tramwaj29 贡献了 PR。
使用更统一的风格更新了文档字符串。
为启动期间的
pytest.exit(msg)
添加 stderr 写入。 以前,消息从未显示。 感谢 @BeyondEvil 报告了问题 #1210。 感谢 @jgsonesen 和 @tomviner 贡献了 PR。不再显示不正确的测试取消选择原因 (#1372)。 感谢 @ronnypfannschmidt 贡献了 PR。
--resultlog
命令行选项已被弃用:它很少使用,并且有更现代和更好的替代方案(参见 #830)。 感谢 @nicoddemus 贡献了 PR。改进了 fixture 查找错误时的错误消息:在第一行添加了“E”,其余行添加了“>”。 修复了 #717。 感谢 @blueyed 报告问题并提交了 PR,@eolo999 提交了初始 PR,以及 @tomviner 在 EuroPython2016 sprint 期间的指导。
Bug 修复
Parametrize 现在可以正确处理重复的测试 id。
修复了
teardown_method()
缺少method
参数时的内部错误问题 (#1605)。修复了在测试期间当前工作目录 (CWD) 被删除时的异常可视化问题 (#1235)。 感谢 @bukzor 报告了问题。 PR 由 @marscher 贡献。
改进了带有括号的逻辑表达式的测试输出 (#925)。 感谢 @DRMacIver 报告了问题,以及 @RedBeardCode 贡献了 PR。
为以换行符结尾的字符串创建正确的 diff (#1553)。 感谢 @Vogtinator 报告了问题,以及 @RedBeardCode 和 @tomviner 贡献了 PR。
ConftestImportFailure
现在显示回溯,使其更容易识别conftest.py
文件中的错误 (#1516)。 感谢 @txomon 贡献了 PR。没有任何 doctest 的文本文档不再显示为“跳过”。 感谢 @graingert 报告并提供了完整的 PR (#1580)。
修复了带有自定义
__new__
方法的类的收集。 修复了 #1579。 感谢 @Stranger6667 贡献了 PR。修复了 metafunc.parametrize 内部的 scope 覆盖问题 (#634)。 感谢 @Stranger6667 贡献了 PR。
修复了
request.node.warn
中的行数的 off-by-one 错误。 感谢 @blueyed 贡献了 PR。
2.9.2 (2016-05-31)¶
Bug 修复
修复 #510: 跳过一个 parametrize 维度为空的测试,感谢 Alex Stapleton 的报告和 @RonnyPfannschmidt 贡献的 PR
修复 Xfail 不适用于 condition 关键字参数的问题。 感谢 @astraw38 报告了问题 (#1496),以及 @tomviner 贡献的 PR (#1524)。
修复了当在
pytest.main("-c your_absolute_path")
中使用绝对路径放置自定义配置文件时的 win32 路径问题。修复了当引发的错误类不知道 unicode/encoded bytes 时的最大递归深度检测。 感谢 @prusse-martin 贡献了 PR (#1506)。
修复了在严格模式下使用
pytest.mark.skip
标记的问题。 感谢 @pquentin 贡献了 PR,以及 @RonnyPfannschmidt 展示了如何修复该错误。对文档进行了小的改进和修复。 感谢 @omarkohl 贡献了 PR。
修复了
--fixtures
以显示所有 fixture 定义,而不是每个 fixture 名称仅显示一个。 感谢 @hackebrot 贡献了 PR。
2.9.1 (2016-03-17)¶
Bug 修复
改进了插件加载失败时的错误消息。 感谢 @nicoddemus 贡献了 PR。
修复 (#1178): 带有非 ascii 字符的
pytest.fail
引发了内部 pytest 错误。 感谢 @nicoddemus 贡献了 PR。修复 (#469): 当 params ID 包含
::
时,junit 错误地解析 report.nodeid。 感谢 @tomviner 贡献了 PR (#1431)。修复 (#578): 在失败点包含非 ascii 行的 SyntaxError 生成了内部 py.test 错误。 感谢 @asottile 提交了报告,以及 @nicoddemus 贡献了 PR。
修复 (#1437): 当将 bytestring 正则表达式模式传递给 parameterize 时,尝试将其解码为 utf-8,忽略错误。
修复 (#649): 无法指定参数化的测试节点在命令行上运行。
修复 (#138): 更好地报告 python 3.3+ 链式异常
2.9.0 (2016-02-29)¶
新功能
新的
pytest.mark.skip
标记,它无条件地跳过标记的测试。 感谢 @MichaelAquilina 贡献了完整的 PR (#1040)。--doctest-glob
现在可以在命令行中多次传递。 感谢 @jab 和 @nicoddemus 贡献了 PR。新增
-rp
和-rP
报告选项,分别提供通过测试的摘要和完整输出。感谢 @codewarrior0 的 PR。pytest.mark.xfail
现在有一个strict
选项,该选项使XPASS
测试在测试套件中失败(默认为False
)。还有一个xfail_strict
ini 选项,可用于项目范围的配置。感谢 @rabbbit 的请求和 @nicoddemus 的 PR (#1355)。Parser.addini
现在支持bool
类型的选项。感谢 @nicoddemus 的 PR。新增
ALLOW_BYTES
doctest 选项。这会从 doctest 输出中的字节字符串中去除b
前缀(类似于ALLOW_UNICODE
)。感谢 @jaraco 的请求和 @nicoddemus 的 PR (#1287)。在
KeyboardInterrupt
时给出提示,使用--fulltrace
选项来显示错误。修复了 #1366。感谢 @hpk42 的报告和 @RonnyPfannschmidt 的 PR。捕获获取异常源位置时的
IndexError
异常。修复了 pytest 内部错误,该错误发生在动态生成的代码(fixtures 和 tests)中,这些代码的源行是故意伪造的。
变更
重要提示:py.code 已合并到
pytest
仓库中,作为pytest._code
。做出此决定的原因是py.code
在pytest
之外的用途非常少,并且它位于不同的仓库中,使得及时修复其代码中的错误变得困难。团队希望通过此举能够更好地重构和改进该代码。此更改不应影响用户,但如果用户遇到任何奇怪的行为,告知用户是有用的。请记住,
pytest._code
的代码是私有的和实验性的,因此您绝对不应该显式导入它!请注意,原始的
py.code
仍然可以在 pylib 中找到。pytest_enter_pdb
现在可以选择性地接收 pytest config 对象。感谢 @nicoddemus 的 PR。移除了 Python 2.5 或更低版本的代码和文档,包括移除过时的
_pytest.assertion.oldinterpret
模块。感谢 @nicoddemus 的 PR (#1226)。当在环境中找到
CI
或BUILD_NUMBER
时,比较现在始终以完整形式显示,即使未使用-vv
。感谢 @The-Compiler 的 PR。--lf
和--ff
现在支持长名称:分别为--last-failed
和--failed-first
。感谢 @MichaelAquilina 的 PR。为
pytest.raises
失败消息添加了预期异常。仅当在终端中时,Collection 才会显示进度(“collecting X items”)。这避免了在使用
--color=yes
在 CI 集成系统中获取颜色时,输出变得杂乱 (#1397)。
Bug 修复
-s
和-c
选项现在应在xdist
下工作;Config.fromdictargs
现在更忠实地表示其输入。感谢 @bukzor 的完整 PR (#680)。修复 (#1290):在断言重写中支持 Python 3.5 的
@
运算符。感谢 @Shinkenjoe 提供包含测试用例的报告,以及 @tomviner 的 PR。修复 traceback style docs 以描述所有可用的选项 (auto/long/short/line/native/no),其中
auto
是自 v2.6 以来的默认值。感谢 @hackebrot 的 PR。修复 (#1422):junit record_xml_property 不允许多个同名记录。
2.8.7 (2016-01-24)¶
修复 #1338:为 monkeypatch 使用可预测的对象解析
2.8.6 (2016-01-21)¶
修复 #1259:允许在 junitxml 中使用双 nodeid,这是一个回归,导致像 pytest-pep8 + pytest-flakes 这样的插件组合失败
使用启用标准 I/O 捕获的
--pdb
时,解决 pyreadline 中发生的异常。感谢 Erik M. Bray 的 PR。修复 #900:在
monkeypatch
调用的目标引发ImportError
时,提供更好的错误消息。修复 #1292:monkeypatch 调用(setattr、setenv 等)现在是 O(1) 的。感谢 David R. MacIver 的报告和 Bruno Oliveira 的 PR。
修复 #1223:当使用
--pdb
而不是被丢弃时,捕获的 stdout 和 stderr 现在在进入 pdb 之前正确显示。感谢 Cal Leeming 的 PR。修复 #1305:在
pytest_terminal_summary
期间发出的 pytest 警告现在正确显示。感谢 Ionel Maries Cristian 的报告和 Bruno Oliveira 的 PR。修复 #628:修复了 doctest 包含 unicode 时发生的内部 UnicodeDecodeError。感谢 Jason R. Coombs 的报告和 Bruno Oliveira 的 PR。
修复 #1334:在 setup 错误时,将捕获的 stdout 添加到 jUnit XML 报告中。感谢 Georgy Dyuldin 的 PR。
2.8.5 (2015-12-11)¶
修复 #1243:修复了在 collection 期间注入的类属性可能破坏 pytest 的问题。 Alexei Kozlenok 的 PR,感谢 Ronny Pfannschmidt 和 Bruno Oliveira 的审查和帮助。
修复 #1074:预先计算 junitxml chunks 而不是将整个树存储在对象中。感谢 Bruno Oliveira 的报告和 Ronny Pfannschmidt 的 PR
修复 #1238:修复
pytest.deprecated_call()
接收多个参数的问题(2.8.4 中引入的回归)。感谢 Alex Gaynor 的报告和 Bruno Oliveira 的 PR。
2.8.4 (2015-12-06)¶
修复 #1190:当已弃用的函数已被同一模块中的另一个测试调用时,
deprecated_call()
现在可以工作。感谢 Mikhail Chernykh 的报告和 Bruno Oliveira 的 PR。修复 #1198:
--pastebin
选项现在可以在 Python 3 上工作。感谢 Mehdy Khoshnoody 的 PR。修复 #1219:当捕获的输出包含非 ASCII 字符时,
--pastebin
现在可以正确工作。感谢 Bruno Oliveira 的 PR。修复 #1204:另一个在使用 nasty __getattr__() 进行 collection 时出现的错误。感谢 Florian Bruhin 的 PR。
修复了没有运行任何测试时打印的摘要。感谢 Florian Bruhin 的 PR。
修复 #1185 - 确保 MANIFEST.in 与应该放入 sdist 的内容完全匹配
许多关于良好实践的文档现代化。感谢 Bruno Oliveira 的 PR。
2.8.3 (2015-11-18)¶
修复 #1169:在 TestCaseFunction 中为 testcases 添加 __name__ 属性,以支持在函数和方法上使用 @unittest.skip 装饰器。感谢 Lee Kamentsky 的 PR。
修复 #1035:如果测试模块级对象具有 __getattr__(),则进行 tests collection。感谢 Suor 的报告和 Bruno Oliveira / Tom Viner 的 PR。
修复 #331:如果测试的失败无法正确报告(例如,它们是类的可调用实例),则不要进行 tests collection。
修复 #1133:修复了在过滤回溯时发生的内部错误,其中一个条目属于不再可用的文件。感谢 Bruno Oliveira 的 PR。
增强功能,以红色突出显示失败测试的名称,使其在输出中脱颖而出。感谢 Gabriel Reis 的 PR。
在文档中添加更多 talks
扩展关于 –ignore cli 选项的文档
为 setuptools 集成使用 pytest-runner
与 OS X El Capitan 系统完整性保护交互的次要修复(感谢 Florian)
2.8.2 (2015-10-07)¶
修复 #1085:在 Python 2 中将编码的字节字符串传递给 pytest.parametrize 时,正确处理编码错误。感谢 Themanwithoutaplan 的报告和 Bruno Oliveira 的 PR。
修复 #1087:在 Python 3 中将空字节字符串传递给 pytest.parametrize 时,处理 SystemError。感谢 Paul Kehrer 的报告和 Bruno Oliveira 的 PR。
修复 #995:修复了在过滤回溯时发生的内部错误,其中一个条目是由 exec() 语句生成的。感谢 Daniel Hahler、Ashley C Straw、Philippe Gauthier 和 Pavel Savchenko 的贡献,以及 Bruno Oliveira 的 PR。
修复 #1100 和 #1057:使用 autouse fixtures 和 doctest 模块时出现的错误。感谢 Sergey B Kirpichev 和 Vital Kudzelka 的贡献,以及 Bruno Oliveira 的 PR。
2.8.1 (2015-09-29)¶
修复 #1034:在 addhook 中的 pytest_logwarning 调用中添加缺失的 nodeid。感谢 Simon Gomizelj 的 PR。
‘deprecated_call’ 现在仅在 DeprecationWarning 或 PendingDeprecationWarning 的情况下才满足。在 2.8.0 之前,它接受任何警告,而 2.8.0 使其仅接受 DeprecationWarning(但不接受 PendingDeprecationWarning)。感谢 Alex Gaynor 提出的问题和 Eric Hunsberger 的 PR。
修复问题 #1073:避免在潜在的插件对象上调用 __getattr__。这修复了与 pytest-django 的不兼容性。感谢 Andreas Pelme、Bruno Oliveira 和 Ronny Pfannschmidt 的贡献,以及 Holger Krekel 的修复。
修复问题 #704:更优雅地处理插件加载期间的 versionconflict。感谢 Bruno Oliveira 的 PR。
修复问题 #1064:当与 “pytest-xdist” 插件一起使用时,“”–junitxml” 回归,测试报告被分配给错误的测试。感谢 Daniel Grunwald 的报告和 Bruno Oliveira 的 PR。
(实验性)采用更多 SEMVER 风格的版本控制,并更改 git 仓库中 master 分支的含义:“master” 分支现在保留 bug 修复,旨在进行微版本发布的更改。“features” 分支将仅在 pytest 的次要或主要版本发布时发布。
修复问题 #766,移除对 distutils 的文档引用。感谢 Russel Winder。
修复问题 #1030:现在对字节字符串进行转义以生成项目 node id,使其始终可序列化。感谢 Andy Freeland 的报告和 Bruno Oliveira 的 PR。
Python 2:如果 unicode 参数化值可转换为 ascii,则其 ascii 表示形式用于 node id。
修复问题 #411:向断言比较示例添加 __eq__ 方法。感谢 Ben Webb。
修复问题 #653:deprecated_call 可以用作上下文管理器。
修复问题 877:正确处理带有非 ascii repr 的断言解释。感谢 Mathieu Agopian 的报告和 Ronny Pfannschmidt 的 PR。
修复问题 1029:将写入缓存值时的错误转换为 pytest-warnings
2.8.0 (2015-09-18)¶
新的
--lf
和-ff
选项,用于仅运行上次失败的测试或从上次运行中“首先运行失败的测试”。此功能通过将以前外部的 pytest-cache 插件移植到 pytest 核心中来提供。向后不兼容:如果您使用 pytest-cache 的功能在测试运行之间持久化数据,请注意我们不再序列化集合。感谢 Ronny Pfannschmidt 完成了大部分合并工作。“-r” 选项现在接受 “a” 以包含所有可能的报告,类似于显式传递 “fEsxXw”(issue960)。感谢 Abhijeet Kasurde 的 PR。
通过引入特定于版本的检查 helper 来避免 python3.5 弃用警告,感谢 Michael Droettboom。
修复 issue562:@nose.tools.istest 现在完全被尊重。
修复 issue934:当字符串比较失败且 diff 太大而无法显示(未传递 -vv 时),仍然显示 diff 的几行。感谢 Florian Bruhin 的报告和 Bruno Oliveira 的 PR。
修复 issue736:修复了当 fixture 参数与参数化标记组合使用时会被丢弃的错误。感谢 Markus Unterwaditzer 的 PR。
修复 issue710:引入 ALLOW_UNICODE doctest 选项:启用后,
u
前缀将从预期 doctest 输出中的 unicode 字符串中去除。这允许使用 unicode 的 doctest 在 Python 2 和 3 中不变地运行。感谢 Jason R. Coombs 的报告和 Bruno Oliveira 的 PR。parametrize 现在还为 enum、regex 和 class 对象(而不是类实例)生成有意义的测试 ID。感谢 Florian Bruhin 的 PR。
添加 ‘warns’ 以断言是否抛出警告(如 ‘raises’)。感谢 Eric Hunsberger 的 PR。
修复 issue683:不要应用已应用的 mark。感谢 ojake 的 PR。
更好地处理捕获失败,以便更少的异常丢失到 /dev/null。感谢 David Szotten 的 PR。
修复 issue730:弃用并警告 –genscript 选项。感谢 Ronny Pfannschmidt 的报告和 Christian Pommranz 的 PR。
修复 issue751:如果 parametrize 使用两个或多个测试方法参数化类,则会出现 ids 错误。感谢 Sergey Chipiga 的报告和 Jan Bednarik 的 PR。
修复 issue82:默认情况下,避免从 setup.cfg/pytest.ini/tox.ini 文件及其向上加载 conftest 文件(仍然可以设置 –confcutdir 来覆盖此设置)。感谢 Bruno Oliveira 的 PR。
修复 issue768:在 python 模块中找到的 docstrings 未设置 session fixtures。感谢 Jason R. Coombs 的报告和 Bruno Oliveira 的 PR。
添加了
tmpdir_factory
,这是一个会话范围的 fixture,可用于在基本临时目录下创建目录。以前,此对象作为config
对象的_tmpdirhandler
属性安装,但现在它是官方 API 的一部分,使用config._tmpdirhandler
已被弃用。感谢 Bruno Oliveira 的 PR。修复 issue808:pytest 的内部断言重写 hook 现在实现了可选的 PEP 302 get_data API,以便测试可以访问它们旁边的数据文件。感谢 xmo-odoo 的请求和示例,以及 Bruno Oliveira 的 PR。
rootdir 和 inifile 现在在用法错误期间显示,以帮助用户诊断问题,例如意外的 ini 文件,这些文件添加了 pytest 拾取的未知选项。感谢 Pavel Savchenko 在 #821 中引起注意,以及 Bruno Oliveira 的 PR。
摘要栏现在对于警告情况(例如:所有测试都被跳过或 xpass/xfailed,或根本没有运行任何测试)显示为黄色(这是 issue500 的部分修复)。
修复 issue812:在根本没有运行任何测试的情况下,例如命令行中给定的目录不包含任何测试,或者由于命令行选项过滤掉所有测试(例如 -k),pytest 现在以状态代码 5 退出。感谢 Eric Siegerman (issue812) 和 Bruno Oliveira 的 PR。
摘要栏现在对于警告情况(例如:所有测试都被跳过或 xpass/xfailed,或根本没有运行任何测试)显示为黄色(与 issue500 相关)。感谢 Eric Siegerman。
新的
testpaths
ini 选项:从根目录执行 pytest 时,要搜索测试的目录列表。当项目具有明确指定的测试目录时,这可以用于加速测试 collection,通常比为所有不包含测试的目录配置 norecursedirs 更实用。感谢 Adrian 的想法 (#694) 和 Bruno Oliveira 的 PR。修复 issue713:doctest 失败的 JUnit XML 报告。感谢 Punyashloka Biswal。
修复 issue970:内部 pytest 警告现在在终端中显示为 “pytest-warnings” 而不是 “warnings”,因此用户可以清楚地知道这些警告来自 pytest 而不是内置的 “warnings” 模块。感谢 Bruno Oliveira。
在 junitxml 测试持续时间中包含 setup 和 teardown。感谢 Janne Vanhala。
修复 issue735:Python 3.4+ 调试版本上的断言失败
新选项
--import-mode
允许更改测试模块导入行为以附加到 sys.path 而不是前置。即使被测软件包具有相同的导入根,这也更好地允许针对软件包的已安装版本运行测试模块。在这个例子中testing/__init__.py testing/test_pkg_under_test.py pkg_under_test/
当使用
--import-mode=append
时,测试将针对 pkg_under_test 的已安装版本运行,而默认情况下,它们将始终选择本地版本。感谢 Holger Krekel。pytester:添加方法
TmpTestdir.delete_loaded_modules()
,并从inline_run()
调用它,以允许重新加载临时模块。感谢 Eduardo Schettino。内部重构 pluginmanager API 和代码,以便在 pytest 不相关的简单 pluginmanager 和 PytestPluginManager 之间有明确的区别,PytestPluginManager 添加了许多行为,其中包括处理本地 conftest 文件。就文档化的方法而言,这是一个向后兼容的更改,但它可能仍然会破坏依赖于细节(特别是 pluginmanager.add_shutdown() API)的第三方插件。感谢 Holger Krekel。
pluginmanagement:引入
pytest.hookimpl
和pytest.hookspec
装饰器,用于设置 impl/spec 特定参数。这替代了以前已弃用的pytest.mark
的使用,pytest.mark
旨在仅包含测试函数的 markers。编写/改进 “writing plugins” 的文档,这些文档现在有自己的页面,并且与 “using/installing plugins” 页面分开。
修复 issue732:正确地从任何 hook 调用站点取消注册插件,允许在测试执行期间拥有临时插件。
弃用并警告 hook 实现中的
__multicall__
参数。请改用 pytest-2.7 中已引入的hookwrapper
机制。通过默认使用 inprocess 测试来大大加快 pytest 自身的测试套件速度(可以通过 –runpytest=subprocess 修改 testrun,以便在许多地方创建子进程)。在测试中运行 pytest 的主要 API 是 “runpytest()” 或 “runpytest_subprocess” 以及 “runpytest_inprocess”(如果您需要特定的运行测试方式)。在所有情况下,您都会获得 RunResult,但 inprocess 的 RunResult 还将具有带有记录的事件/报告的 “reprec” 属性。
修复 monkeypatch.setattr(“x.y”, raising=False) 以在 “y” 不是预先存在的属性时实际不引发异常。感谢 Florian Bruhin。
修复 issue741:使来自 testdir.run 的运行输出可复制/粘贴。感谢 Bruno Oliveira。
添加新的
--noconftest
参数,该参数忽略所有conftest.py
文件。向 JUnit-XML 输出添加
file
和line
属性。修复 issue890:将所有文档文件的扩展名从
txt
更改为rst
。感谢 Abhijeet 的 PR。修复 issue714:添加在特定 argnames 上应用 indirect=True 参数的功能。感谢 Elizaveta239。
修复 issue890:将所有文档文件的扩展名从
txt
更改为rst
。感谢 Abhijeet 的 PR。修复 issue957:“# doctest: SKIP” 选项现在会将 doctest 注册为 SKIPPED 而不是 PASSED。感谢 Thomas Grainger 的报告和 Bruno Oliveira 的 PR。
issue951:添加新的 record_xml_property fixture,该 fixture 支持在 xml 输出上记录其他信息。感谢 David Diaz 的 PR。
issue949:现在正确使用普通选项(例如
-s
、-v
等)之后的路径来发现rootdir
和ini
文件。感谢 Peter Lauri 的报告和 Bruno Oliveira 的 PR。
2.7.3 (2015-09-15)¶
允许在
importorskip
中使用 ‘dev’、‘rc’ 或其他非整数版本字符串。感谢 Eric Hunsberger 的 PR。修复 issue856:在所有输出(例如 –fixtures)中考虑 –color 参数。感谢 Barney Gale 的报告和 Bruno Oliveira 的 PR。
修复 issue855:将 str 对象作为
plugins
参数传递给 pytest.main 现在被解释为要导入并注册为插件的模块名称,而不是静默地不起作用。感谢 xmo-odoo 的报告和 Bruno Oliveira 的 PR。修复 issue744:修复 Python 3.5+ 中的 ast.Call 更改。感谢 Guido van Rossum、Matthias Bussonnier、Stefan Zimmermann 和 Thomas Kluyver。
修复 issue842:在类中应用 markers 不再将此 markers 传播到也具有 markers 的超类。感谢 xmo-odoo 的报告和 Bruno Oliveira 的 PR。
在调用 pytest.deprecated_call 后保留 warning 函数。感谢 Pieter Mulder 的 PR。
修复 issue854:定义为 unittest.TestCase 子类的类成员的 autouse yield_fixtures 现在按预期工作。感谢 xmo-odoo 的报告和 Bruno Oliveira 的 PR。
修复 issue833:–fixtures 现在显示收集的测试文件的所有 fixtures,而不仅仅是第一个文件中声明的 fixtures。感谢 Florian Bruhin 的报告和 Bruno Oliveira 的 PR。
修复 issue863:当使用多个 markers 时,如果满足 skip/xfail 条件,则跳过的测试现在报告正确的理由。感谢 Raphael Pierzina 的报告和 Bruno Oliveira 的 PR。
优化的 tmpdir fixture 初始化,这应该使测试会话更快(尤其是在使用 pytest-xdist 时)。唯一可见的效果是,现在 pytest 在 $TEMP 目录中使用子目录来存储此 fixture 创建的所有目录(默认为 $TEMP/pytest-$USER)。感谢 Bruno Oliveira 的 PR。
2.7.2 (2015-06-23)¶
修复 issue767:pytest.raises value 属性不包含 Python 2.6 上的异常实例。感谢 Eric Siegerman 提供测试用例和 Bruno Oliveira 的 PR。
自动为 junitxml 和 results log 创建目录。感谢 Aron Curzon。
修复 issue713:doctest 失败的 JUnit XML 报告。感谢 Punyashloka Biswal。
修复 issue735:Python 3.4+ 调试版本上的断言失败。感谢 Benjamin Peterson。
修复 issue114:skipif marker 报告给内部 skipping 插件;感谢 Floris Bruynooghe 的报告和 Bruno Oliveira 的 PR。
修复 issue748:unittest.SkipTest 报告给内部 pytest unittest 插件。感谢 Thomas De Schampheleire 的报告和 Bruno Oliveira 的 PR。
修复 issue718:无法在 python 2 中创建包含不可排序元素的集合的表示形式。感谢 Edison Gustavo Muenz。
修复 issue756,修复 issue752(和类似问题):依赖于 py-1.4.29,它具有改进的回溯生成算法。
2.7.1 (2015-05-19)¶
修复 issue731:在折叠 False 解释时,不要被对象 repr 中可能存在且不平衡的括号混淆。感谢 Carl Meyer 的报告和测试用例。
修复 issue553:正确处理 FixtureLookupError 中的 inspect.getsourcelines 失败,这会导致内部错误,混淆原始问题。感谢 talljosh 的初始诊断/补丁和 Bruno Oliveira 的最终补丁。
修复 issue660:独立于 fixture 参数的顺序,正确报告 scope-mismatch-access 错误。还要避免 pytest 内部回溯,该回溯不向用户提供信息。感谢 Holger Krekel。
简化并记录了发布过程。此外,所有版本(在 setup.py 和文档生成中)现在都从 _pytest/__init__.py 中读取。感谢 Holger Krekel。
修复了文档,以删除 yield-fixtures 是实验性的概念。它们会一直存在 :) 感谢 Bruno Oliveira。
支持通过对 requirements 使用环境 markers 来构建 wheels。感谢 Ionel Maries Cristian。
修复了回归到 2.6.4 的问题,例如,当测试引发 SystemExit 时,stdout 捕获打印丢失。感谢 Holger Krekel。
重新引入了 pytester 插件的 _pytest fixture,pytest-xdist 至少使用了它。
2.7.0 (2015-03-26)¶
修复 issue435:使 reload() 在断言重写处于活动状态时工作。感谢 Daniel Hahler。
修复 issue616:现在可以正确考虑 conftest.py 文件及其包含的 fixture 的可见性,而无需考虑当前工作目录和使用的测试参数。非常感谢 Eric Siegerman 及其 PR235,其中包含针对 conftest 可见性的系统测试,现在已通过。此更改还引入了
rootdir
的概念,该概念作为新的 pytest 标头打印并在 pytest 自定义网页中记录。更改了“diverted”测试的报告,即在一个文件中收集但在另一个文件中实际出现的测试(例如,当测试类中的测试来自不同文件中的基类时)。我们现在显示 nodeid,并通过后缀指示另一个文件。
添加了通过环境变量 PYTEST_ADDOPTS 设置命令行选项的功能。
添加了关于 bitbucket 和 github 上新的 pytest-dev 团队的文档。请参阅 https://pytest.pythonlang.cn/en/stable/contributing.html 。感谢 Anatoly 推动并为此进行了初步工作。
修复 issue650:新选项
--doctest-ignore-import-errors
将把 doctest 中的导入错误转换为跳过。感谢 Charles Cloud 完成了 PR。修复 issue655:解决了导致 python2/3 将 sys.exc_info 泄漏到 fixture/测试中的不同方式,从而导致第三方代码中的失败
修复 issue615:断言重写在格式化布尔运算时未正确转义 % 符号,这在将布尔值与模运算符混合使用时会出错。感谢 Tom Viner 的报告、分类和修复。
实现 issue351:添加了将参数化 ID 指定为可调用对象的功能,以生成自定义测试 ID。感谢 Brianna Laugher 的想法和实现。
引入并记录了新的 hookwrapper 机制,该机制对于想要包装某些 hook 的执行以达到其目的的插件非常有用。这取代了 pytest 本身和一些外部插件使用的未记录的
__multicall__
协议。请注意,pytest-2.8 计划放弃支持旧的__multicall__
,而仅支持 hookwrapper 协议。大幅加快插件 hook 的调用速度
在内置 pytest 插件中使用 hookwrapper 机制。
为 doctest 标志添加了 doctest ini 选项,感谢 Holger Peters。
在文档中添加注释,如果您要标记参数并且该参数是可调用对象,则还需要传入一个原因,以将其与“装饰器”情况区分开来。感谢 Tom Viner。
“python_classes”和“python_functions”选项现在支持用于测试发现的 glob 模式,如 issue600 中讨论的那样。感谢 Ldiary Translations。
允许使用非参数化的 fixture 覆盖参数化的 fixture,反之亦然 (bubenkoff)。
修复 issue463:为 ‘parameterize’ 拼写错误引发特定错误 (pfctdayelise)。
在失败时,将设置
sys.last_value
、sys.last_type
和sys.last_traceback
,以便用户可以通过事后调试来检查错误 (almarklein)。
2.6.4 (2014-10-24)¶
通过使用 ndiff 和 pprint,改进了关于可迭代对象的断言失败报告。
从源代码树中删除了过时的日语文档。
“pytest_addhooks” hook 的文档。感谢 Bruno Oliveira。
更新了插件索引文档。感谢 Bruno Oliveira。
修复 issue557:使用 “-k” 时,我们仅允许旧样式 “-” 用于字符串开头的否定,即使这样也已弃用。请改用 “not”。这应该允许选择参数化测试,其中 “-” 出现在参数中。
修复 issue604:转义断言消息中的 % 字符。
修复 issue620:在 –genscript 目标中添加关于二进制 blob 含义的解释。感谢 Dinu Gherman。
修复 issue614:修复了 pastebin 支持。
修复 issue620:在 –genscript 目标中添加关于二进制 blob 含义的解释。感谢 Dinu Gherman。
修复 issue614:修复了 pastebin 支持。
2.6.3 (2014-09-24)¶
修复 issue575:xunit-xml 将收集错误报告为失败而不是错误,感谢 Oleg Sinyavskiy。
修复 issue582:修复 setuptools 示例,感谢 Laszlo Papp 和 Ronny Pfannschmidt。
修复了序列化 capture.EncodedFile 时的无限递归错误,感谢 Uwe Schmitt。
修复 issue589:修复了在显示异常时与 numpy 和其他库的不良交互。检查精确的 “maximum recursion depth exceed” 异常,而不是假定任何 RuntimeError 都是该异常(在 py dep 中实现)。感谢 Charles Cloud 分析了该问题。
修复了与 conftest 相关的 fixture 可见性问题:当在测试包外部的 CWD 中运行时,pytest 会错误地进行 fixture 发现。感谢 Wolfgang Schnerring 找到了可重现的示例。
引入 pytest_enter_pdb hook(例如,pytest_timeout 需要它在交互式进入 pdb 时取消超时)。感谢 Wolfgang Schnerring。
也使用非 python 函数测试项检查 xfail/skip。感谢 Floris Bruynooghe。
2.6.2 (2014-09-05)¶
添加了函数 pytest.freeze_includes(),它使得使用 cx_freeze 等工具将 pytest 嵌入到可执行文件中变得容易。有关示例和原理,请参见文档。感谢 Bruno Oliveira。
提高了断言重写缓存失效的精度。
修复了 issue561:为 python3 调整了 autouse fixture 示例。
修复了 issue453:__repr__ 包含 “n{”、“n}” 和 “n~” 的断言重写问题。
修复 issue560:如果 “else:” 或 “finally:” 后跟同一行上的语句,则正确显示代码。
修复了 monkeypatch 文档中的示例,感谢 t-8ch。
修复 issue572:更正了 python3 的 tmpdir 文档示例。
不要标记为 universal wheel,因为 Python 2.6 与其他构建版本不同,因为它有额外的 argparse 依赖项。修复了 issue566。感谢 sontek。
实现 issue549:用户提供的断言消息现在不再替换 py.test 内省消息,而是在其基础上显示。
2.6.1 (2014-08-07)¶
不再在 –verbose 输出中显示行号,输出现在纯粹是 nodeid。行号仍然在失败报告中显示。感谢 Floris Bruynooghe。
修复了 issue437,其中断言重写可能导致 pytest-xdist worker 节点收集不同的测试。感谢 Bruno Oliveira。
修复 issue555:向 capture-streams 添加 “errors” 属性,以满足某些 distutils 和可能访问 sys.stdout.errors 的其他代码。
修复 issue547 capsys/capfd 在禁用输出捕获 (“-s”) 时也有效。
解决 issue170:允许 pytest.mark.xfail(…) 通过可选的 “raises=EXC” 参数指定预期异常,其中 EXC 可以是单个异常或异常类元组。感谢 David Mohr 完成了 PR。
修复了 pytest 与 unittest.mock.patch 装饰器集成的问题,当它使用 “new” 参数时。感谢 Nicolas Delaby 的测试和 PR。
修复了如果参数包含 “::” 节点 ID 规范(从 “-v” 输出复制粘贴)时检测 conftest 文件的问题
修复 issue544,仅在 “::” 分隔部分的末尾删除 “@NUM”,并且如果该部分具有 “.py” 扩展名
不要使用 py.std 导入助手,而是直接导入内容。感谢 Bruno Oliveira。
2.6¶
根据 fixture 的作用域缓存来自 fixture 的异常 (issue 467)。
修复 issue537:默认情况下避免导入旧的断言重新解释代码。
修复 issue364:默认情况下缩短并增强了追溯表示。新的 “–tb=auto” 选项(默认)将仅显示第一个和最后一个条目的长追溯。您可以使用 “–tb=long” 获取打印所有条目作为长条目的旧行为。默认情况下,短条目现在的打印方式与 “–tb=native” 非常相似。
修复 issue514:教导断言重新解释关于私有类属性的知识
更改 -v 输出以包含测试的完整节点 ID。用户可以从测试运行中复制节点 ID(包括行号),并将其用作位置参数,以便仅运行单个测试。
修复 issue 475:如果在调用 pytest.raises 时异常类型错误,则尽早且易于理解地失败。
修复 issue516:在入门指南中告知当前依赖项。
稍微清理了 setup.py 并指定了支持的版本。感谢 Jurko Gospodnetic 的 PR。
当使用 -v 运行测试时,将 XPASS 颜色更改为黄色而不是红色。
修复 issue473:解决了 mock 在双重修补时将未绑定方法放入类字典中的问题。
修复 issue498:如果 fixture finalizer 失败,请确保 fixture 仍然无效。
修复 issue453:pytest_assertrepr_compare hook 的结果现在对其换行符进行了转义,以便 format_exception 不会崩溃。
内部新的警告系统:当 pytest 检测到您的测试收集或执行中的异常时,现在将生成警告。警告最终会发送到新的 pytest_logwarning hook,该 hook 当前仅由终端插件实现,该插件在摘要行中显示警告,并在指定 -rw(报告警告)时显示更多详细信息。
对于具有 __init__ 的测试类以及测试模块中看起来像测试但不是函数的调用对象,将跳过更改为警告。
修复 issue436:通过使用 parse_known_args 的结果而不是以前不稳定的启发式方法,改进了从命令行参数中查找初始 conftest 文件的方法。感谢 Marc Abramowitz 在此领域的测试和初步修复方法。
修复 issue #479:在测试模块的收集/加载期间正确处理 nose/unittest(2) SkipTest 异常。感谢 Marc Schlaich 完成了 PR。
修复 issue490:在文档中包含 pytest_load_initial_conftests 并改进文档字符串。
修复 issue472:阐明如果
pytest.config.getvalue()
在命令行解析之前触发,则无法工作。合并 PR123:改进了与测试中 mock.patch 装饰器的集成。
修复 issue412:现在可以捕获对 stdout/stderr FD 级别流的干扰而不会崩溃。
修复 issue483:trial/py33 现在可以正常工作。感谢 Daniel Grana 的 PR。
改进了 pytest 与 “python setup.py test” 集成的示例,该示例现在具有通用的 “-a” 或 “–pytest-args” 选项,您可以在其中传递其他选项作为带引号的字符串。感谢 Trevor Bekolay。
简化了内部捕获机制,并使其对于测试或设置更改 FD1/FD2 更加健壮,并且现在更好地与单个测试中的 pytest.pdb() 集成。
改进了 pytest 自身测试套件泄漏检测,感谢 Marc Abramowitz 的 PR
修复 issue492:避免 test_writeorg 中的泄漏。感谢 Marc Abramowitz。
修复 issue493:不要在 doc 目录中使用
python setup.py test
运行测试(为此使用 tox -e doctesting)修复 issue486:更好地报告和处理早期 conftest 加载失败
对内部 conftest 处理进行了一些清理和简化。
在捕获异常时,更加努力地打破引用循环。感谢 Jurko Gospodnetic。
修复 issue443:修复 skip 示例以使用正确的比较。感谢 Alex Groenholm。
支持模块、类和函数(包括 unittest 样式的类)上的 nose 样式
__test__
属性。如果设置为 False,则不会收集测试。修复 issue512:对于 monkeypatch 插件中可能未设置的参数,显示 “<notset>”。改进了文档中的输出。
2.5.2 (2014-01-29)¶
修复 issue409 – 通过不尝试从 collections.abc 导入来更好地与 cx_freeze 互操作,这会导致 py27/cx_freeze 出现问题。感谢 Wolfgang L. 的报告和跟踪。
修复了文档和代码,几乎在所有地方都使用 “pytest” 而不是 “py.test”。感谢 Jurko Gospodnetic 完成了 PR。
修复 issue425:在 “py.test -h” 的末尾提及 –markers 和 –fixtures 根据指定的测试路径(或当前目录)工作
修复 issue413:unicode 属性的异常现在也可以在 python2 和 pytest-xdist 运行时正确打印。(此修复需要 py-1.4.20)
从 pylib 1.4.20.dev2 (rev 13d9af95547e) 复制、清理和集成 py.io 捕获
解决 issue416:阐明关于 conftest.py 加载语义的文档
修复 issue429:在断言表达式中比较带有非 ascii 字符的字节字符串现在可以更好地工作。感谢 Floris Bruynooghe。
使 capfd/capsys.capture 私有,它未使用,不应公开
2.5.1 (2013-12-17)¶
合并来自 Tobias Bieniek 的新文档样式 PR。
修复 issue403:允许在收集节点中参数化多个同名函数。感谢 Andreas Kloeckner 和 Alex Gaynor 的报告和分析。
允许参数化的 fixture 通过向 pytest.fixture() 和 pytest.yield_fixture() 添加 ids 参数来指定参数的 ID。感谢 Floris Bruynooghe。
修复 issue404,始终在 junitxml 插件中使用二进制 xml 转义。感谢 Ronny Pfannschmidt。
修复 issue407:修复 addoption 文档字符串以指向 argparse 而不是 optparse。感谢 Daniel D. Wright。
2.5.0 (2013-12-12)¶
从 pytest 本身的自动发布测试中删除了 python2.5,这意味着它可能很快就会崩溃(但我们认为此版本仍然有效)。
简化并修复了在涉及参数化 fixture 或函数参数时调用 finalizer 的实现。finalization 现在在设置时而不是在 “teardown 阶段” 延迟执行。虽然这乍听起来可能很奇怪,但它有助于确保我们即使在复杂的代码中也能正确处理 setup/teardown。除非用户级别的代码正在实现 pytest_runtest_teardown hook 并期望某些 fixture 实例在其中被拆除(非常不可能并且无论如何都不可靠),否则用户级别的代码不应受到影响。
PR90:添加 –color=yes|no|auto 选项以强制终端着色模式(“auto” 是默认值)。感谢 Marc Abramowitz。
修复 issue319 - 正确显示断言错误中的 unicode。非常感谢 Floris Bruynooghe 完成了 PR。这也意味着我们现在依赖于 py>=1.4.19。
修复 issue396 - 正确排序和最终确定类作用域的参数化测试,独立于类上的方法数量。
以更好的方式重新修复 issue323 – 参数化现在永远不会导致 Runtime Recursion 错误,因为用于重新排序每个作用域/每个 fixture 的测试的底层算法不再是递归的(以前是尾调用递归,对于超过 >966 个非函数作用域的参数可能会导致问题)。
修复 issue290 - 现在初步支持使用重复的相同值进行参数化(有时对于测试第二次调用是否与第一次调用一样有效很有用)。
关闭 issue240 - 准确记录 pytest 模块导入的工作方式,讨论两种常见的测试目录布局,以及它如何与 PEP 420-命名空间包交互。
修复 issue246,修复了 finalizer 顺序,使其成为依赖于参数化的高于函数作用域的 fixture 的独立 fixture 上的 LIFO。(非常努力,所以请忍受这个句子的复杂性 :) 感谢 Ralph Schmitt 提供了精确的失败示例。
修复 issue244,通过实现参数的特殊索引,仅将索引用于参数化测试 ID
修复 issue287,通过运行所有 finalizer 但保存来自第一个失败的 finalizer 的异常并重新引发它,以便 teardown 仍然会失败。我们重新引发第一个失败的异常,因为它可能是导致其他 finalizer 失败的原因。
修复了当 mock.patch 或其他标准装饰器包装与测试方法一起使用时的排序问题。这修复了 issue346,并应有助于解决随机的 “xdist” 收集失败。感谢 Ronny Pfannschmidt 和 Donald Stufft 帮助隔离了它。
修复 issue357 - 特殊情况 “-k” 表达式以允许使用不是有效 python 表达式的简单字符串进行过滤。示例:“-k 1.3” 匹配所有使用 1.3 参数化的测试。“-k None” 过滤名称中包含 “None” 的所有测试,反之 “-k ‘not None’”。以前,这些示例会引发语法错误。
修复 issue384,通过删除 trial 支持代码,因为 unittest 兼容性增强功能允许 trial 自行处理它
当导入插件产生 ImportError 时,不要隐藏它。修复了 issue375。
修复 issue275 - 允许 usefixtures 和 autouse fixture 用于运行 doctest 文本文件。
修复 issue380,通过使 –resultlog 仅依赖于 longrepr 而不是仅在有时存在的 “reprcrash” 属性。
解决 issue122:允许 @pytest.fixture(params=iterator) 通过尽早展开为列表。
修复 pytest 自身测试的 pexpect-3.0 兼容性。(修复了 issue386)
允许嵌套参数化值标记,感谢 James Lan 的 PR。
修复了使用新的 monkeypatch.setattr(import_path, value) API 的 unicode 处理。感谢 Rob Dennis。修复了 issue371。
修复了 junitxml 的 unicode 处理,修复了 issue368。
在 Python 2 上的断言重写模式下,修复了编码 cookie 的检测。请参阅 issue #330。
使 “–runxfail” 将命令式 pytest.xfail 调用转换为 no ops(它已经使 pytest.mark.xfail 标记失效)
改进 pytest / pkg_resources 交互:AssertionRewritingHook PEP 302 兼容加载器现在已正确注册到 setuptools/pkg_resources,以便 pkg_resources.resource_stream 方法正常工作。修复了 issue366。感谢 Jason R. Coombs 的调查和完整 PR。
pytestconfig fixture 现在是会话作用域的,因为它在整个测试运行期间是相同的对象。修复了 issue370。
避免一个令人惊讶的标记故障/混淆案例
@pytest.mark.some(lambda arg: ...) def test_function():
无法正确工作,因为 pytest 假设 @pytest.mark.some 获取一个要装饰的函数。我们现在至少检测到此 arg 是否为 lambda,因此该示例将起作用。感谢 Alex Gaynor 提出。
xfail 在 pypy 上测试检查错误的编码/ascii(pypy 不会出错)。修复了 issue385。
在内部,使 varnames() 处理类的 __init__,尽管 pytest 本身 atm 不需要它。也修复了缓存。修复了 issue376。
修复 issue221 - 正确处理导入没有 __init__.py 的命名空间包。
重构内部 FixtureRequest 处理以避免 monkeypatching。面向用户的积极影响之一是 “request” 对象现在可以在闭包中使用。
修复了 pytest.importskip(modname, minverstring) 中的版本比较
修复 issue377,通过在 nose-compat 文档中阐明 pytest 不会将 unittest-API 复制到 “plain” 命名空间中。
修复了 @mock’d 测试函数的详细报告
2.4.2 (2013-10-04)¶
在 Windows 上,需要 colorama 和较新的 py 库,以便 py.io.TerminalWriter() 现在使用 colorama 而不是其自己的 ctypes hacks。(修复了 issue365)感谢 Paul Moore 提出。
修复了 “-k” 匹配测试,其中 “repr” 和 “attr” 以及其他名称会由于内部实现怪癖(别问)而导致错误匹配,该怪癖现在已正确实现。修复了 issue345。
避免 tmpdir fixture 创建过长的文件名,尤其是在使用参数化时 (issue354)
修复了 pytest-pep8 和 pytest-flakes / pytest 交互(mark 插件中的收集名称假定项目始终具有函数,对于这些插件等而言并非如此)感谢 Andi Zeidler。
为 pytest-pep8 和 pytest-flakes 等插件引入 node.get_marker/node.add_marker API,以避免 node.keywords 伪字典的混乱细节。调整了文档。
删除启动时 “dup” stdout 的尝试,因为它很恶心。正常的捕获应该捕获足够多的测试可能性,从而搞乱标准 FD。
添加 pluginmanager.do_configure(config) 作为 plugin-compatibility 的 config.do_configure() 的链接
2.4.1 (2013-10-02)¶
当使用 parser.addoption() 时,类型关键字的 unicode 参数也应转换为各自的类型。感谢 Floris Bruynooghe, @dnozay。(修复了 issue360 和 issue362)
修复了使用 argcomplete 时的点文件名完成,感谢 Anthon van der Neuth。(修复了 issue361)
修复了当使用 1 元组 (“arg”,) 来指定参数化时出现的回归(参数化的值嵌套在元组中传递)。感谢 Donald Stufft。
合并文档拼写错误修复,感谢 Andy Dirnberger
2.4¶
已知不兼容性
如果从 python2.7 或更高版本调用 –genscript,您将仅获得一个在 python2.7 或更高版本上工作的独立脚本。使用 Python2.6 也可以获得 python2.5 兼容版本。
如果对应的 setup 方法失败,则所有 xunit 样式的 teardown 方法(nose 样式、pytest 样式、unittest 样式)将不会被调用,请参阅下面的 issue322。
pytest_plugin_unregister hook 从未被正确调用,并且没有已知的 hook 实现 - 因此它被删除了。
pytest.fixture 装饰的函数不能再是生成器(即使用 yield)。如果此更改导致无法预料的实际问题,则可能会在 2.4.1 中撤消此更改。但是,您始终可以编写并返回内部函数/生成器,并更改 fixture 使用者以迭代返回的生成器。进行此更改是为了代替新的
pytest.yield_fixture
装饰器,请参见下文。
新功能
实验性地引入新的
pytest.yield_fixture
装饰器,它接受与 pytest.fixture 完全相同的参数,但强制使用yield
语句而不是来自 fixture 函数的return statement
。这允许在 fixture 函数中直接与 “with-style” 上下文管理器集成,并且通常避免注册 finalization 回调,而倾向于将 “after-yield” 视为 teardown 代码。感谢 Andreas Pelme、Vladimir Keleshev、Floris Bruynooghe、Ronny Pfannschmidt 和许多其他人的讨论。如果还指定了 “reason”,则允许直接将布尔表达式与 skipif/xfail 一起使用。重新编写跳过文档以推荐 “将条件作为布尔值”,因为它可以防止在模块之间导入标记时出现意外。将条件指定为字符串将保持完全支持。
报告:根据是否发生失败/错误或一切是否通过,将最后一行着色为红色或绿色。感谢 Christian Theunert。
使 “import pdb ; pdb.set_trace()” 在捕获方面本地工作(不再需要 “-s”),使
pytest.set_trace()
成为一个简单的快捷方式。修复 issue181:–pdb 现在也适用于收集错误(和内部错误)。这是通过稍微的内部重构和引入新的 hook
pytest_exception_interact
hook(请参阅下一项)来实现的。修复 issue341:为 IDE/终端引入新的实验性 hook 以拦截调试:
pytest_exception_interact(node, call, report)
。新的 monkeypatch.setattr() 变体,用于为从模块中修补类/函数提供更短的调用
monkeypatch.setattr(“requests.get”, myfunc)
将 “requests” 模块的 “get” 函数替换为
myfunc
。修复 issue322:如果 setUpClass 失败,则不会运行 tearDownClass。感谢 Mathieu Agopian 的初始修复。还要使所有 pytest/nose finalizer 模仿相同的通用行为:如果 setupX 存在且失败,则不要运行 teardownX。这在内部引入了一个新的方法 “node.addfinalizer()” 助手,它只能在节点的 setup 阶段调用。
简化 pytest.mark.parametrize() 签名:允许传递 CSV 分隔的字符串以指定 argnames。例如:
pytest.mark.parametrize("input,expected", [(1,2), (2,3)])
以及之前的:pytest.mark.parametrize(("input", "expected"), ...)
。添加对 setUpModule/tearDownModule 检测的支持,感谢 Brian Okken。
通过使用 “argcomplete” 集成选项卡完成选项。感谢 Anthon van der Neut 的 PR。
更改选项名称为连字符分隔的长选项,但保持旧的拼写向后兼容。py.test -h 将仅显示连字符版本,例如 “–collect-only”,但 “–collectonly” 也将保持有效(出于向后兼容的原因)。非常感谢 Anthon van der Neut 的实现和 Hynek Schlawack 的推动。
修复 issue 308 - 允许在参数化时标记/xfail/skip 单个参数集。感谢 Brianna Laugher。
调用新的实验性 pytest_load_initial_conftests hook,以允许第三方插件在加载 conftest 之前执行某些操作。
Bug 修复
修复 issue358 - 现在通过使用新的 parser.parse_known_args 方法更正确地解析捕获选项。
pytest 现在使用 argparse 而不是 optparse(感谢 Anthon),这意味着如果安装到 python2.6 或更低版本的环境中,则将 “argparse” 添加为依赖项。
修复 issue333:修复了 unittest/pytest hook 交互不良的案例。
PR27:正确处理收集期间的 nose.SkipTest。感谢 Antonio Cuni, Ronny Pfannschmidt。
修复 issue355:junitxml 将 name=“pytest” 属性添加到 testsuite 标签。
修复 issue336:插件中的 autouse fixture 应再次起作用。
修复 issue279:改进了断言失败时对标准数据类型的对象比较,并识别 collections.abc。感谢 Brianna Laugher 和 Mathieu Agopian。
修复 issue317:断言重写器支持 is_package 方法
修复 issue335:记录从 pytest.raises() 返回的 py.code.ExceptionInfo() 对象,感谢 Mathieu Agopian。
从 setup.py 中删除隐式 distribute_setup 支持。
修复 issue305:忽略写入 pyc 文件时的任何问题。
SO-17664702:即使 fixture 函数部分失败,也调用 fixture finalizer(finalizer 以前并不总是被调用)
修复 issue320 - 修复了与模块级函数混合使用时 fixture 的类作用域。感谢 Anatoly Bubenkoff。
您可以指定 “-q” 或 “-qq” 以获得不同级别的 “更安静” 报告(感谢 Katarzyna Jachim)
修复 issue300 - 修复了在子目录中启动 py.test 时 conftest 加载的顺序。
修复 issue323 - 许多模块作用域的 arg 参数化的排序
使 sessionfinish hook 以与会话开始时相同的 cwd 上下文执行(有助于修复使用相对路径编写输出文件的插件行为,例如 pytest-cov)
修复 issue316 - 在文档中正确引用收集 hook
修复 issue 306 - 清理 -k/-m 选项以分别仅匹配标记/测试名称/关键字。感谢 Wouter van Ackooy。
改进了 python 模块中文档测试的文档测试计数 – 没有任何文档测试项的文件将不再显示,并且文档测试示例被计为单独的测试项。感谢 Danilo Bellini。
修复 issue245,通过依赖于已发布的 py-1.4.14,该版本修复了 py.io.dupfile 以使其可以处理没有模式的文件。感谢 Jason R. Coombs。
修复了当测试输出包含控制字符时的 junitxml 生成,解决了 issue267,感谢 Jaap Broekhuizen
修复 issue338:也为 setup/teardown 错误遵守 –tb 样式。感谢 Maho。
修复 issue307 - 在示例中使用 yaml.safe_load,感谢 Mark Eichin。
更好的参数化错误消息,感谢 Brianna Laugher
pytest_terminal_summary(terminalreporter) hook 现在可以使用 “.section(title)” 和 “.line(msg)” 方法在测试运行结束时打印额外信息。
2.3.5 (2013-04-30)¶
修复 issue169:也为 setup/teardown 错误遵守 –tb=style。
永远不要将 fixture 函数视为测试函数收集
允许重新运行测试项 / 帮助修复 pytest-reruntests 插件,并有助于减少 fixture/资源引用的存活时间
即使对于通过的测试,也将捕获的 stdout/stderr 放入 junitxml 输出中(感谢 Adam Goucher)
Issue 265 - 将 nose setup/teardown 与 setupstate 集成,这样如果它没有 setup,就不会尝试 teardown
issue 271 - 不要在 worker 节点上写入 junitxml
Issue 274 - 当 doctest 不知道示例位置时,不要尝试显示完整的 doctest 示例
issue 280 - 在有 bug 的 CPython 2.6.0 上禁用断言重写
注入 “getfixture()” 助手以从 doctest 中检索 fixture,感谢 Andreas Zeidler
issue 259 - 当断言重写时,与 Python 2 上 ASCII 的默认源编码保持一致
issue 251 - 报告跳过而不是忽略带有 init 的类
issue250 参数化名称和值中的 unicode/str 混合现在可以工作了
issue257,断言触发的以注释行结尾的源代码编译不会在 python2.5 中崩溃(通过 py>=1.4.13.dev6 修复)
修复 –genscript 选项以生成也可与 python3.3(导入器排序)一起使用的独立脚本
issue171 - 在断言重写中,显示一些全局变量的 repr
修复 “-k” 的选项帮助
将分发的长描述移到 README.rst 中
改进 metafunc.parametrize() 的文档字符串
修复了在测试函数中使用 capsys 和 pytest.set_trace() 时,查看 capsys.readouterr() 会中断的 bug
允许在自定义 python_functions 测试发现时指定以 “_” 开头的前缀。(感谢 Graham Horler)
通过将额外数据放在带有额外缩进的新行上,改进 PYTEST_DEBUG 跟踪输出
确保 OutcomeExceptions(如 skip/fail)已初始化异常属性
issue 260 - 不要在普通 unittest 用例中使用 nose 特殊 setup
修复 issue134 - 打印阻止运行指定测试项的收集错误
修复 issue266 - 接受 MarkEvaluator 表达式中的 unicode
2.3.4 (2012-11-20)¶
yielded 测试函数现在将具有活动的 autouse-fixture,但不能接受 fixture 作为 funcargs - 无论如何,建议使用 2.0 之后的参数化功能而不是 yield,请参阅:https://pytest.pythonlang.cn/en/stable/example/how-to/parametrize.html
修复了 autouse-issue,如果在 a/conftest.py 文件中定义了 autouse-fixture,并且在 a/tests/test_some.py 中进行了测试,则不会发现 autouse-fixture
修复 issue226 - fixture teardown 的 LIFO 排序
修复 issue224 - 现在可以使用 >256 个字符参数的调用
修复 issue91 - 在示例中添加/讨论包/目录级别的 setup
允许通过 item.keywords[…]=assignment 动态定义标记,与 “-m” 选项集成
使 “-k” 接受与 “-m” 相同的表达式,以便可以编写:-k “name1 or name2” 等。如果您使用了特殊语法(如 “TestClass.test_method”),则这是一个轻微的不兼容性,您现在需要将其写为 -k “TestClass and test_method” 以匹配特定测试类中的特定方法。
2.3.3 (2012-11-06)¶
修复 issue214 - 解析包含特殊对象的模块,例如 flask 的 request 对象,如果请求未激活,则在 getattr 访问时会崩溃。感谢 Thomas Waldmann。
修复 issue213 - 允许使用不支持 __eq__ 运算符的 numpy 数组等值进行参数化
修复 issue215 - 将 test_python.org 拆分为多个文件
修复 issue148 - 现在可以识别类上的 @unittest.skip,并避免调用 setUpClass/tearDownClass,感谢 Pavel Repin
修复 issue209 - 通过依赖于更新的 pylib 重新引入 python2.4 支持,该 pylib 重新引入了用于 pre-AST 解释器的语句查找
nose 支持:仅在它是可调用对象时才调用 setup,感谢 Andrew Taumoefolau
修复 issue219 - 将 py2.4-3.3 分类器添加到 TROVE 列表
在追溯中,,* 参数值现在显示在正常参数旁边(感谢 Manuel Jacob)
修复 issue217 - 支持 mock.patch 与 pytest 的 fixture - 请注意,您需要 mock-1.0.1 或 python3.3 内置 unittest.mock。
修复 issue127 - 改进 pytest_addoption() 的文档,并添加
config.getoption(name)
助手函数以保持一致性。
2.3.2 (2012-10-25)¶
修复 issue208 并修复 issue29,使用新的 py 版本以避免在长模块中打印追溯信息时出现长时间停顿
修复 issue205 - 子目录中的 conftest 自定义 pytest_pycollect_makemodule 和 pytest_pycollect_makeitem 现在可以正常工作
修复参数化 setup 的 teardown 顺序
修复 issue127 - 改进 pytest_addoption 和相关对象的文档。
修复 unittest 行为:仅当定义了测试方法时才调用 TestCase.runtest
改进 trial 支持:不要收集其空的 unittest.TestCase.runTest() 方法
“python setup.py test” 现在可以与 pytest 本身一起使用
修复/改进内部/打包相关部分
test_nose.py 的异常消息检查现在也可以在 python33 上通过
issue206 - 修复 test_assertrewrite.py,使其在全球存在 PYTHONDONTWRITEBYTECODE=1 时也能工作
将 tox.ini 添加到 pytest 发行版中,以便为运行 pytest 自身测试的维护人员正确分发 ignore-dirs 和其他配置位
2.3.1 (2012-10-20)¶
修复 issue202 - 修复回归:现在可以按预期从 fixture 函数中使用 “self”(它与使用 fixture 的测试方法看到的 “self” 实例相同)
由于 pexpect 不正确地支持(挂起),跳过在 freebsd* 系统上使用 pexpect 的测试(主要是 test_pdb.py)
从 –markers 输出链接到网页,这些网页提供有关 pytest.mark.* 用法的帮助。
2.3.0 (2012-10-19)¶
修复 issue202 - 为参数化测试函数提供更好的自动名称
修复 issue139 - 引入 @pytest.fixture,允许 funcarg 工厂的直接作用域和参数化。
修复 issue198 - 由于路径操作问题,在某些情况下,带有嵌套目录结构的 windows32 上找不到 conftest fixture
修复 issue193,跳过使用空参数集参数化的测试函数
修复 python3.3 兼容性,主要是先前依赖于字典排序的报告部分
引入按资源和参数化设置重新排序测试,这优先于通常的文件排序
修复 issue185,monkeypatching time.time 不会导致 pytest 失败
修复 issue172,重复调用 pytest.fixture 修饰的 setup_module 函数
修复 junitxml=path 构造,以便如果测试更改当前工作目录并且路径是相对路径,则可以从原始当前工作目录正确构造路径。
修复 “python setup.py test” 示例,使其产生正确的 “errno” 返回
修复 issue165 - 修复损坏的文档链接并提及 stackoverflow 以获取 FAQ
捕获在终端写入失败表示时的 unicode 问题,以防止整个会话崩溃
修复 xfail/skip 混淆:skip 标记或命令式 pytest.skip 现在将优先于 xfail 标记,因为在 skip 的情况下我们无法确定 xfail/xpass 状态。另请参阅: http://stackoverflow.com/questions/11105828/in-py-test-when-i-explicitly-skip-a-test-that-is-marked-as-xfail-how-can-i-get
始终在测试运行的标头中报告已安装的第三方插件
修复 issue160:xfail 标记测试的失败 setup 应报告为 xfail(而不是 xpass)
修复 issue128:当使用 capsys/capfd 时显示捕获的输出
修复 issue179:正确显示工厂的依赖链
如果插件已注册或名称已被占用,pluginmanager.register(…) 现在会引发 ValueError
修复 issue159:改进 https://pytest.pythonlang.cn/en/6.0.1/faq.html,特别是关于 “magic” 历史记录,还提到了 pytest-django、trial 和 unittest 集成。
使 request.keywords 和 node.keywords 可写。所有后代收集节点都将看到关键字值。关键字是包含标记和其他信息的字典。
修复 issue 178:xml 二进制转义现在包裹在 py.xml.raw 中
修复 issue 176:即使我们在 python 级别用子类替换了 AssertionError,也能正确捕获内置的 AssertionError
工厂发现不再因不提供合理 __code__ 对象的 magic 全局可调用对象(例如 mock.call)而失败
修复 issue 182:testdir.inprocess_run 现在考虑已传递的插件
- 修复 issue 188:确保在 python2 上 sys.exc_info 是清除的
在调用测试之前
修复 issue 191:添加 unittest TestCase runTest 方法支持
修复 issue 156:monkeypatch 正确处理类级别描述符
报告改进
pytest_report_header 现在接收 “startdir”,以便您可以使用 startdir.bestrelpath(yourpath) 来显示漂亮的相对路径
允许插件同时实现 pytest_report_header 和 pytest_sessionstart(sessionstart 首先被调用)。
如果没有取消选择的原因行,则不显示
py.test -vv 将显示所有的断言比较,而不是截断
2.2.4 (2012-05-22)¶
修复涉及 % 运算符的重写断言的错误消息
修复 issue 126:正确匹配 junitxml 二进制转义的所有无效 xml 字符
修复 unittest 的问题:现在应该正确处理 @unittest.expectedFailure 标记(您也可以使用 @pytest.mark 标记)
记录与扩展的 distribute/setuptools 测试命令的集成
修复 issue 140:正确获取 setup/teardown_class 的绑定类方法的真实函数
修复 issue #141:从已停用的 paste.pocoo.org 切换到 bpaste.net
修复 issue #143:始终在调用 configure/sessionstart 的情况下调用 unconfigure/sessionfinish
修复 issue #144:更好地处理测试 ID 以生成 junitxml 类名
将 distribute_setup.py 升级到 0.6.27
2.2.3 (2012-02-05)¶
修复上传的软件包,使其仅包含必要的文件
2.2.2 (2012-02-05)¶
修复 issue101:unittest.TestCase 测试函数的错误参数现在产生更好的输出
修复 issue102:当测试目录被重命名并且一些 pyc/__pycache__ 仍然存在时,报告更有用的错误和提示
修复 issue106:允许多次应用 parametrize,例如从模块、类和函数级别。
修复 issue107:实际执行会话范围的最终化
不要在 parametrize 中检查间接参数是否为 funcarg 名称
向 monkeypatch funcarg 添加 chdir 方法
修复第二次调用 monkeypatch undo 导致的崩溃
修复 issue115:使 –collectonly 对早期失败(缺少文件/目录)更健壮
“-qq –collectonly” 现在仅显示文件及其中的测试数量
“-q –collectonly” 现在显示测试 ID
允许向测试报告添加属性,使其也适用于分布式测试(无需升级 pytest-xdist)
2.2.1 (2011-12-16)¶
修复 issue99(在 pytest 和 py 中),resultlog 的 internallerrors 现在产生更好的输出 - 通过规范化 pytest_internalerror 输入参数修复。
修复 issue97 / 追溯问题(在 pytest 和 py 中),改进与 hack 追溯的 jinja2 和 cython 结合使用的追溯输出
修复 issue93(在 pytest 和 pytest-xdist 中),避免 “延迟 teardown”:测试节点中的最后一个测试现在将直接运行其 teardown,而不是等待会话结束。感谢 Dave Hunt 提供的良好报告和反馈。pytest_runtest_protocol 以及 pytest_runtest_teardown hook 现在都具有 “nextitem”,它将为 None,表示测试运行结束。
修复由于未知源收集项导致的收集崩溃,感谢 Ralf Schmitt(通过依赖于更新的 pylib 修复)
2.2.0 (2011-11-18)¶
修复 issue90:引入测试项的 eager tearing down,以便更早地调用 teardown 函数。
添加一个功能强大的 metafunc.parametrize 函数,该函数允许在多个步骤中以及从独立的插件和位置参数化测试函数参数。
添加 @pytest.mark.parametrize 帮助程序,该程序允许使用不同的参数值轻松调用测试函数
向 “parametrize” 示例页面添加示例,包括 Test 场景的快速移植以及新的 parametrize 函数和装饰器。
通过 ini 文件或插件 hook 引入 “pytest.mark.*” 帮助程序的注册。还引入了 “–strict” 选项,该选项会将未注册的标记视为错误,从而避免拼写错误并维护测试套件的一组良好描述的标记。请参阅 https://pytest.pythonlang.cn/en/stable/how-to/mark.html 及其链接中的示例。
issue50:引入 “-m marker” 选项以根据标记选择测试(这是 ‘-k’ 的更严格和更可预测的版本,因为 “-m” 仅匹配完整标记,并且对于 and/or 语义具有更明显的规则。
帮助优化测试速度的新功能:–durations=N 选项,用于显示 N 个最慢的测试调用和 setup/teardown 方法。
修复 issue87:–pastebin 现在可以与 python3 一起使用
修复 issue89:doctest 中意外异常的 –pdb 工作更合理
修复和清理 pytest 自身的测试套件,以避免泄漏 FDs
修复 issue83:链接到生成的 funcarg 列表
修复 issue74:现在针对 imp.find_module 误报检查 pyarg 模块名称
修复与 twisted/trial-11.1.0 用例的兼容性
简化 Node.listchain
通过依赖 py.xml 简化 junitxml 输出代码
在 unittest 类和函数上添加对 skip 属性的支持
2.1.3 (2011-10-18)¶
修复 issue79:断言重写在 boolops 中的某些比较中失败
正确处理零长度参数 (a la pytest '')
修复 issue67 / junitxml 现在包含正确的测试持续时间,感谢 ronny
修复 issue75 / 跳过 jython 上的测试失败
修复 issue77 / 允许 assertrepr_compare hook 应用于测试子集
2.1.2 (2011-09-24)¶
修复在某些 Python 版本上带有 windows 换行符的文件的断言重写
改进按包/模块名称(–pyargs)进行的测试发现,感谢 Florian Mayer
修复 issue69 / 断言重写修复了某些布尔运算
修复 issue68 / 包现在可以使用断言重写
修复 issue66:当传递 -O 选项时,使用不同的断言重写缓存
不要尝试在 Jython 上进行断言重写,请使用 reinterp
2.1.1¶
修复 issue64 / pytest.set_trace 现在可以在 pytest_generate_tests hook 中工作
修复 issue60 / 修复涉及 __pycache__ 创建的错误条件
修复 issue63 / 涉及包含 “%” 的字符串的插入的断言重写
修复带有 ** arg 的调用的断言重写
如果禁用字节码生成,则不要缓存重写的模块
修复只读目录中的断言重写
修复 issue59:为 junitxml 输出提供 system-out/err 标签
修复 issue61:具有 3 个或更多操作数的布尔运算的断言重写
您现在可以使用 “cd doc ; make man” 构建 man 手册页
2.1.0 (2011-07-09)¶
修复 issue53,使用正确的顺序调用 nosestyle setup 函数
修复 issue58 和 issue59:新的断言代码修复
合并 Benjamin 的 assertionrewrite 分支:现在 python 2.6 及更高版本上的测试模块的断言是通过重写 AST 并在导入测试模块之前保存 pyc 文件来完成的。有关更多信息,请参见 doc/assert.txt。
修复 issue43:通过改进意外异常的追溯报告来改进 doctest
修复 issue47:junitxml 中测试用例的计时输出现在是正确的
修复 issue48:MarkInfo repr 中导致异常的错别字
修复 issue49:避免在初始化部分失败时出现令人困惑的错误
修复 issue44:junitxml 文件路径的环境/用户名扩展
在 pypy 的测试运行中显示 releaselevel 信息
重新设计文档页面,以实现更好的导航和 PDF 生成
即使在会话启动期间中断,也报告 KeyboardInterrupt
修复 issue 35 - 从索引页提供 PDF 文档版本和下载链接
2.0.3 (2011-05-11)¶
修复 issue38:在调用 hook(特别是早期的 configure/sessionstart hook)时,提供更友好的追溯
修复 junitxml 文件中缺少的 skip 原因/元信息,通过 http://lists.idyll.org/pipermail/testing-in-python/2011-March/003928.html 报告
修复 issue34:避免从对象派生的带有 “test” 前缀的类导致收集失败。
如果没有实际使用 –genscript,则不需要 zlib(和其他库)用于 genscript 插件。
加快 skip 速度(通过不在内部执行完整的追溯表示)
修复 issue37:避免 junitxml 输出中的无效字符
2.0.2 (2011-03-09)¶
解决 issue32 - 通过减少相对开销来加快非常快速的测试函数的测试运行速度
修复 issue30 - 扩展的 xfail/skipif 处理和改进的报告。如果您的 skip/xfail 表达式中存在语法错误,您现在将获得友好的错误报告。
此外,您现在可以从 xfail/skipif 表达式访问模块全局变量,以便例如现在可以正常工作
import pytest import mymodule @pytest.mark.skipif("mymodule.__version__[0] == "1") def test_function(): pass
如果模块的版本字符串不是以 “1” 开头,则这不会运行测试函数。请注意,指定字符串而不是布尔表达式,可以使 py.test 在总结测试运行时报告有关导致跳过(或 xfail-ing)测试的条件的有意义的信息。
修复 issue28 - setup_method 和 pytest_generate_tests 协同工作。现在也为从 pytest_generate_tests hook 生成的测试函数调用调用 setup_method fixture 方法。
修复 issue27 - collectonly 和关键字选择 (-k) 现在协同工作。此外,如果您执行 “py.test –collectonly -q”,您现在将获得一个测试 ID 的平面列表,您可以使用该列表粘贴到 py.test 命令行,以便执行特定的测试。
修复 issue25,避免了 –pdb 和 python3.2/encodings 输出报告的问题
修复 issue23 - tmpdir 参数现在可以在 Python3.2 和 WindowsXP 上工作。从 Python3.2 开始,可能支持 os.symlink。通过要求更新的 py lib 版本,py.path.local() 实现承认了这一点。
修复了文档中的错别字(感谢 Victor Garcia、Brianna Laugher),并特别感谢 Laura Creighton,她还审查了部分文档。
修复了类的详细进度报告的略微错误的输出(感谢 Amaury)
更精确地(避免)node.Class|Function 访问的弃用警告
避免追溯中的 std unittest 断言帮助程序代码(感谢 Ronny)
2.0.1 (2011-02-07)¶
改进和统一初始捕获,使其即使在早期加载的 conftest.py 文件或插件上使用 logging 模块也能很好地工作。
允许在测试 ID 中省略 “()”,以允许 Alfredo 的出色 pytest.vim 插件生成统一的测试 ID。
修复 issue12 - 使用 “–version” 和 “–traceconfig” 显示插件版本,并记录如何向报告测试标头添加额外信息
修复 issue17(python3 上的 import-* 报告问题),方法是要求 py>1.4.0(1.4.1 将包含它)
修复 issue10(numpy 数组真值检查),方法是改进 py lib 中的断言解释
修复 issue15:使 nose 兼容性测试与 python3 兼容(现在 nose-1.0 支持 python3)
删除有些令人惊讶的 “same-conftest” 检测,因为它在 conftest.py 出现在多个子目录中时会忽略它们。
改进断言(“not in”),感谢 Floris Bruynooghe
改进在 “python -OO” 之上运行时(断言和文档字符串已关闭,导致潜在的误报)的行为/警告
引入 pytest_cmdline_processargs(args) hook 以允许动态计算命令行参数。这修复了一个回归,因为 2.0 之前的 py.test 允许从 conftest.py 文件设置命令行选项,而到目前为止,pytest-2.0 仅允许从 ini 文件设置。
修复 issue7:doctest 模块中的断言失败。doctest 中的意外失败通常不会显示得更好,即在 doctest 失败的上下文中。
修复 issue9:xfail 标记测试的 setup/teardown 函数如果失败,将报告为 xfail,如果成功,则报告为正常通过(而不是 xpassing)。这仅适用于 “直接” setup/teardown 调用,因为 teardown_class/teardown_module 无法与单个测试紧密相关。
修复 issue14:进程退出时没有日志记录错误
改进对非 TTY 的 “collecting” 输出
改进内部插件注册和 –traceconfig 输出
引入一种从命令行阻止/注销插件的机制,请参阅 https://pytest.pythonlang.cn/en/stable/how-to/plugins.html#cmdunregister
默认情况下激活 resultlog 插件
修复了关于 yielded tests 的回归,由于 collection-before-running 语义,这些测试未像 pytest 1.3.4 那样进行 setup。但是请注意,执行测试参数化的推荐和更简洁的方法仍然是 “pytest_generate_tests” 机制,请参阅文档。
2.0.0 (2010-11-25)¶
pytest-2.0 现在是其自身的软件包,并依赖于 pylib-2.0
新功能:python -m pytest / python -m pytest.main 功能
新的 python 调用:pytest.main(args, plugins) 以提前加载一些自定义插件。
通过将 setup/teardown 语义推迟到 unittest 包,尝试更努力地以更兼容的方式运行 unittest 测试套件。还努力运行 twisted/trial 和 Django 测试,这些测试现在基本上应该默认工作。
引入一种通过 ini 风格文件设置配置选项的新方法,默认情况下搜索 setup.cfg 和 tox.ini 文件。旧方法(某些环境变量,动态 conftest.py 读取已删除)。
添加一个新的 “-q” 选项,该选项降低了详细程度,并打印更像 nose/unittest 风格的 “点状” 输出。
修复 issue135 - 标记现在也可以与 unittest 测试用例一起使用
修复 issue126 - 引入 py.test.set_trace() 以在测试运行时(即使正在进行捕获)通过 PDB 跟踪执行。
修复 issue123 - py.test 的新 “python -m py.test” 调用(需要 Python 2.5 或更高版本)
修复 issue124 - 使报告更能抵抗测试在文件描述符 1 (stdout) 上打开文件。
修复 issue109 - 将不会加载同级 conftest.py 文件。(并且 Directory 收集器不能再从 Directory 的 conftest.py 中自定义 - 这至少需要在一个级别上发生)。
引入(可自定义的)断言失败表示,并增强比较和其他情况的断言失败输出 (Floris Bruynooghe)
nose-plugin:传递 setup/teardown 函数中的类型签名失败,而不是不调用它们 (Ed Singleton)
删除 py.test.collect.Directory(源于收集过程的重大重构和简化)
大幅减少 py.test 核心代码,将函数/python 测试转移到自己的插件
修复 issue88(从命令行参数查找自定义测试节点)
改进 “tmpdir” 创建,现在将创建与测试名称更好关联的基本名称(感谢 Ronny)
“xpass”(意外通过)测试不会导致 exitcode!=0
修复 issue131 / issue60 - 在用作命名空间包的 __init__ 文件中导入 doctest
修复 issue93,在导入 conftest.py 时捕获 stdout/stderr
修复错误:unittest 收集的函数现在也可以在类/模块级别应用 “pytestmark”
添加将 “class” 级别用于 cached_setup 帮助程序的功能
修复奇怪之处:mark.* 对象现在是不可变的,创建新实例
1.3.4 (2010-09-14)¶
修复 issue111:改进 windows 的安装文档
修复 issue119:修复 __init__.py 作为模块的自定义可收集性
修复 issue116:–doctestmodules 也适用于 __init__.py 文件
修复 issue115:统一内部异常 passthrough/catching/GeneratorExit
修复 issue118:新的 –tb=native 用于呈现 cpython 标准异常
1.3.3 (2010-07-30)¶
修复 issue113:三引号字符串(以及可能的其他情况)的断言表示问题
使 conftest 加载检测到已加载具有相同内容的 conftest 文件,避免了例如 Hudson 产生的嵌套目录结构中的意外情况。它可能消除了在大多数情况下使用 –confcutdir 的需要。
修复 win32 的终端着色(感谢 Michael Foord 的报告)
修复怪异之处:使终端宽度检测在 stdout 而不是 stdin 上工作(感谢 Armin Ronacher 的报告)
删除所有 py/text 发行文件中的尾随空格
1.3.2 (2010-07-08)¶
新功能
修复 issue103:引入 py.test.raises 作为上下文管理器,示例
with py.test.raises(ZeroDivisionError): x = 0 1 / x with py.test.raises(RuntimeError) as excinfo: call_something() # you may do extra checks on excinfo.value|type|traceback here
(感谢 Ronny Pfannschmidt)
Funcarg 工厂现在可以动态地将标记应用于测试调用。例如,如果工厂为预期会失败的测试提供参数,这将非常有用
def pytest_funcarg__arg(request): request.applymarker(py.test.mark.xfail(reason="flaky config")) ... def test_function(arg): ...
改进了收集和导入错误的错误报告。这利用了一种更通用的机制,即对于自定义测试项/收集节点,现在统一调用
node.repr_failure(excinfo)
,以便您可以覆盖它以返回您选择的字符串错误表示形式,该形式将报告为(红色)字符串。引入 ‘–junitprefix=STR’ 选项,以在 junitxml 文件中为所有报告添加前缀。
Bug 修复
使测试和
pytest_recwarn
插件尤其完全兼容 Python2.7(如果您使用recwarn
funcarg,将启用警告,以便您可以正确检查它们在跨 python 方式中的存在)。改进 –pdb:忽略 xfailed 测试,统一其 TB 报告,并且不要在最后再次显示失败。
修复带有 ** 运算符的断言解释(感谢 Benjamin Peterson)
修复 issue105,在与失败的断言同一行上的赋值(感谢 Benjamin Peterson)
修复 issue104,junitxml 插件中测试名称的正确转义(感谢匿名人士)
修复 issue57 -f|–looponfail 以与 xpassing 测试一起工作(感谢 Ronny)
修复 issue92 collectonly 报告器和 –pastebin(感谢 Benjamin Peterson)
修复 py.code.compile(source) 以生成唯一的文件名
通过将代码编译推迟到(可覆盖的)Frame.eval 类,修复了 PyPy 上的断言重新解释问题。(感谢 Amaury Forgeot)
修复 py.path.local.pyimport() 以使其与目录一起工作
简化 py.path.local.mkdtemp 实现和用法
显示 junitxml-filename 时,请勿打印空行
向 py.path.local.remove 添加可选的布尔 ignore_errors 参数
修复 win32/python2.4 上的终端写入
py.process.cmdexec() 现在更努力地在所有 python 版本上返回正确编码的 unicode 对象
也为 Jython 安装纯 py.test/py.which 脚本,这有助于在 virtualenv 情况中获得规范的脚本路径
使 path.bestrelpath(path) 返回 “.”,请注意,当调用 X.bestrelpath 时,假设 X 是一个目录。
使初始 conftest 发现忽略 “–” 前缀的参数
修复在 multicpu/multihost xdist 情况中使用时的 resultlog 插件(感谢 Jakub Gustak)
在 xdist-plugin 中执行与分布式测试相关的报告,而不是在通用的 py.test 发行版中包含与 dist 相关的代码
修复 Windows 上的 homedir 检测
发布 distribute_setup.py 版本 0.6.13
1.3.1 (2010-05-25)¶
新功能
issue91:引入新的 py.test.xfail(reason) 帮助程序,以命令方式将测试标记为预期会失败。可以从 setup 和测试函数中使用。这对于某些配置预期会失败的参数化测试特别有用。在这种情况下,不能使用带有 @py.test.mark.xfail 的声明性方法,因为它会将所有配置标记为 xfail。
issue102:引入新的 –maxfail=NUM 选项,以在 NUM 次失败后停止测试运行。这是 ‘-x’ 或 ‘–exitfirst’ 选项的概括,现在等效于 ‘–maxfail=1’。‘-x’ 和 ‘–maxfail’ 现在都将在接近末尾的位置打印一行,指示中断。
issue89:允许 py.test.mark 装饰器用于类(类装饰器是在 python2.6 中引入的),并且还允许通过指定列表在类/模块级别应用多个标记。
改进和优化进度条中的字母报告:. 通过 f 失败的测试 s 跳过的测试(提醒:仅用于依赖项/平台不匹配)x xfailed 测试(预期会失败的测试)X xpassed 测试(预期会失败但通过的测试)
您可以将 ‘fsxX’ 的任何组合与 ‘-r’ 扩展报告选项一起使用。xfail/xpass 结果将显示为 junitxml 输出中跳过的测试 - 这也修复了 issue99。
使 py.test.cmdline.main() 返回 exitstatus 而不是引发 SystemExit,并且还允许多次调用它。当然,这要求您的应用程序和测试已正确 teardown,并且没有全局状态。
Bug 修复
改进的追溯呈现:- 改进和统一了 “–tb=short” 选项的报告 - 测试模块导入期间的错误要短得多(使用 –tb=short 样式)- raises 显示更短、更相关的追溯 - –fulltrace 现在更系统地使追溯更长/抑制截断
通过操作 python 的 linecache.cache 而不是以前相当 hacky 的创建自定义代码对象的方式,改进对 raises 和其他动态编译代码的支持。这使其在 Jython 和 PyPy 上无缝工作,而以前在 Jython 和 PyPy 上无法工作。
修复 issue96:使捕获更能抵抗 Control-C 中断(涉及对底层捕获功能进行一些实质性的重构,以避免竞争条件)。
修复条件 skipif/xfail 装饰器的链接 - 因此现在可以按预期使用多个 @py.test.mark.skipif(condition) 装饰器,包括特定报告哪些条件导致跳过。
修复 issue95:延迟导入 zlib,以便它不是常规 py.test 启动所必需的。
修复 issue94:使报告对伪造的源代码更健壮(并在内部在呈现意外的字节序列时更加小心)
1.3.0 (2010-05-05)¶
弃用 –report 选项,而支持新的更短且更易于记忆的 -r 选项:它采用一个字符串参数,该参数由 ‘xfsX’ 字符的任意组合组成。它们与您在点状进度打印期间看到的单个字符相关,并且将在测试运行结束时为每个测试打印额外的行。此额外行指示您可以直接粘贴到 py.test cmdline 的确切位置或测试 ID,以便重新运行特定测试。
允许外部插件通过新的 pytest_addhooks(pluginmanager) hook 注册新的 hook。用于分布式和 looponfailing 测试的 pytest-xdist 插件的新版本需要此功能。
添加新的 pytest_ignore_collect(path, config) hook,以允许项目和插件为其目录结构定义排除行为 - 例如,您可以在 conftest.py 中定义此方法
def pytest_ignore_collect(path): return path.check(link=1)
以防止甚至尝试收集 symlinked 目录中的任何测试。
新的 pytest_pycollect_makemodule(path, parent) hook,用于允许自定义匹配测试模块的模块收集对象。
扩展和改进 xfail 机制:
@py.test.mark.xfail(run=False)
不运行修饰的测试@py.test.mark.xfail(reason="...")
在 xfail 摘要中打印原因字符串,在命令行上指定--runxfail
实际上会忽略 xfail 标记公开(以前的内部)常用方法:py.io.get_terminal_with() -> 返回终端宽度 py.io.ansi_print(…) -> 在 linux/win32 上打印彩色/粗体文本 py.io.saferepr(obj) -> 返回有限的表示字符串
将测试结果相关的异常公开为 py.test.skip.Exception、py.test.raises.Exception 等,主要用于执行特殊结果解释/调整的插件
(issue85) 修复 junitxml 插件以处理具有非 ASCII 输出的测试
修复/改进 python3 兼容性(感谢 Benjamin Peterson)
修复使 jython/win32 组合工作的问题,但请注意:jython2.5.1/win32 不提供命令行启动器,请参阅 https://bugs.jython.org/issue1491 。有关如何解决问题,请参阅 pylib 安装文档。
修复 unicode 异常值和不可打印对象的处理
(issue87) 修复 assertionold 代码中的 unboundlocal 错误
(issue86) 改进 looponfailing 的文档
改进 IO 捕获:stdin-redirect 伪文件现在具有 NOP close() 方法
发布 distribute_setup.py 版本 0.6.10
添加了指向新的 capturelog 和 coverage 插件的链接
1.2.0 (2010-01-18)¶
改进了 “py.cleanup” 的用法和选项
py.cleanup # remove "*.pyc" and "*$py.class" (jython) files py.cleanup -e .swp -e .cache # also remove files with these extensions py.cleanup -s # remove "build" and "dist" directory next to setup.py files py.cleanup -d # also remove empty directories py.cleanup -a # synonym for "-s -d -e 'pip-log.txt'" py.cleanup -n # dry run, only show what would be removed
添加了一个新选项 “py.test –funcargs”,该选项显示给定测试路径的可用 funcarg 及其帮助字符串(在其各自的工厂函数上的文档字符串)
如果 funcarg 查找失败,则显示简短而简洁的追溯
在非点开头的顶层子目录中提前加载 “conftest.py” 文件。允许在
test
子目录中方便地保存和访问与测试相关的选项,并且仍然可以添加命令行选项。修复 issue67:新的超短回溯打印选项:“–tb=line” 将为每个失败的(python)测试打印一行,指示其文件名、行号和失败值
修复 issue78:即使相应的 setup 失败,也始终调用 python 级别的 teardown 函数。这包括对调用 setup_module/class 函数的改进,这些函数现在只会被调用一次,而不是之前的行为,即如果它们引发异常(包括 Skipped 异常),它们会被多次调用。任何异常都将被重新记录,并与相应模块/类范围内的所有测试关联。
修复 issue63:假定 <40 列为虚假的终端宽度,默认为 80
修复 pdb 调试,使其在 raises 相关的错误中处于正确的帧中
更新 apipkg.py 以修复递归导入可能不必要地中断导入的问题
修复插件链接
1.1.1 (2009-11-24)¶
将 dist/looponfailing 从 py.test 核心移动到新发布的 pytest-xdist 插件中。
新的 junitxml 插件:–junitxml=path 将生成一个 junit 样式的 xml 文件,该文件可被 Hudson CI 系统等处理。
新选项:–genscript=path 将生成一个独立的 py.test 脚本,该脚本不需要安装任何库。感谢 Ralf Schmitt。
新选项:–ignore 将阻止从集合中收集指定的路径。可以多次指定。
新选项:–confcutdir=dir 将使 py.test 仅考虑相对于指定目录的 conftest 文件。
新的 funcarg:“pytestconfig” 是 pytest 配置对象,用于访问命令行参数,现在可以轻松地在测试中使用。
安装带有
-$VERSION
后缀的py.test
和py.which
,以消除 Python3、python2.X、Jython 和 PyPy 安装版本之间的歧义。新的 “pytestconfig” funcarg 允许访问测试配置对象
新的 “pytest_report_header” hook 可以返回要在测试运行的标头中显示的其他行。
(实验性)允许 “py.test path::name1::name2::…” 直接指向测试集合中的测试。这最终可能会演变为 “-k” 规范的完全替代品。
简化的插件加载:顺序现在如 customize.html 中所述:setuptools、ENV、命令行、conftest。setuptools 入口点名称也转换为规范名称 (“pytest_*”)
自动跳过需要 ‘capfd’ 但没有 os.dup 的测试
允许在类中定义 pytest_generate_tests
弃用 ‘disabled’ 属性的使用,转而使用 pytestmark
弃用在 conftest.py 文件中定义 Directory、Module、Class 和 Function 节点。请改用 pytest collect hooks。
collection/item 节点特定的 runtest/collect hooks 仅在匹配的 conftest.py 文件上调用,即恰好在项目的文件系统路径下的文件
更改:第一个返回某些内容的 pytest_collect_directory hook 现在将阻止调用进一步的 hooks。
更改:figleaf 插件现在需要 –figleaf 才能运行。还更改了其长命令行选项,使其稍短一些(请参阅 py.test -h)。
更改:pytest doctest 插件现在默认启用,并具有新选项 –doctest-glob 来设置文件匹配的模式。
更改:删除内部 py._* 帮助程序变量,仅保留 py._pydir
增强捕获的鲁棒性,以便在自定义 pytest_runtest_setup 代码失败并阻止捕获 setup 代码运行时能够继续运行。
使默认插件提供的 py.test.* 帮助程序提前可见 - 对于 pydoc 和交互式会话都透明地工作,这些会话将定期看到例如 py.test.mark 和 py.test.importorskip。
简化内部插件管理器机制
通过引入 RootCollector 节点来简化内部集合树
修复断言重新解释,该解释会看到包含 “keyword=…” 的调用
修复 issue66:在 dist-testing 期间,在 worker 节点上调用 pytest_sessionstart 和 pytest_sessionfinish hooks,正确报告模块/会话 teardown hooks。
修复 issue65:如果远程未安装 execnet/py 库,则正确处理 dist-testing。
如果 execnet 不可用,则跳过某些 install-tests
修复文档,修复内部 bin/ 脚本生成
1.1.0 (2009-11-05)¶
通过 setuptools 的 pkg_resources.iter_entry_points 引入通过 ‘pytest11’ 入口点的自动插件注册
修复 py.test dist-testing 以与 execnet >= 1.0.0b4 一起使用
重新引入 py.test.cmdline.main() 以获得更好的向后兼容性
svn 路径:修复 svn 路径的 path.check(versioned=True) 的错误,允许 svn 路径中使用 ‘%’,使 svnwc.update() 默认采用与 1.0.x 相同的交互模式,并添加 svnwc.update(interactive=False) 以禁止交互。
改进分布式 tarball,使其包含测试文件而不是 pyc 文件
更努力地使 py.compat.* 访问的弃用警告报告正确的位置
1.0.3¶
调整和改进文档
删除 py.rest 工具和内部命名空间 - 它从未真正宣传过,如果需要,仍然可以与旧版本一起使用。如果有人感兴趣,我想它可以作为自己的工具重新复活。
修复 issue48 和 issue59:如果从导入的测试文件中的模块似乎不是来自文件路径,则引发 Error - 避免了重复报告的“同名”混淆
合并了 Ronny 的 nose 兼容性 hacks:现在支持 nose 样式的 setup_module() 和 setup() 函数
引入通用的 py.test.mark 函数标记
重新调整/改进命令行分组
弃用 parser.addgroup,转而使用 getgroup,后者创建选项组
添加 –report 命令行选项,允许控制跳过/xfailed 部分的显示
通用的跳过:一种基于平台或 sys-module 属性在函数、类和模块级别标记 python 函数为 skipif 或 xfail 的新方法。
扩展 py.test.mark 装饰器以允许位置参数
引入并测试 “py.cleanup -d” 以删除空目录
修复 issue #59 - 增强 unittest 测试集合的鲁棒性
通过向 ApiModule 添加 __all__ 属性,清理 initpkg,使 bpython/help 交互工作
pylib 使用 MIT 许可证,添加了一些贡献者
删除 py.execnet 代码,并将所有用法替换为正确的 ‘execnet’
修复 issue50 - cached_setup 现在缓存更多内容,以满足具有多个参数的测试函数的期望。
合并 Jarko 的修复,issue #45 和 #46
添加为 py.lookup 指定搜索路径的功能
修复 funcarg cached_setup 错误,该错误可能仅在分布式测试和带有 teardown 的 “module” 作用域中发生。
许多修复和更改,用于使代码库与 python3 兼容,非常感谢 Benjamin Peterson 在这方面的帮助。
整合 builtins 实现,使其与 >=2.3 兼容,添加帮助程序以简化保持 2 和 3k 兼容代码
弃用 py.compat.doctest|subprocess|textwrap|optparse
弃用 py.magic.autopath,删除 py/magic 目录
将 pytest 断言处理移动到 py/code 和 pytest_assertion 插件,添加 “–no-assert” 选项,弃用 py.magic 命名空间,转而使用(较少的)py.code 命名空间。
整合和清理 py/code 类和文件
清理 py/misc,将测试移动到 bin-for-dist
向 py.test 的 monkeypatch funcarg 引入 delattr/delitem/delenv 方法
整合 py.log 实现,删除旧方法。
引入 py.io.TextIO 和 py.io.BytesIO 以区分文本/unicode 和字节流(如果可用,则使用底层标准库 io.*)
提供 py.unittest_convert 帮助脚本,该脚本将 “unittest.py” 样式的文件转换为更简单的 assert/direct-test-classes py.test/nosetests 样式。该脚本由 Laura Creighton 编写。
简化内部 localpath 实现
1.0.2 (2009-08-27)¶
修复打包问题,由 fedora redhat 打包触发,还在 tarball 中添加了 doc、examples 和 contrib 目录。
添加了指向新的 django 插件的文档链接。
1.0.1 (2009-08-19)¶
添加了 ‘pytest_nose’ 插件,该插件处理 nose.SkipTest、nose 样式的函数/方法/生成器 setup/teardown,并尝试正确报告函数。
更好地捕获 unicode 写入或编码字符串到 sys.stdout/err,还调整了 terminalwriting,并在 windows 和 linux 之间进行了一定程度的统一。
大大改进了文档布局和内容
添加了 “–help-config” 选项,以显示所有 longopt 命令行选项的 conftest.py / ENV-var 名称,以及一些特殊的 conftest.py 变量。相应地将 ‘conf_capture’ conftest 设置重命名为 ‘option_capture’。
修复 issue #27:更好地报告命令行上给出的不可收集项(例如 pyc 文件)
修复 issue #33:添加了 –version 标志(感谢 Benjamin Peterson)
修复 issue #32:为 wcpath.status() 添加了对 “不完整” 路径的支持
如果 “Test” 前缀的类具有 __init__ 方法,则默认情况下不再收集它们
monkeypatch setenv() 现在接受 “prepend” 参数
改进了集合错误回溯的报告
简化了 multicall 机制和插件架构,重命名了一些内部方法和 argnames
1.0.0 (2009-08-04)¶
更简洁的报告尝试显示相对于当前目录的文件系统路径
稍微改进 xfail 输出
1.0.0b9 (2009-07-31)¶
干净地处理和报告测试 setup 的最终 teardown
修复 svn-1.6 与 py.path.svnwc().versioned() 的兼容性问题(感谢 Wouter Vanden Hove)
setup/teardown 或集合问题现在在进度行中显示为 ERROR 或带有大 “E”。它们被单独报告和计数。
dist-testing:正确处理在本地收集但在远程端无法收集的测试项 - 通常是由于平台/依赖关系原因
简化的 py.test.mark API - 请参阅 keyword 插件文档
更好地与日志记录集成:捕获现在默认情况下在单个流中捕获测试函数及其即时 setup/teardown
capsys 和 capfd funcargs 现在具有 readouterr() 和 close() 方法(底层使用 py.io.StdCapture/FD 对象,它们也扩展了 readouterr() 方法以返回捕获的 out/err 的快照)
使断言重新解释在比较不返回布尔值的比较中更好地工作(从 numpy 报告,感谢 maciej fijalkowski)
将每个测试的输出捕获重构到 pytest_iocapture.py 插件中,从而从 config 对象中删除了捕获代码
item.repr_failure(excinfo) 而不是 item.repr_failure(excinfo, outerr)
1.0.0b8 (2009-07-22)¶
pytest_unittest-plugin 现在默认启用
引入了 pytest_keyboardinterrupt hook 并改进了 pytest_sessionfinish hook,添加了测试。
解决有缺陷的日志记录模块交互(“关闭已关闭的文件”)。感谢 Sridhar Ratnakumar 的触发。
如果插件使用 “py.test.importorskip” 导入依赖项,则只会发出警告,而不是退出测试过程。
对文档进行了许多改进:- 改进了 funcargs 文档,使用术语 “factory” 而不是 “provider” - 添加了新的 talk/tutorial 文档页面 - 更好的下载页面 - 更好的插件文档字符串 - 添加了新的插件页面和自动文档生成脚本
修复了与部分失败的 funcarg setups 相关的 teardown 问题(感谢 MrTopf 的报告),即使 “pytest_runtest_setup” 失败,“pytest_runtest_teardown” 现在也始终会被调用。
调整了 py 模块中 docstrings 的 doctest 输出,感谢 Radomir。
1.0.0b7¶
将 py.test.xfail 重命名回 py.test.mark.xfail,以避免两种方式装饰 xfail
重新添加了 py.test.mark 装饰器,用于在函数上设置关键字(实际上已记录在案,因此删除它不太好)
从 request.addfinalizer() 中删除 scope-argument,因为 request.cached_setup 具有 scope arg。TOOWTDI。
在报告失败之前执行 setup 最终确定
应用 Andreas Kloeckner 的修改后的补丁,以允许测试函数没有 func_code (#22),并使 “-k” 和函数关键字工作 (#20)
应用 Daniel Peolzleithner 的补丁 (issue #23)
解决 issue #18,multiprocessing.Manager() 和重定向冲突
使 remote_exec 代码的 __name__ == “__channelexec__”
1.0.0b3 (2009-06-19)¶
插件类已删除:现在可以直接在 conftest.py 或全局 pytest_*.py 文件中定义 hooks。
添加了新的 pytest_namespace(config) hook,允许将帮助程序直接注入到 py.test.* 命名空间。
记录并改进了许多 hooks
通过 pytest_generate_tests hook 添加了生成式测试的新样式,该样式与函数参数很好地集成。
1.0.0b1¶
引入了新的 “funcarg” setup 方法,请参阅 doc/test/funcarg.txt
引入了插件架构和许多新的 py.test 插件,请参阅 doc/test/plugins.txt
现在保证在测试方法运行后调用 teardown_method。
新方法:py.test.importorskip(mod,minversion) 将导入或调用 py.test.skip()
完全修订了内部 py.test 架构
新的 py.process.ForkedFunc 对象,允许将函数的执行 fork 到子进程并获取结果返回。
XXX 这里缺少很多东西 XXX
0.9.2¶
改进了安装和元数据,创建了新的 setup.py,现在基于 setuptools/ez_setup(感谢 Ralf Schmitt 的支持)。
改进了在 windows 环境中提供 py.* 脚本的方式,它们现在作为 “.cmd” 文件添加到 Scripts 目录中。
py.path.svnwc.status() 现在更完整,如果可用,则使用来自 ‘svn’ 命令的 xml 输出 (Guido Wesdorp)
修复了 py.path.svn* 以与 svn 1.5 一起工作 (Chris Lamb)
修复了 windows 上 path.relto(otherpath) 方法,以使用 normcase 检查路径是否相对。
py.test 的回溯更容易从编辑器解析(遵循 filenames:LINENO: MSG 约定)(感谢 Osmo Salomaa)
修复了 javascript-generation,现在 “py.test –runbrowser” 应该更可靠地工作
删除了之前意外添加的 py.test.broken 和 py.test.notimplemented 帮助程序。
现在有一个 py.__version__ 属性
0.9.1¶
这是 v0.9.1 的相当完整的列表,可以作为开发人员的参考。
允许 py.path.svn urls 中使用 + 号 [39106]
修复了 py.test 中对没有 excinfo 的 Failed 异常的支持 [39340]
在 py.misc.killproc 中添加了对 Windows(以及支持 os.kill 的平台)杀死进程的支持 [39655]
为 py.test 中的生成式测试添加了 setup/teardown [40702]
为 py.test 添加了对 FAILED TO LOAD MODULE 的检测 [40703, 40738, 40739]
修复了在 py.path 中对非版本控制文件的 wcpaths 调用 .remove() 的问题 [44248]
修复了 py.test 中的一些导入和继承问题 [41480, 44648, 44655]
当 pypy 可用但没有 stackless 时,无法运行 greenlet 测试 [45294]
rsession 测试中的小修复 [45295]
修复了 py.test 中 2.5 类型表示的问题 [45483, 45484]
使内部报告问题显示在 py.test 中原子性地完成 [45518]
使 py.lookup 脚本忽略不存在的文件 [45519]
改进了 py.test 中异常名称的创建 [45535]
使 execnet 中使用的线程更少 [merge in 45539]
删除了 py.test 中原子报告问题显示所需的锁 [45545]
从 execnet 中删除了全局变量 [45541, 45547]
重构了清理机制,使 setDaemon 设置为 1,以便在 2.5 (py.execnet) 中调用 atexit [45548]
修复了 py.execnet 的 servemain 中加入线程的错误 [45549]
重构了 py.test.rsession 测试,使其不再依赖于确切的输出格式 [45646]
在测试结果上使用 repr() [45647]
为 py.test.skip() 添加了 ‘Reason’ 类 [45648, 45649]
在 py.test.collect 中杀死了一些不必要的健全性检查 [45655]
避免在 py.io.fdcapture 中使用 os.tmpfile(),因为在 Windows 上它只能由管理员使用 [45901]
为 py.path.svnwc 添加了对锁定和非递归提交的支持 [45994]
锁定 py.execnet 中的文件以防止 CPython 段错误 [46010]
为 py.path.svnurl 添加了 export() 方法
修复了 py.test 中的 -d -x [47277]
修复了 py.path.svnwc 中的参数连接问题 [49423]
恢复 py.test 行为,即当出现故障时以代码 1 退出 [49974]
不要在没有随附 .txt 文件的 html 文件上失败 [50606]
修复了 ‘utestconvert.py < input’ [50645]
py.code.source 中代码缩进的小修复 [50755]
修复 _docgen.py 文档构建 [51285]
改进了 py.test 中代码块的源代码表示的检查 [51292]
为 py.path.svn* 对象添加了传递身份验证的支持 [52000, 52001]
删除了 py.apigen 测试的 sorted() 调用,转而使用 [].sort() 以支持 Python 2.3 [52481]