更新日志

版本遵循 语义化版本控制 (<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 可能会崩溃的问题。

改进的文档

面向贡献者的更改

  • #13112: 修复了 Pygments >= 2.19.0 的 test_terminal.py 中的自测失败

  • #13256: 在构建 Sphinx 文档时,已重新启用对 2024 年发布的 Towncier 版本的支持 – 由 @webknjaz

pytest 8.3.4 (2024-12-01)

Bug 修复

  • #12592: 修复了当目录布局中目录包含同名子目录时,使用 --import-mode=importlib 时发生的 KeyError 崩溃。

  • #12818: 断言重写现在保留了原始指令的源范围,使其可以与处理 AST 的工具(如 executing)良好配合。

  • #12849: 现在在 pytest.fail()pytrace=False 中正确处理了彩色输出的 ANSI 转义码。

  • #9353: 当给定布尔值时,pytest.approx() 现在使用严格相等性。

改进的文档

面向贡献者的更改

  • #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 提供

改进的文档

  • #12663: 澄清了当项目被取消选择时,应该从 pytest_collection_modifyitems hook 实现中调用 pytest_deselected hook。

  • #12678: 从文档中的 tmp_path_retention_policy 示例中删除错误的引号。

其他内部更改

  • #12769: 修复了 codespell 发现的拼写错误,并将 codespell 添加到 pre-commit hooks。

pytest 8.3.2 (2024-07-24)

Bug 修复

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、(未转义的) strboolNone

    有关更多信息,请参阅 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: CIBUILD_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 更改日志片段类型,其含义不明确且范围广泛。它已被删除,我们现在有 contribmiscpackaging 代替它。

    新的更改说明类型针对下游打包者和项目贡献者。此外,杂项部分保留用于不适合任何其他位置的未指定更新。

    – 由 @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 修复

  • #12355: 修复了涉及许多更高作用域参数的特定参数化模式下可能出现的灾难性性能下降。

  • #12367: 修复了 pytest 8.2.0 中的回归,其中 unittest 类实例(为每个测试创建一个新的实例)未在测试拆卸时及时释放,而仅在会话拆卸时释放。

  • #12381: 修复了可能由并发缓存目录 (.pytest_cache) 创建引起的 “Directory not empty” 崩溃。在 pytest 8.2.0 中回归。

改进的文档

  • #12290: 更新了 Sphinx 主题以使用 Furo 而不是 Flask,启用了深色模式主题。

  • #12356: 在调试不稳定测试的文档中添加了一个小节,以提及 pytest 中缺乏线程安全性作为可能的不稳定来源。

  • #12363: 文档网页现在链接到规范版本,以减少搜索引擎结果中过时的文档。

pytest 8.2.1 (2024-05-19)

改进

  • #12334: 支持 Python 3.13(在编写时为 beta1)。

缺陷修复

  • #12120: 修复了由于命令行上未选择的目录而引起的 PermissionError 崩溃。

  • #12191: 键盘中断和系统退出现在在测试收集期间得到正确处理。

  • #12300: 修复了 squashfuse_ll 下 “Function not implemented” 错误的处理,这是表示挂载点为只读的另一种方式。

  • #12308: 修复了 pytest 8.2.0 中的回归,其中自动创建的 .pytest_cache 目录的权限变为 rwx------ 而不是预期的 rwxr-xr-x

琐碎/内部更改

  • #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 实现的影响最初未得到适当考虑,这就是为什么它在次要版本中完成。对于由此带来的不便,我们深感抱歉。

弃用

功能特性

  • #11871: 添加了从文件读取命令行参数的支持,使用前缀字符 @,例如:pytest @tests.txt。文件每行必须有一个参数。

    有关详细信息,请参阅 从文件读取参数

改进

缺陷修复

  • #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 的拆卸未以它们初始化的相反顺序发生的问题。

琐碎/内部更改

  • #12069: 现在需要 pluggy>=1.5.0

  • #12167: 缓存: 在临时目录中创建支持文件 (CACHEDIR.TAG.gitignore 等) 以提供原子语义。

pytest 8.1.2 (2024-04-26)

缺陷修复

  • #12114: 修复了与 numpy 数组一起使用并与其他类型比较时 pytest.approx() 中的错误。

pytest 8.1.1 (2024-03-08)

注意

此版本不是通常的缺陷修复版本 – 它包含功能和改进,是 8.1.0 的后续版本,该版本已从 PyPI 撤下。

功能特性

改进

  • #10865: pytest.warns() 现在验证是否使用 strWarning 调用了 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 (已撤下)

注意

此版本已撤下:由于某些警告未按预期显示,它破坏了一些插件,而没有适当的警告期。

请参阅 #12069

pytest 8.0.2 (2024-02-24)

缺陷修复

  • #11895: 修复了 Windows 上的收集,其中初始路径包含路径的短版本(例如 c:\PROGRA~1\tests)。

  • #11953: 修复了从 getstatementrange_ast 引发的 IndexError 崩溃。

  • #12021: 恢复了 pytest 8.0.0 中对 --maxfail 处理的修复,因为它在 pytest-xdist 中引起了回归,当达到 max-fails 时,会话 fixture 的拆卸可能会多次执行。

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)

缺陷修复

  • #11842: 在编写 JUnit XML 文件时,正确转义 skip mark 的 reason

  • #11861: 避免在使用带有 %f 说明符的 log-date-format 时微秒超过 1_000_000,这可能会导致测试套件崩溃。

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 rangeif 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 中添加评论。

版本兼容性

收集更改

在此版本中,我们对 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.Modulepytest.File 的子类型。

    Package 收集器节点指定一个 Python 包,即包含 __init__.py 文件的目录。 以前,Packagepytest.Module (代表单个 Python 模块)的子类型,模块是 __init__.py 文件。 这已被认为是设计上的失误(详情请参阅 #11137#7777)。

    Package 节点的 path 属性现在指向包目录,而不是 __init__.py 文件。

    请注意,__init__.pyModule 节点(它不是 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: 类 NodeCollectorItemFileFSCollector 现在被标记为抽象类(请参阅 abc)。

    我们不希望此更改会影响用户和插件作者,只有当代码已经错误或存在问题时,才会导致错误。

其他重大更改

以下是一些无法弃用的重大更改。

  • #11282: 规范化了定义配置选项时 default 参数的处理。

    以前,如果未为 parser.addini 提供 default,并且配置选项值未在测试会话中定义,则调用 config.getini 会返回一个空列表或一个空字符串,具体取决于是否提供了 type,这显然是不正确的。 此外,即使在使用 default=None 显式定义选项时,None 也不会被采用。

    现在 parser.addini 的行为如下:

    • 如果未传递 default,但提供了 type,则将返回特定于类型的默认值。 例如,type=bool 将返回 Falsetype=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 对异常组的支持。

自定义目录收集器

“新型”钩子包装器

  • #11122: pytest 现在在内部使用“新型”钩子包装器,自 pluggy 1.2.0 起可用。 有关详细信息,请参阅 pluggy 1.2.0 的更新日志更新的文档

    如果插件需要 pytest>=8,则可以使用新型包装器。

其他改进

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_COLORFORCE_COLOR 以忽略空值的问题。

  • #9036: pytest.warns 和类似函数现在在 with 块内引发异常时捕获警告。

改进的文档

  • #11011: 在使用 caplog 时,添加了关于在测试期间修改根 logger 的警告。

  • #11065: 在缓存示例中使用 pytestconfig 而不是 request.config,以与 API 文档保持一致。

琐碎/内部更改

  • #11208: (内部) FixtureDef.cached_result 类型已更改。 现在,第三项 cached_result[2] (如果设置)是异常实例,而不是异常三元组。

  • #11218: (此条目旨在帮助访问私有 pytest 内部组件以实例化 FixtureRequest 对象的插件。)

    FixtureRequest 现在是一个抽象类,不能直接实例化。 为测试函数中的 request fixture 添加了一个新的具体 TopRequest FixtureRequest 子类,作为 fixture 函数中 request fixture 的现有 SubRequest 子类的对应物。

  • #11315: pytester fixture 现在使用 monkeypatch fixture 来管理当前工作目录。 如果您将 pytestermonkeypatch.undo() 结合使用,则 CWD 可能会被恢复。 请改用 monkeypatch.context()

  • #11333: 更正了 Config.ArgsSource.INVOCATION_DIR 的拼写。 之前的拼写 INCOVATION_DIR 仍然作为别名保留。

  • #11638: 修复了当在调用环境中设置了 FORCE_COLORNO_COLORPY_COLORS 时,自测无法正确通过的问题。

pytest 7.4.4 (2023-12-31)

Bug 修复

  • #11140: 修复了在 Python >=3.8 上,文件顶部的非字符串常量被检测为文档字符串的问题。

  • #11572: 处理 sys.stderrsys.__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 修复

  • #11237: 修复了 functools.cached_property 对象的 doctest 收集问题。

  • #11306: 修复了使用 --importmode=importlib 时,可能导致包 __init__.py 文件在某些情况下被多次导入的错误。

  • #11367: 修复了在 fixture 在 teardown 期间失败时,user_properties 未被保存在 JUnit XML 文件中的错误。

  • #11394: 修复了解析可能被解释为文件的长命令行参数时发生的崩溃。

改进文档

  • #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)

新特性

改进

  • #10872: 将测试日志报告注解更新为命名元组,并修复了 pytest_report_teststatus hook 文档中的不一致性。

  • #10907: 当要显示的异常回溯被完全过滤掉时(通过诸如 __tracebackhide__、内部帧和类似机制),现在仅显示异常字符串和以下消息

    “所有回溯条目均已隐藏。传递 --full-trace 以查看隐藏的和内部的帧。”。

    以前,即使回溯的最后一帧被隐藏,也会显示出来。

  • #10940: 改进了 skipxfail 原因的详细输出 (-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 时,将非可编码文本写入日志文件的问题。

改进文档

琐碎/内部更改

  • #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 版)。

  • #10987: 现在遵循 testpaths 来加载根 conftests

  • #10999: monkeypatch setitem/delitem 类型注解现在允许 TypedDict 参数。

  • #11028: 修复了断言重写中的错误,其中使用海象运算符赋值的变量不能在后面的函数调用中使用。

  • #11054: 修复了 --last-failed 的针对包(带有 __init__.py 文件的目录)内部文件的“(skipped N files)”功能。

pytest 7.3.1 (2023-04-14)

改进

  • #10875: Python 3.12 支持:修复了运行 unittest 测试时出现的 RuntimeError: TestResult has no addDuration method

  • #10890: Python 3.12 支持:修复了使用 tmp_path 时出现的 shutil.rmtree(onerror=...) 弃用警告。

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_counttmp_path_retention_policy 配置选项,以控制由 tmp_path fixture 创建的目录的保留方式。

改进

  • #10226: 如果在 teardown 中引发多个错误,我们现在重新引发它们的 ExceptionGroup,而不是丢弃除最后一个之外的所有错误。

  • #10658: 允许 -p 参数包含空格(例如:-p no:logging 而不是 -pno:logging)。在配置文件的 addopts 部分中尤其有用。

  • #10710: 将 startstop 时间戳添加到 TestReport 对象。

  • #10727: 拆分了 rootdirconfig filetestpaths 的报告标头,以便每个都有自己的行。

  • #10840: pytest 不应再因具有病态位置属性的 AST 而崩溃,例如测试由 Hylang <https://github.com/hylang/hy>__ 生成的 AST。

  • #6267: 如果截断消息比隐藏文本长,则不再截断测试的完整输出。显示的行号也已修复。

Bug 修复

  • #10743: 断言重写机制现在在断言表达式包含海象运算符时也能正确工作。

  • #10765: 修复了 tmp_path fixture 由于缺少 os.getuid() 而总是在 emscripten 平台上引发 OSError 的问题。

  • #1904: 正确处理链式异常的 __tracebackhide__。注意:此更改在版本 7.3.1 中已回退。

改进文档

  • #10782: 修复了 良好的集成实践 中的最小示例:pip install -e . 需要在 pyproject.toml 中添加 version 条目才能成功运行。

琐碎/内部更改

  • #10669: pytest 不再直接依赖于 attrs 包。虽然我们在 pytest 都非常喜爱这个包,并感谢 attrs 团队多年的合作和支持,但对于 pytest 来说,尽可能少的外部依赖项是有意义的,因为这有助于下游项目。考虑到这一点,我们已将 pytest 有限的内部使用替换为使用标准库的 dataclasses

    不过,仍然支持 attrs 类的漂亮差异显示。

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’。

改进文档

  • #10690: 将 CIBUILD_NUMBER 环境变量添加到文档中。

  • #10721: 修复了使用 Hatch 的文档示例中的 entry-points 声明。

  • #10753: 更改了模块级跳过的措辞,使其非常明确地说明不收集测试,也不执行模块的其余部分。

pytest 7.2.1 (2023-01-13)

Bug 修复

  • #10452: 修复了 Python 3.12 中的 ‘importlib.abc.TraversableResources’ 弃用警告。

  • #10457: 如果测试是从 fixture 内部跳过的,则测试摘要现在显示测试位置而不是 fixture 位置。

  • #10506: 修复了有时 pytest 会在 Windows 上使用文件系统根目录作为 rootdir 的错误。

  • #10607: 修复了创建 junitxml 报告时的竞争条件,当 pytest 的多个实例并行执行时可能会发生这种情况。

  • #10641: 修复了在创建或更新 stepwise 插件的缓存时的竞争条件,当多个 xdist 工作节点尝试同时更新 stepwise 插件的缓存时可能会发生这种情况。

pytest 7.2.0 (2022-10-23)

弃用

  • #10012: 将 pytest.PytestUnhandledCoroutineWarning 更新为弃用;它将在 pytest 8 中引发错误。

  • #10396: pytest 不再依赖于 py 库。pytest 提供了一个 vendored 副本的 py.errorpy.path 模块,但如果安装了 py 库,则将使用它。如果您需要其他 py.* 模块,请继续单独安装已弃用的 py 库,否则通常可以将其作为依赖项删除。

  • #4562: 弃用使用属性/标记配置 hook specs/impls。

    请改用 pytest.hookimpl()pytest.hookspec()。有关更多详细信息,请参阅 文档

  • #9886: 运行为 nose 编写的测试的功能已正式弃用。

    这包括

    • setupteardown 函数和方法:这可能会让用户感到惊讶,因为 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 修复

  • #10150: 启用捕获时,sys.stdin 现在包含类文件对象的所有预期方法。

  • #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() 后返回当前/正确的数据。

改进的文档

琐碎/内部更改

  • #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.skippytest.mark.skip 跳过 *class* 的测试,不再调用 TestCase.tearDown

  • #10190: JUnit XML 报告现在正确转义 setup 或 teardown 错误消息中的无效 XML 字符。

  • #10230: 忽略 pip 21.3 中引入的基于 pyproject.toml 的可编辑构建创建的 .py 文件。

  • #3396: Doctest 现在遵循 --import-mode 标志。

  • #9514: 将 FixtureRequest.param 类型注解为 Any,作为在 #8073 修复之前的权宜之计。

  • #9791: 修复了 rewrite.py 中的路径处理代码,该代码似乎工作正常,但实际上不正确,并且在某些系统中会失败。

  • #9917: 修复了当用于比较元组时 pytest.approx() 的字符串表示。

改进的文档

琐碎/内部更改

pytest 7.1.2 (2022-04-23)

Bug 修复

  • #9726: 移除 pytest.approx() 内部不必要的 numpy 导入。

  • #9820: 修复了 dataclassesInitVar 的比较。

  • #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)

重大更改

  • #8838: 按照我们的政策,以下功能已在 6.X 系列中弃用,现在已删除

    • pytest._fillfuncargs 函数。

    • pytest_warning_captured hook - 请改用 pytest_warning_recorded

    • -k -foobar 语法 - 请改用 -k 'not foobar'

    • -k foobar: 语法。

    • pytest.collect 模块 - 直接从 pytest 导入。

    有关更多信息,请参阅文档中的 弃用和移除

  • #9437: 停止支持 Python 3.6,该版本在 2021-12-23 已达到 生命周期结束

改进

  • #5192: 修复了某些数据类型的测试输出,其中 -v 会显示较少的信息。

    此外,当显示序列的差异时,-q 会产生完整的差异,而不是预期的差异。

  • #9362: 当检测到默认的 __eq__attrsdataclasses 中被覆盖时,pytest 现在会避免专门的断言格式化。

  • #9536: 当在命令行中给出 -vv 时,以完整形式显示跳过和 xfail 原因,而不是截断它们以适应终端宽度。

  • #9644: 现在可以通过启用 tracemalloc 来获得更多关于导致 Python 引发 ResourceWarning 的资源位置的信息。

    有关更多信息,请参见 资源警告

  • #9678: 现在 @pytest.mark.parametrizeids 参数中接受更多类型。以前只接受 strfloatintbool;现在也接受 bytescomplexre.PatternEnum 以及任何具有 __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=importlibPYTHONPATHpythonpath 一起使用会导致测试套件中出现导入错误。

  • #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: 延迟发布关于涉及 ItemCollector 的菱形继承的 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.inifilepytest_cmdline_main hook 期间可用(7.0.0rc1 期间的回归)。

改进的文档

  • #9404: 在 pytest.warns(None) 弃用之前,添加了关于常见误用的替代方案的额外文档。

  • #9505: 澄清了配置文件所在的位置。为了避免混淆,文档中提到配置文件位于存储库的根目录中。

琐碎/内部更改

  • #9521: 添加了对断言重写路径的测试覆盖率。

pytest 7.0.0rc1 (2021-12-06)

重大更改

  • #7259: Node.reportinfo() 函数的第一个返回值类型已从 py.path.local | str 扩展为 os.PathLike[str] | str

    大多数引用 reportinfo() 的插件仅将其定义为自定义 pytest.Item 实现的一部分。由于 py.path.localos.PathLike[str],因此这些插件不受影响。

    调用 reportinfo()、使用第一个返回值并将其作为 py.path.local 进行交互的插件和用户,需要通过调用 py.path.local(fspath) 进行调整。尽管最好是避免使用旧的 py.path.local,而使用 pathlib.Path,或改用 item.locationitem.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 构造函数已被弃用。有关完整详细信息,请参见 弃用说明

    注意

    Node 参数和属性的名称(新属性为 path)与钩子的情况**相反**(旧参数为 path)。

    这是一个不幸的产物,是由于历史原因造成的,应在未来的版本中解决,因为我们将逐渐摆脱 py 依赖项(有关更长的讨论,请参见 #9283)。

  • #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.skippytest.mark.xfail 保持一致,它们都接受 reason 作为参数。

  • #8174: 以下更改已应用于可通过 pytest.ExceptionInfo.traceback 访问的类型

    • _pytest.code.Codepath 属性返回 Path 而不是 py.path.local

    • _pytest.code.TracebackEntrypath 属性返回 Path 而不是 py.path.local

    此更改没有弃用期(抱歉!)。

功能

  • #5196: 现在在更多情况下,测试按照定义顺序排序。

    在类层次结构中,基类中的测试现在始终在其子类上定义的测试之前排序(反向 MRO 顺序)。

  • #7132: 添加了两个环境变量 PYTEST_THEMEPYTEST_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 8.0 中变为硬错误。

    也不支持子类化它们。目前在运行时不强制执行此操作,但会被诸如 mypy 之类的类型检查器检测到。

  • #7856: –import-mode=importlib 现在可以与依赖于 sys.modules 上的模块的功能一起使用,例如 pickledataclasses

  • #8144: 以下钩子现在接收一个额外的 pathlib.Path 参数,等同于现有的 py.path.local 参数

    注意

    Node 参数和属性的名称(新属性为 path)与钩子的情况**相反**(旧参数为 path)。

    这是一个不幸的产物,是由于历史原因造成的,应在未来的版本中解决,因为我们将逐渐摆脱 py 依赖项(有关更长的讨论,请参见 #9283)。

  • #8251: 将 Node.path 实现为 pathlib.Path。无论 path 还是 fspath (已弃用)是否传递给构造函数,旧的 fspath 和这个新属性都会被设置。它是 fspath 属性的替代品(它表示与 py.path.local 相同的路径)。虽然由于像 reportinfo() 这样的方法的持续迁移,fspath 尚未弃用,但我们预计在未来的版本中会弃用它。

    注意

    Node 参数和属性的名称(新属性为 path)与钩子的情况**相反**(旧参数为 path)。

    这是一个不幸的产物,是由于历史原因造成的,应在未来的版本中解决,因为我们将逐渐摆脱 py 依赖项(有关更长的讨论,请参见 #9283)。

  • #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,这是一种用于插件将其数据以类型安全且无冲突的方式存储在 ConfigNode 上的工具。有关详细信息,请参阅 在钩子函数之间存储项目数据

  • #8953: RunResult 方法 assert_outcomes() 现在接受 warnings 参数来断言捕获的警告总数。

  • #8954: --debug 标志现在接受一个 str 文件来路由调试日志,仍然默认为 pytestdebug.log

  • #9023: 现在,当在环境中找到 CIBUILD_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 -kpytest -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 -kpytest -m 现在支持匹配包含反斜杠 (\) 字符的名称。反斜杠被视为字面字符,而不是转义字符(要匹配的值已经转义)。

  • #8990: 修复了 pytest -vv 在某些情况下崩溃并出现内部异常 AttributeError: 'str' object has no attribute 'relative_to' 的问题。

  • #9077: 修复了从会话作用域的夹具访问 request.fspath / request.path 时令人困惑的错误消息。

  • #9131: 修复了 --pastebin 使用的 URL,以使用 bpa.st

  • #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)

琐碎/内部更改

  • #8494: 现在支持 Python 3.10。

  • #9040: 启用与 pluggy 1.0 或更高版本的兼容性。

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 修复

  • #8152: 修复了当跳过原因为空时,详细测试摘要行中显示 “(<Skipped instance>)” 作为跳过原因的问题。

  • #8249: 修复了在使用 twisted.logger 并使用 pytest --capture=no 运行时 faulthandler 插件的问题。

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 的类型现在已导出,因此可以在测试函数的类型注释中使用它们。 新导出的类型包括

    不支持构造它们(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_pathtmpdir 创建的目录现在在 3 天未修改后被认为是过时的(以前的值为 3 小时),以避免删除仍在长时间运行的测试套件中使用的目录。

  • #7913: 修复了当涉及到 readline 模块时,pytester.spawn 中的崩溃或挂起问题。

  • #7951: 修复了收集测试时递归符号链接的处理。

  • #7981: 修复了在收集期间未跟踪符号链接目录的问题。 在 pytest 6.1.0 中回归。

  • #8016: 修复了当使用 pytest --doctest-modules path/to/an/__init__.py 时只收集一个 doctest 的问题。

改进的文档

  • #7429: 添加了关于跳过 doctest 的更多信息和用例。

  • #7780: 不应从中继承的类现在在 API 参考中标记为 final class

  • #7872: _pytest.config.argparsing.Parser.addini() 接受显式的 None"string"

  • #7878: 在 pull request 部分,要求在编辑 changelog 和 authors 文件后进行提交。

琐碎/内部更改

  • #7802: attrs 依赖项要求现在为 >=19.2.0 而不是 >=17.4.0。

  • #8014: 由 pytest 的断言重写创建的 .pyc 文件现在在 Python>=3.7 上符合更新的 PEP 552 格式。(这些文件是内部文件,仅由 pytest 本身解释。)

pytest 6.1.2 (2020-10-28)

Bug 修复

  • #7758: 修复了一个问题,即使程序包中的某些文件包含失败的测试,也会从 --lf 中丢失。 在 pytest 5.4.0 中回归。

  • #7911: 由 tmpdir 创建的目录现在在 3 天未修改后被认为是过时的(以前的值为 3 小时),以避免删除仍在长时间运行的测试套件中使用的目录。

改进的文档

  • #7815: 改进了 pytest._fillfuncargs() 的弃用警告消息。

pytest 6.1.1 (2020-10-03)

Bug 修复

  • #7807: 修复了 pytest 6.1.0 中的回归,该回归导致在某些非平凡的情况下(父目录也包含配置文件)确定了不正确的 rootdir。

  • #7814: 修复了当使用 testpaths 且包含绝对路径时,header 报告中的崩溃问题(6.1.0 中的回归)。

pytest 6.1.0 (2020-09-26)

重大更改

  • #5585: 按照我们的政策,以下在 5.X 系列中已弃用的功能现已移除

    • FixtureRequestMetafuncFunction 类的 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: FSCollectorPackagegethookproxy()isinitpath() 方法已弃用;请改用 self.session.gethookproxy()self.session.isinitpath()。 这应该适用于所有 pytest 版本。

新特性

  • #7667: 新的 --durations-min 命令行标志控制包含在 --durations 显示的最慢测试列表中的最小持续时间。 以前,这被硬编码为 0.005s

改进

  • #6681: 在初始化早期阶段发出的内部 pytest 警告现在已得到正确处理,并且可以通过 filterwarnings--pythonwarnings/-W 进行过滤。

    这也修复了许多长期存在的问题:#2891, #7620, #7426

  • #7572: 当 required_plugins 中列出的插件丢失或将未知配置键与 --strict-config 一起使用时,现在会显示简单的错误消息,而不是堆栈跟踪。

  • #7685: 向 Config 添加了两个新属性 rootpathinipath。 这些属性是现有 rootdirinifile 属性的 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

  • #7591: 当从 File 继承时,pylint 不应再抱怨未实现的抽象方法。

  • #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_classespython_functions 配置选项,也无需使用 pytest_pycollect_makeitem hook 将它们传递给插件。

pytest 6.0.2 (2020-09-04)

Bug Fixes

  • #7148: 修复了 --log-cli 可能导致不相关的 print 输出被吞噬的问题。

  • #7672: 修复了如果多次调用 caplog.set_level,日志捕获级别恢复不正确的问题。

  • #7686: 修复了当参数化列表为空时,NotSetType.token 被用作参数 ID 的问题。在 pytest 6.0.0 中回归。

  • #7707: 修复了处理包含多行或样式使用多行(例如 --tb=line)的某些异常时的内部错误。

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.Frameexec_()is_true() 方法。

Features

Improvements

  • #7467: --log-file 命令行选项和 log_file ini 标记现在会在需要时创建子目录。

  • #7489: 当 match 等于获得的字符串但不是正则表达式匹配时,pytest.raises() 函数具有更清晰的错误消息。在这种情况下,建议转义正则表达式。

Bug Fixes

  • #7392: 修复了当使用 --runxfail 时,使用 @pytest.mark.skip 跳过的测试的报告位置。

  • #7491: 如果无法访问用于检查过时临时目录的锁,tmpdirtmp_path 不再引发错误。

  • #7517: 保留通过 capfd 捕获的行尾符。

  • #7534: 恢复了意外更改的 TracebackEntry.__str__ 的先前格式。

Improved Documentation

  • #7422: 阐明了 usefixtures 标记何时可以将 fixture 应用于测试。

  • #7441: 添加了关于入门指南中使用的 -q 选项的注释。

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 warning1 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() 进行评估。该格式支持 orandnot、括号和通用标识符进行匹配。Python 常量、关键字或其他运算符不再以不同的方式评估。

  • #7135: Pytest 现在使用其自己的 TerminalWriter 类,而不是使用来自 py 库的类。插件通常通过 TerminalReporter.writerTerminalReporter.write()(和类似方法)或 _pytest.config.create_terminal_writer() 访问此类。

    进行了以下重大更改

    • 输出(write() 方法和其他方法)不再隐式刷新;尊重底层文件的刷新行为。要显式刷新(例如,如果您希望在打印行尾符之前显示输出),请使用 write(flush=True)terminal_writer.flush()

    • 移除了显式的 Windows 控制台支持,委托给 colorama 库。

    • 移除了对写入 bytes 的支持。

    • 移除了 reline 方法和 chars_on_current_line 属性。

    • 移除了 stringioencoding 参数。

    • 移除了对传递可调用对象而不是文件的支持。

  • #7224: 由 logging 插件设置且从未打算公开的 item.catch_log_handleritem.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() 的零个或多个参数的支持。

    • 移除了对将 Sourcestr 进行比较的支持。

    • 移除了 Source.isparseable()Source.putaround() 方法。

    • 移除了 Source.compile() 方法和 _pytest._code.compile() 函数;请改用普通的 compile()

    • 移除了 _pytest._code.source.getsource() 函数;请改用 Source() 直接代替。

Deprecations

  • #7210: -k '-expr'-k 的特殊语法已弃用。 请改用 -k 'not expr'

    特殊的 -k 'expr:'-k 的语法已弃用。 如果您使用此语法并需要替代方案,请提出 issue。

  • #4049: pytest_warning_captured 已弃用,建议使用 pytest_warning_recorded hook。

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.pathsys.modules,从而消除了先前模式的大部分缺点。

    我们计划在未来的版本中将 --import-mode=importlib 作为默认设置,因此鼓励用户尝试新模式并在 issue #7245 中提供反馈(正面或负面)。

    您可以在 文档 中阅读有关此选项的更多信息。

  • #7305: 新的 required_plugins 配置选项允许用户指定 pytest 运行所需的插件列表,包括版本信息。如果在运行 pytest 时未找到任何必需的插件,则会引发错误。

Improvements

  • #4375: pytest 命令现在会抑制 BrokenPipeError 错误消息,该消息在 pytest 的输出通过管道传输,并且管道被管道传输到的程序关闭时打印到 stderr(常见示例为 lesshead)。

  • #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() (其中 requestFixtureRequest fixture)会引发该异常。

  • #6433: 如果在格式化日志调用中的消息时遇到错误,例如 logging.warning("oh no!: %s: %s", "first") (缺少第二个参数),pytest 现在会传播错误,很可能导致测试失败。

    以前,这样的错误会导致错误打印到 stderr,默认情况下,对于通过的测试,stderr 不会显示。此更改使错误在测试期间可见。

    您可以暂时或永久地通过设置 logging.raiseExceptions = False 来抑制此行为。

  • #6817: 保留了命令行选项的帮助文本中的显式换行符,从而使插件可以更好地控制向用户显示的帮助。

  • #6940: 当使用 --duration 选项时,终端消息输出现在可以更精确地显示隐藏项目的数量和持续时间。

  • #6991: 收集的文件显示在来自 hook 的任何报告之后,例如来自 --lf 的状态。

  • #7091: 当通过 --capture=fdcapfdcapfdbinary 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 &quot;ValueError: Some error during setup&quot;">
    

Bug 修复

  • #1120: 修复了当多个 pytest 实例并行运行时,来自 tmpdir 的目录无法正确删除的问题。

  • #4583: 当标记表达式 (-m) 调用 eval() 引发任何异常时,防止崩溃并提供用户友好的错误信息。

  • #4677: SKIPPED 测试的摘要报告中显示路径现在始终是相对路径。以前有时是绝对路径。

  • #5456: 修复了尝试删除用于控制对 tmp_pathtmpdir 创建的文件夹的访问的锁文件时,可能发生的竞争条件。

  • #6240: 修复了在收集步骤中记录日志导致日志消息重复输出到 stderr 的问题。

  • #6428: 如果自会话开始以来当前工作目录已更改,则错误消息中显示的路径现在是正确的。

  • #6755: 支持删除在 windows 上 tmpdir 中创建的长度超过 260 个字符的路径。

  • #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 过滤过多的回归问题。

  • #6992: 回滚 “tmpdir: 清理工厂的间接引用” #6767,因为它破坏了 pytest-xdist。

  • #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),如果还传递了 autouseparams 参数,则该函数不再被忽略,而是被标记为 fixture。

  • #7360: 修复了传递给 pytest.mark.skipifpytest.mark.xfail 的字符串表达式可能不正确的评估,在极少数情况下,使用完全相同的字符串但引用不同的全局值。

  • #7383: 修复了整个代码库中的异常原因,即在包装异常时使用 raise new_exception from old_exception

文档改进

  • #7202: 开发指南现在链接到文档的贡献部分和 GitHub 上的 RELEASING.rst

  • #7233: 添加了关于 --strict--strict-markers 以及后者优先的说明。

  • #7345: 解释了 fixture 的间接参数化和标记。

琐碎/内部更改

  • #7035: _pytest.python.Functionoriginalname 属性现在默认为 name(如果未显式提供),并且始终设置。

  • #7264: 删除了对 wcwidth 包的依赖。

  • #7291: 将 py.iniconfig 替换为 iniconfig

  • #7295: src/_pytest/config/__init__.py 现在使用 warnings 模块报告警告,而不是 sys.stderr.write

  • #7356: 从旧的 pytest-xdist 中删除最后内部使用的已弃用的 *slave* 术语。

  • #7357: 现在需要 py>=1.8.2。

pytest 5.4.3 (2020-06-02)

Bug 修复

  • #6428: 如果自会话开始以来当前工作目录已更改,则错误消息中显示的路径现在是正确的。

  • #6755: 支持删除在 tmpdir 中创建的长度超过 260 个字符的 windows 路径。

  • #6956: 防止 pytest 将 ConftestImportFailure 回溯打印到 stdout。

  • #7150: 防止在引发 ConfTestImportFailure 时隐藏底层异常。

  • #7215: 修复了使用 --pdb 运行时,会为跳过的测试调用 unittest.TestCase 子类的 tearDown 方法的回归问题。

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 修复

  • #6909: 回滚了 #6330 引入的更改,该更改要求 @pytest.mark.parametrize 的所有参数都在函数签名中显式定义。

    原始更改的意图是删除预期之外/令人惊讶的行为,但事实证明很多人依赖它,因此限制已被回滚。

  • #6910: 修复了当插件在使用 --reportlog 选项时返回未知统计信息时发生的崩溃。

pytest 5.4.0 (2020-03-12)

破坏性更改

  • #6316: -k EXPRESSION 与测试名称的匹配现在不区分大小写。

  • #6443: 使用 -p 指定的插件现在在内部插件之后加载,这导致它们的钩子在内部插件之前被调用。

    这使得 -p 行为与 PYTEST_PLUGINS 一致。

  • #6637: 删除了长期弃用的 pytest_itemstart 钩子。

    这个钩子已被标记为弃用,并且甚至在过去 10 年中都没有被 pytest 调用过。

  • #6673: 反转/修复了错误差异中“+/-”的含义。“-”表示结果中缺少预期内容,“+”表示结果中存在意外的额外内容。

  • #6737: 当结果不可用时,FixtureDefcached_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 中添加,并允许指定在测试失败时如何显示捕获的输出:nostdoutstderrlogall(默认值)。

  • #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 选项添加了新选项:logout-errall

  • #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: 添加了对使用 LineMatcherfnmatch_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/Fs/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 中工作。

文档改进

  • #6696: 将 fixture 列表添加到 fixture 章节的开头。

  • #6742: 将关于 fixture 的第一句话扩展成一个段落。

琐碎/内部更改

  • #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 修复

  • #6496: 回滚 #6436:不幸的是,此更改已在许多套件中引起许多回归问题,因此团队决定回滚此更改并发布新版本,同时我们将继续寻找解决方案。

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 修复

  • #5430: junitxml: 失败测试的日志现在会在测试在 call 阶段失败时传递给 junit 报告。

  • #6290: .pytest_cache 目录中的支持文件在使用 --cache-clear 时会被保留,该选项现在仅清除缓存值。

  • #6301: 修复了基于 egg 的发行版和 editable 安装 (pip install --editable) 的断言重写。

pytest 5.3.1 (2019-11-25)

改进

Bug 修复

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 现在被正确地失效。

    这在使用 pytesterrunpytest_inprocess 时很重要。

  • #6047: saferepr 现在处理 BaseExceptions,其中包括 pytest.fail.Exception 等。

  • #6074: pytester: 修复了在清理临时目录时 rm_rf 警告中参数的顺序,并且不为 os.open 的错误发出警告。

  • #6189: 修复了 getmodpath 方法的结果。

琐碎/内部更改

  • #4901: 来自 pytesterRunResult 现在在其为有效的 pytest.ExitCode 值时显示 ret 属性的助记符。

pytest 5.2.4 (2019-11-15)

Bug 修复

  • #6194: 修复了错误地发现非测试 __init__.py 文件的问题。

  • #6197: 回滚 “软件包中的第一个测试 (__init__.py) 使用 @pytest.mark.skip 标记时,现在可以正确跳过。”。

pytest 5.2.3 (2019-11-14)

Bug 修复

  • #5830: 软件包中的第一个测试 (__init__.py) 使用 @pytest.mark.skip 标记时,现在可以正确跳过。

  • #6099: 修复了与参数化函数一起使用 --trace 时的问题。

  • #6183: 在 @pytest.mark.parametrize 中使用 request 作为参数名称现在会产生更友好的用户错误。

pytest 5.2.2 (2019-10-24)

Bug 修复

  • #5206: 修复了 --nf 在部分测试选择时忘记已知 nodeid 的问题。

  • #5906: 修复了在 --setup-show 期间 KeyboardInterrupt 导致的崩溃。

  • #5946: 修复了使用 numpy 数组 (以及可能的其他类序列类型) 参数化 fixture 时的问题。

  • #6044: 正确地忽略了尝试删除旧临时目录时的 FileNotFoundError 异常,例如当多个进程尝试删除同一目录时 (例如,使用 pytest-xdist 时常见)。

pytest 5.2.1 (2019-10-06)

Bug 修复

  • #5902: 修复了 attrs>=19.2 中关于已弃用的 cmp 属性的警告。

pytest 5.2.0 (2019-09-28)

弃用

  • #1682: 将参数作为位置参数传递给 pytest.fixture() 已被弃用 - 请改为将其作为关键字参数传递。

新特性

  • #1682: @pytest.fixturescope 参数现在可以是一个可调用对象,它接收 fixture 名称和 config 对象作为仅关键字参数。有关更多信息,请参阅 文档

  • #5764: --pastebin 选项的新行为:报告连接到 pastebin 服务器的失败,而不会使 pytest 运行失败。

Bug 修复

  • #5806: 修复了从 --pastebin 上传到 bpaste.net 时 “lexer” 被错误地使用为 “text” 的问题。

  • #5884: 修复了自定义 pytest 项目的 --setup-only--setup-show

琐碎/内部更改

  • #5056: HelpFormatter 使用 py.io.get_terminal_width 来获得更好的宽度检测。

pytest 5.1.3 (2019-09-18)

Bug 修复

  • #5807: 修复了 windows 上的 pypy3.6 (nightly)。

  • #5811: 正确处理 pytest.raises 中的 --fulltrace

  • #5819: Windows: 修复了限定名称包含大写字符的 conftest 的回归 (由 #5792 引入)。

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.raisespytest.warns 不再支持将字符串作为第二个参数。

    • pytest.raisesmessage 参数。

    • pytest.raises, pytest.warnsParameterSet.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.xfailpytest.skip 不再支持将字节作为 message 参数。

    Python 2 支持此功能,在 Python 2 中,很容易使用 "message" 而不是 u"message"

    Python 3 代码不太可能将 bytes 传递给这些函数。如果您这样做,请事先将其解码为 str

新特性

  • #5564: 新的 Config.invocation_args 属性,包含传递给 pytest.main() 的未更改参数。

  • #5576: doctest 的新 NUMBER 选项,用于忽略浮点数中不相关的差异。灵感来自 Sébastien Boisgérault 的 doctest numtest 扩展。

改进

  • #5471: JUnit XML 现在在 testsuite 标签中包含时间戳和主机名。

  • #5707: 运行测试套件所花费的时间现在包括人类可读的表示形式,当时间超过 60 秒时,例如

    ===== 2 failed in 102.70s (0:01:42) =====
    

Bug 修复

  • #4344: 修复了尝试仅使用 “__init__.py” 收集软件包时的 RuntimeError/StopIteration 错误。

  • #5115: 在 pytest_configure 期间发出的警告被明确地不视为错误,即使配置为错误也是如此,因为它会完全破坏 pytest。

  • #5477: --junitxml 生成的 XML 文件现在正确地包含 <testsuites> 根元素。

  • #5524: 修复了 tmp_pathtmpdir 不会删除包含标记为只读文件的目录的问题,这可能会导致在第二次使用 --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 修复

  • #5479: 改进了 raises 匹配失败消息中的引用。

  • #5523: 修复了在 Python 3.8+ 中一起使用多个短选项 (例如 -vs) 的问题。

  • #5547: --step-wise 现在可以正确处理 xfail(strict=True) 标记。

改进的文档

  • #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)
    

弃用

  • #4488: --result-log 选项和模块的移除已推迟到(暂定)pytest 6.0,因为团队尚未着手实现其良好的替代方案。

  • #466: 自 pytest 2.3 以来,funcargnames 属性一直是 fixturenames 的别名,现在在代码中也被弃用。

功能

  • #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 版本,以避免陈旧的缓存。

  • #2761: 在不区分大小写的文件系统上遵循 PEP 235

  • #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 属性不再绑定到方法的回归。

  • #5404: 当尝试解包损坏的对象引发异常时,发出警告,以便于调试 (#5080)。

  • #5432: 防止在进程内多次调用 pytest 时,断言重写器发出“已导入”警告。

  • #5433: 修复了包 (__init__.py) 中的断言重写。

  • #5444: 修复了当命令行上传递的第一个文件收集失败时 --stepwise 模式的问题。

  • #5482: 修复了 4.6.0 中引入的 bug,该 bug 在向 pytest.mark.parametrize 传递超过 2 个位置参数时导致收集错误。

  • #5505: 修复了在使用 -p no:terminal 时发现失败时的崩溃。

改进的文档

  • #5315: 扩展了关于使用 monkeypatch 模拟类和字典的文档。

  • #5416: 修复了运行/跳过示例中的 PytestUnknownMarkWarning。

pytest 4.6.11 (2020-06-04)

Bug 修复

  • #6334: 修复了当在 -r 命令行选项中同时使用 f/Fs/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)

功能

  • #6870: 新的 Config.invocation_args 属性,包含传递给 pytest.main() 的未更改的参数。

    备注:虽然这在技术上是一个新功能,并且根据我们的政策,它不应该被向后移植,但我们在这个特殊情况下开了个例外,因为它修复了与 pytest-xdist 的严重交互,所以它也可以被认为是 bug 修复。

琐碎/内部更改

  • #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 修复

  • #5477: --junitxml 生成的 XML 文件现在正确地包含 <testsuites> 根元素。

  • #6044: 正确忽略 FileNotFoundError (OSError.errno == NOENT 在 Python 2 中) 异常,当尝试删除旧的临时目录时,例如当多个进程尝试删除同一个目录时 (例如,与 pytest-xdist 常见)。

pytest 4.6.6 (2019-10-11)

Bug 修复

  • #5523: 修复了在 Python 3.8+ 中一起使用多个短选项 (例如 -vs) 的问题。

  • #5537: 将 importlib_metadata backport 替换为 Python 3.8+ 标准库中的 importlib.metadata

  • #5806: 修复了从 --pastebin 上传到 bpaste.net 时 “lexer” 被错误地使用为 “text” 的问题。

  • #5902: 修复了 attrs>=19.2 中关于已弃用的 cmp 属性的警告。

琐碎/内部更改

  • #5801: 修复了 Python 版本检查 (由 flake8-2020 检测到),以防 python4 成为现实。

pytest 4.6.5 (2019-08-05)

Bug 修复

  • #4344: 修复了尝试仅使用 “__init__.py” 收集软件包时的 RuntimeError/StopIteration 错误。

  • #5478: 修复了在使用带有 pytest.raises 的异常中使用 unicode 字符串时的编码错误。

  • #5524: 修复了 tmp_pathtmpdir 不会删除包含标记为只读文件的目录的问题,这可能会导致在第二次使用 --basetemp 选项执行 pytest 时崩溃。

  • #5547: --step-wise 现在可以正确处理 xfail(strict=True) 标记。

  • #5650: 改进了在解析 ini 配置文件失败时的输出。

pytest 4.6.4 (2019-06-28)

Bug 修复

  • #5404: 当尝试解包损坏的对象引发异常时,发出警告,以便于调试 (#5080)。

  • #5444: 修复了当命令行上传递的第一个文件收集失败时 --stepwise 模式的问题。

  • #5482: 修复了 4.6.0 中引入的 bug,该 bug 在向 pytest.mark.parametrize 传递超过 2 个位置参数时导致收集错误。

  • #5505: 修复了在使用 -p no:terminal 时发现失败时的崩溃。

pytest 4.6.3 (2019-06-11)

Bug 修复

  • #5383: 当使用 --log-cli-level 时,-q 再次对收集项的样式 (--collect-only) 产生影响。

  • #5389: 修复了 #5063 对于 importlib_metadata.PathDistribution 的回归,它们的 files 属性为 None

  • #5390: 修复了 TestCase 项的 obj 属性不再绑定到方法的回归。

pytest 4.6.2 (2019-06-03)

Bug 修复

  • #5370: 还原 all() 的展开以修复嵌套推导式上的 NameError

  • #5371: 还原 all() 的展开以修复带有 if 的生成器的不正确处理。

  • #5372: 还原 all() 的展开以修复在使用表达式中的 all() 时的不正确断言。

pytest 4.6.1 (2019-06-02)

Bug 修复

  • #5354: 修复了当 argvalues 是迭代器时 pytest.mark.parametrize 的问题。

  • #5358: 修复了 all() 调用的断言重写,以处理非生成器。

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: 扩展了关于 setenvdelenvmonkeypatch 一起使用的文档。

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_propertyrecord_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 修复

  • #5113: 来自使用 pytest_collect_modifyitems 作为 hookwrapper 的插件的反选项目现在已正确报告。

  • #5144: 对于用法错误,exitstatuspytest_sessionfinish 钩子中按预期设置为 EXIT_USAGEERROR

  • #5235: outcome.exit 不再与 pdb 包装器中的 EOF 一起使用,而仅与 quit 一起使用。

改进的文档

  • #4935: 扩展了关于注册标记和 --strict 效果的文档。

琐碎/内部更改

  • #4942: logging.raiseExceptions 不再设置为 False

  • #5013: pytest 现在依赖于 wcwidth 来正确跟踪 unicode 字符大小,以获得更精确的终端输出。

  • #5059: pytester 的 Testdir.popen() 现在通过带有默认值 (subprocess.PIPE) 的关键字参数使用 stdoutstderr

  • #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 修复

  • #5089: 修复了当同时启用 showlocals 和详细输出时,由 __repr__ 函数中的错误引起的崩溃。

  • #5139: 消除对 ‘terminal’ 插件的核心依赖。

  • #5229: 要求 pluggy>=0.11.0,它恢复了对 0.10.0 中添加的 importlib-metadata 的依赖。当作为 egg 安装时,importlib-metadata 包无法导入,并且在依赖 setup.py 安装测试依赖项时会导致问题。

改进的文档

  • #5171: 文档: pytest_ignore_collect, pytest_collect_directory, pytest_collect_filepytest_pycollect_makemodule 钩子的 ‘path’ 参数文档类型现在是 py.path.local

  • #5188: 改进了 --runxfail 标志的帮助信息。

琐碎/内部更改

  • #5182: 删除了内部和未使用的 _pytest.deprecated.MARK_INFO_ATTRIBUTE

pytest 4.4.1 (2019-04-15)

Bug 修复

  • #5031: 当使用 pytester 的 testdir fixture 时,环境变量已正确恢复。

  • #5039: 修复了 --pdbcls 的回归,它在 4.0.0 中停止与本地模块一起工作。

  • #5092: 当未知关键字传递给 pytest.param(...) 时,产生警告。

  • #5098: 使用 monkeypatch.syspath_prepend 使导入缓存无效,这在使用命名空间包时是必需的。

pytest 4.4.0 (2019-03-29)

功能特性

  • #2224: 当未安装合适的异步插件(例如 pytest-asynciopytest-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 选项现在通过模块属性处理类(例如,使用 pdbpppdb:pdb.Pdb),并且其验证已得到改进。

  • #4875: 如果 testpaths 配置选项生效(即,目录或文件名未在命令行中显式传递),则该选项现在会显示在 pytest 标头中的 rootdirinifile 行旁边。

    此外,只有当存在配置文件时才会显示 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_prependtestdir.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 可用。

  • #4968: 当在 pdbpp 中使用 debug 命令后使用 pdb quit 命令时,可以正确处理。

  • #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_serializablepytest_report_from_serializable **实验性** hook。

    这些 hook 将被 pytest-xdistpytest-subtests 和 resultlog 的替代品用于序列化和自定义报告。

    它们是实验性的,这意味着它们的细节可能会在未来的补丁版本中更改,甚至完全删除,恕不另行通知。

    欢迎来自插件作者和用户的反馈。

  • #4987: Collector.repr_failure 尊重 --tb 选项,但现在仅默认为 short(使用 auto)。

pytest 4.3.1 (2019-03-11)

Bug 修复

  • #4810: 现在可以正确捕获和显示 pytest_runtest_logreport() 内的 Logging 消息。

  • #4861: 改进了对写入捕获输出的内容的验证,使其行为与禁用捕获时相同。

  • #4898: 修复 testdir.copy_example 中的 AttributeError: FixtureRequest has no 'confg' attribute 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 修复

  • #4651: 使用 UsageError 处理 --help--version

  • #4782: 修复收集带有包的损坏符号链接时的 AssertionError

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”异常。

文档改进

  • #3899: 在 plugins.rst 中添加注释,说明 pytest_plugins 不应被用作包含插件的用户模块的名称。

  • #4324: 文档说明如何使用 raisesdoes_not_raise 编写带有条件 raises 的参数化测试。

  • #4709: 文档说明在使用 pytest.warns 时如何自定义测试失败消息。

琐碎/内部更改

  • #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: 确保 tmpdirtmp_path fixtures 是同一个文件夹。

  • #4681: 确保 tmp_path 始终是真实路径。

琐碎/内部更改

  • #4643: 在 pytest.approx 中使用 a.item() 而不是已弃用的 np.asscalar(a)

    np.asscalarnumpy 1.16. 中已被 弃用

  • #4657: 从 pylib 复制 saferepr

  • #4668: teststatus 报告中预期失败的 verbose 词从 xfail 更改为 XFAIL,以与其他测试结果保持一致。

pytest 4.1.1 (2019-01-12)

Bug 修复

  • #2256: 使用 assert a==b-vv 显示完整 repr。

  • #3456: 扩展 Doctest 模块以忽略 mock 对象。

  • #4617: 修复当上下文管理器被重用时(例如,多次参数化)pytest.warns 的 bug。

  • #4631: 当 __getattr__ 损坏时,不要重写断言

文档改进

  • #3375: 文档说明使用 setup.cfg 可能会导致其他工具崩溃或导致难以追踪的问题,因为它使用的解析器与 pytest.initox.ini 文件不同。

琐碎/内部更改

  • #4602: 在 regen tox env 中卸载 hypothesis

pytest 4.1.0 (2019-01-05)

移除

  • #2169: pytest.mark.parametrize:在以前的版本中,id 函数引发的错误会被抑制并更改为警告。现在,异常会连同 pytest 消息一起传播,告知异常发生的节点、参数值和索引。

  • #3078: 移除遗留的内部警告系统:config.warnNode.warnpytest_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.initox.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.raisesmessage 参数现在会发出 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: 针对使用 attrsdataclasses (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 修复

  • #3532: -p 现在接受其参数时,值之间没有空格,例如 -pmyplugin

  • #4327: approx 再次适用于更通用的容器,更准确地说,是 IterableSized 的实例,而不是更具限制性的 Sequence

  • #4397: 确保节点 ID 是可打印的。

  • #4435: 修复了 raises(..., 'code(string)') 帧文件名。

  • #4458: 在 --collect-only 中显示实际的测试 ID。

改进的文档

  • #4557: 标记示例文档页面已更新,以支持最新的 pytest 版本。

  • #4558: 更新缓存文档示例,以正确显示缓存命中和未命中。

  • #4580: 改进了详细摘要报告文档。

琐碎/内部更改

  • #4447: 将 --result-log 的弃用类型更改为 PytestDeprecationWarning

    已决定在下一个主要版本中删除此功能。

pytest 4.0.2 (2018-12-13)

Bug 修复

  • #4265: 分别验证来自 PYTEST_ADDOPTS 环境变量和 addopts ini 选项的参数。

  • #4435: 修复了 raises(..., 'code(string)') 帧文件名。

  • #4500: 当 fixture yield 并且在测试运行后进行日志调用,并且如果测试被中断,则捕获属性为 None

  • #4538: 为 with raises(..., match=<non-None falsey value>) 引发 TypeError

改进的文档

  • #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 是相对路径时,我们解析绝对路径。

琐碎/内部更改

  • #4315: 在 minversion 检查中使用 pkg_resources.parse_version 而不是 LooseVersion

  • #4440: 调整一些内部 pytest 警告的堆栈级别。

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 转义的事实的缺失文档。

琐碎/内部更改

  • #4272: 如果 cachedir 不是默认值,则在非 verbose 模式下也显示它。

  • #4277: pdb: 改进了关于使用 set_trace 进行输出捕获的消息。

    当使用 -s 时,不要显示 “IO-capturing turned off/on”,以避免混淆。

  • #4279: 改进了当环境变量的值不是 str 时,monkeypatch.setenv 发出的警告的消息和堆栈级别。

pytest 3.9.3 (2018-10-27)

Bug 修复

  • #4174: 修复了通过符号链接的 conftest 插件导致的 “ValueError: Plugin already registered” 错误。

  • #4181: 处理临时文件夹创建和删除之间的竞争条件。

  • #4221: 修复了测试会话结束时的警告摘要未显示警告来源测试的错误。

  • #4243: 修复了在 python2 上将警告的 stacklevel 作为位置参数传递时的回归。

改进的文档

  • #3851: 在 @pytest.mark.parametrize 的文档中添加了对 empty_parameter_set_mark ini 选项的引用

琐碎/内部更改

  • #4028: 恢复对 sys.breakpointhook 的修补,因为它似乎没有任何作用。

  • #4233: 将导入排序器 (reorder-python-imports) 应用于代码库。

  • #4248: 移除对不必要的兼容性垫片 six.binary_type 的使用

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 patching warnings.warn 本身时,可能会导致意外的 MemoryError 异常。

  • #4026: 改进了无法确定函数签名时的错误消息。

  • #4177: 锁定 setuptools>=40.0 以支持 setup.cfg 中的 py_modules

  • #4179: 恢复符号链接当前测试运行的 tmpdir 行为。

  • #4192: 修复了在 python2 下使用 recwarnwarnings.warn 报告的文件名。

pytest 3.9.1 (2018-10-16)

功能特性

  • #4159: 对于包含测试类的测试套件,只有在指定更高 verbosity 级别(至少 “-vv”)时,才会输出关于子类模块的信息。

pytest 3.9.0 (2018-10-15 - 由于发布自动化错误而未发布)

弃用

  • #3616: 以下访问已被记录为弃用多年,但现在实际上发出了弃用警告。

    • 通过 Node 实例访问 Module, Function, Class, Instance, FileItem。现在用户将收到此警告:

      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 时显示文件名。

改进的文档

  • #3713: 更新 usefixtures 文档,以阐明它不能与 fixture 函数一起使用。

  • #4058: 更新 fixture 文档,以指定 fixture 可以在其定义的范围内调用两次。

  • #4064: 根据 unittest.rst,setUpModule 和 tearDownModule 未实现,但事实证明它们已实现。因此更新了 unittest 的文档。

  • #4151: 将 tempir 测试示例添加到 CONTRIBUTING.rst 指南

琐碎/内部更改

  • #2293: 内部 MarkerError 异常已被移除。

  • #3988: 将 tmpdir 的实现移植到 pathlib。

  • #4063: 从 --duration 输出中排除 0.00 秒的条目,除非在命令行上传递 -vv

  • #4093: 修复了内部测试中字符串文字的格式。

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.setenvMonkeyPatch.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__ 时。

改进的文档

  • #3996: 新的 弃用和移除 页面显示了所有当前已弃用的功能,这样做的理由,以及更新代码的替代方案。它还列出了过去主要版本中从 pytest 中删除的功能,以帮助那些使用旧版本 pytest 的用户进行升级。

琐碎/内部更改

  • #3955: 改进 changelog 文件名的 pre-commit 检测

  • #3975: 删除围绕 im_func 的旧代码,因为这仅适用于 python2

pytest 3.8.0 (2018-09-05)

弃用和移除

  • #2452: Config.warnNode.warn 已被弃用,有关理由和示例,请参阅 Config.warn 和 Node.warn

  • #3936: @pytest.mark.filterwarnings 的第二个参数不再进行 regex 转义,使其可以真正使用正则表达式来检查警告消息。

    注意:对匹配字符串进行 regex 转义是一个实现疏忽,可能会破坏依赖于旧行为的测试套件。

功能

  • #2452: 内部 pytest 警告现在使用标准的 warnings 模块发出,使其可以使用标准的警告过滤器来管理这些警告。这引入了 PytestWarningPytestDeprecationWarningRemovedInPytest4Warning 警告类型作为公共 API 的一部分。

    有关更多信息,请查阅 文档

  • #2908: 如果未配置其他警告过滤器,则默认情况下现在显示 DeprecationWarningPendingDeprecationWarning。这使得 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 修复

  • #3911: 终端写入器现在在写出进度时会考虑 unicode 字符宽度。

  • #3913: 当使用未知参数调用时,Pytest 现在返回正确的退出代码 (EXIT_USAGEERROR, 4)。

  • #3918: 提高断言重写的性能。

改进的文档

  • #3566: 在 usage.rst 中为 -r 标志的用法添加了简短说明,该标志用于显示额外的测试摘要信息。

  • #3907: 更正传递给 xfail 的异常集合的类型:raises 参数接受 tuple 而不是 list

琐碎/内部更改

  • #3853: 当没有失败的测试时,删除使用 --failed-first--last-failed 打印的 "run all (no recorded failures)" 消息。

pytest 3.7.4 (2018-08-29)

Bug 修复

  • #3506: 修复写入 .pyc 文件时可能发生的无限递归。

  • #3853: 当使用 --last-failed--failed-first 标志时,缓存插件现在遵循 -q 标志。

  • #3883: 修复使用 console_output_style=classic 时的错误控制台输出。

  • #3888: 修复 macOS 特定代码在 doctest 中使用 capturemanager 插件的问题。

改进的文档

  • #3902: 修复 pytest.org 链接

pytest 3.7.3 (2018-08-26)

Bug 修复

  • #3033: teardown 期间的 Fixture 可以再次使用 capsyscapfd 来检查测试期间捕获的输出。

  • #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: 修复当文件名以大写字母开头时,包内测试被双重收集的问题。

改进的文档

  • #3824: 在 python_files 中添加了多个 glob 模式匹配的示例。

  • #3833: 为 pytester.Testdir 添加了缺失的文档。

  • #3870: 更正 setuptools 集成的文档。

琐碎/内部更改

  • #3826: 将损坏的类型注解替换为类型注释。

  • #3845: 从文档中删除对 issue #568 的引用,该 issue 自那时起已修复。

pytest 3.7.2 (2018-08-16)

Bug 修复

  • #3671: 修复 filterwarnings 未注册为内置标记的问题。

  • #3768, #3789: 修复从包和普通目录混合收集测试的问题。

  • #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.approxnumpy<1.13 中使用数组时的无限递归。

  • #3757: 将 pathlib2 锁定到 >=2.2.0,因为我们需要 __fspath__ 支持。

  • #3763: 修复 python 3 中断言消息为 bytes 时的 TypeError

pytest 3.7.0 (2018-07-30)

弃用和移除

  • #2639: pytest_namespace 已被弃用

  • #3661: 直接调用 fixture 函数,而不是在测试函数中请求它们,现在会发出 RemovedInPytest4Warning。有关理由和示例,请参阅 文档

功能

  • #2283: 新的 package fixture 作用域:fixture 在的最后一个测试完成时最终确定。此功能被认为是实验性的,因此请谨慎使用。

  • #3576: Node.add_marker 现在支持 append=True/False 参数,以确定标记是最后(默认)还是最先出现。

  • #3579: Fixture caplog 现在具有 messages 属性,提供对格式插值日志消息的便捷访问,而无需格式化程序/处理程序提供的额外数据。

  • #3610: 新的 --trace 选项,用于在测试开始时进入调试器。

  • #3623: 引入 pytester.copy_example 作为助手,用于针对项目中的示例执行验收测试。

Bug 修复

  • #2220: 修复了被直接参数(例如参数化)覆盖的 fixture 即使未被测试使用也会被实例化的问题。

  • #3695: 修复 ApproxNumpy 初始化参数混淆,absrel 容差被翻转,导致奇怪的比较结果。添加测试以检查 np.arrayabsrel 容差,并测试使用 np.array() 期望 nan 的情况

  • #980: 修复详细模式下截断的 locals 输出。

改进的文档

  • #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)

琐碎/内部更改

  • 删除过时的 __future__ 导入。 (#2319)

  • 添加 CITATION 以提供有关如何正式引用 pytest 的信息。 (#3402)

  • 将损坏的类型注解替换为类型注释。 (#3635)

  • pluggy 锁定到 <0.8。 (#3727)

pytest 3.6.3 (2018-07-04)

Bug 修复

  • 修复由断言重写的包模块中的显式相对导入触发的 ImportWarning。 (#3061)

  • 修复处理 0 维 numpy 数组时 pytest.approx 中的错误。 (#3593)

  • 使用 get_marker API 时不再引发 ValueError。 (#3605)

  • 修复带有非 ASCII 字符的日志消息不会出现在输出日志文件中的问题。 (#3630)

  • 当旧式标记无法存储在函数中时,不再引发 AttributeError。 (#3631)

改进的文档

  • 现在 @pytest.mark.skipif 示例上方的描述更好地匹配了代码。 (#3611)

琐碎/内部更改

  • 内部重构:从 CallSpec2tox ._globalid_args 属性和 CallSpec2.copy() 中删除了未使用的 metafunc 参数。 (#3598)

  • 消除 Python 2 中 reduce 警告的使用 (#3609)

  • 修复 attr.ib 弃用的 convert 参数的用法。 (#3653)

pytest 3.6.2 (2018-06-20)

Bug 修复

  • 通过提取 MarkDecorator 的标记对象来修复 Node.add_marker 中的回归。 (#3555)

  • 没有 location 的警告被报告为 None。现在已更正为报告 <undetermined location>。 (#3563)

  • 当先前作用域中的 finalizer 引发异常时,继续调用堆栈中的 finalizer。 (#3569)

  • 修复 doctest 中 print 语句的编码错误 (#3583)

改进的文档

  • --strict 标志添加文档。 (#3549)

琐碎/内部更改

  • 在 fixture.rst 文档中将旧的引用样式更新为括号。 (#3525)

  • 改进关于 KeyboardInterrupt--fulltrace 提示的显示。 (#3545)

  • pytest 的 testsuite 不再可通过 python setup.py test 运行 – 请直接调用 pytesttox。 (#3552)

  • 修复文档中的错别字 (#3567)

pytest 3.6.1 (2018-06-05)

Bug 修复

  • 修复了当测试标记为 xfail 时,junitxml 将 stdout 和 stderr 记录两次的错误。 (#3491)

  • 通过正确实例化 FixtureInfo 来修复应用于 unittest 测试的 usefixtures 标记。 (#3498)

  • 修复断言重写器与 monkey patch file 对象的库的兼容性。 (#3503)

改进的文档

  • 在 fixture 文档中添加了关于如何将 fixture 用作工厂的部分。 (#3461)

琐碎/内部更改

  • 启用 pip/pre-commit 的缓存,以减少 travis/appveyor 上的构建时间。 (#3502)

  • 将 pytest 切换到 src/ 布局,因为我们已经建议将其作为最佳实践 - 现在我们也实现了它。 (#3513)

  • 修复测试中的 if 以支持 3.7.0b5,其中 AST 中的 docstring 处理被恢复。 (#3530)

  • 删除一些 python2.5 兼容性代码。 (#3529)

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 修复

  • 一个罕见的竞争条件,可能会导致 Windows 上 .pyc 文件损坏的问题已得到解决。( #3008 )

  • 也使用 iter_marker 来发现从 cli 应用于 marker 表达式的标记,以避免来自旧标记存储的错误数据。( #3441 )

  • 当显示仅包含空格的内容的失败断言差异时,首先使用 repr() 对其进行转义,以便轻松发现差异。( #3443 )

改进的文档

  • 将文档版权年份更改为每次发布时自动更新范围的年份范围。( #3303 )

琐碎/内部更改

  • pytest 现在依赖于 python-atomicwrites 库。( #3008 )

  • 将所有 pypi.python.org URL 更新为 pypi.org。( #3431 )

  • 使用内部插件管理器检测以 pytest_ 为前缀的 hooks,因为 pluggy 正在弃用 PluginManagerimplprefix 参数。( #3487 )

  • _pytest.compat 而不是直接从 collections 导入 MappingSequence,在 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 修复

  • 在每次测试执行之前重置 sys.last_typesys.last_valuesys.last_traceback。这些属性由 pytest 在测试运行期间添加以帮助调试,但从未重置,因此它们会创建对上次失败测试帧的泄漏引用,而该帧永远无法被垃圾回收器回收。( #2798 )

  • 当接收到未知的关键字参数时,pytest.raises 现在会引发 TypeError。( #3348 )

  • pytest.raises 现在可以与看起来像可迭代对象的异常类一起使用。( #3372 )

改进的文档

  • 修复 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)

弃用和删除

  • record_xml_property fixture 现在已被弃用,取而代之的是更通用的 record_property。( #2770 )

  • 现在不推荐在非顶层 conftest.py 文件中定义 pytest_plugins,因为它们会“泄漏”到整个目录树。请参阅文档 了解此决定背后的理由 ( #3084 )

功能

  • 新的 --show-capture 命令行选项,允许指定在测试失败时如何显示捕获的输出:nostdoutstderrlogall (默认值)。( #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 功能的行为:noneall (默认值)。( #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_logstartpytest_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 修复

  • 在 Python 2.7 中关闭用于捕获流的临时文件时,抑制 IOError。( #2370 )

  • 修复 caplog fixture 上的 clear() 方法,该方法清除了 records,但没有清除 text 属性。( #3297 )

  • 在测试收集期间,当不允许读取 stdin 时,DontReadFromStdin 对象仍然允许自身是可迭代的并解析为迭代器而不会崩溃。( #3314 )

改进的文档

琐碎/内部更改

  • attrs 的最低要求更改为 17.4.0。( #3228 )

  • 重命名示例目录,以便从基本目录运行时所有测试都通过。( #3245 )

  • 内部 mark.py 模块已转换为包。( #3250 )

  • pytest 现在依赖于 more-itertools 包。( #3265 )

  • [pytest] 部分用于通过 -c 传递的 .cfg 文件中时,添加警告 ( #3268 )

  • nodeids 现在可以显式传递给 FSCollectorNode 构造函数。( #3291 )

  • 内部重构 FormattedExcinfo 以使用 attrs 功能并删除对旧 Python 版本的旧支持代码。( #3292 )

  • 重构以统一内部处理 verbosity 的方式。( #3296 )

  • 内部重构以更好地与 argparse 集成。( #3304 )

  • 修复 doc/en/usage.rst 中调用 fixture 的 python 示例 ( #3308 )

pytest 3.4.2 (2018-03-04)

Bug 修复

  • 当 capture 选项为 no 时,删除进度信息。( #3203 )

  • 将 bindir 的检查从 exists 重构为 isdir。( #3241 )

  • 修复将 approxDecimal 值一起使用时的 TypeError 问题。( #3247 )

  • 修复使用 request fixture 时生成的引用循环。( #3249 )

  • 现在可以正确识别 *.cfg 文件中由 -c 选项传递的 [tool:pytest] 部分。( #3260 )

改进的文档

  • 将 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 添加 matchmessage 参数的 Sphinx 参数文档。( #3202 )

琐碎/内部更改

  • pytest 更改了发布过程,现在直接从 Travis 发布到 PyPI。( #3060 )

  • ParameterSet._for_parameterize() 重命名为 _for_parametrize(),以便符合命名约定。( #3166 )

  • 跳过 mac 上失败的 pdb/doctest 测试。( #985 )

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 )

琐碎/内部更改

  • 当关键字表达式触发语法错误时 (例如,"-k foo and import" 将显示一个错误,提示您不能在表达式中使用 import 关键字),显示一个简单易懂的错误。( #2953 )

  • 更改参数化自动测试 id 生成,以使用函数的 __name__ 属性,而不是后备参数名称加上计数器。( #2976 )

  • 用 stdlib imports 替换 py.std。( #3067 )

  • 在 logging 文档中将 ‘you’ 更正为 ‘your’。( #3129 )

pytest 3.3.2 (2017-12-25)

Bug 修复

  • pytester: 在 fd 泄漏检测器中忽略用于获取当前用户元数据的文件。( #2784 )

  • 修复 内存泄漏,其中 fixtures 返回的对象永远不会被垃圾回收器销毁。( #2981 )

  • 修复 pyargs 到文件名的转换,使其在 Python 2 上不转换符号链接。( #2985 )

  • PYTEST_DONT_REWRITE 现在也为插件检查,而不仅仅是为测试模块检查。( #2995 )

改进的文档

  • 添加关于多个参数化参数行为的澄清说明 ( #3001 )

琐碎/内部更改

  • 代码清理。( #3015, #3021 )

  • 通过替换 _astast 的导入和引用来清理代码。( #3018 )

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.63.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.fixtureparams 列表现在在 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 返回,因此可以通过属性访问 outerr。 (#2879)

  • 添加 capfdbinary,它是 capfd 的一个版本,它从 readouterr() 返回字节。 (#2923)

  • 添加 capsysbinary,它是 capsys 的一个版本,它从 readouterr() 返回字节。 (#2934)

  • 实现功能以在使用 --doctest-modules 运行时跳过 setup.py 文件。 (#502)

Bug 修复

  • capsys/capfd.disabled() 上下文管理器之后恢复输出捕获。 (#1993)

  • 现在为所有 conftest.py 文件调用 pytest_fixture_setuppytest_fixture_post_finalizer hooks。 (#2124)

  • 如果在加载插件时发生异常,pytest 不再隐藏原始回溯。 在 Python 2 中,它将显示原始回溯,并显示一条新消息,解释在哪个插件中。 在 Python 3 中,它将显示 2 个规范化的异常,即加载插件时的原始异常以及 pytest 抛出的关于加载插件的异常。 (#2491)

  • capsyscapfd 现在可以被其他 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)

琐碎/内部更改

  • pytest 现在依赖于 attrs 用于内部结构,以简化代码可维护性。 (#2641)

  • 重构内部 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 修复

  • 修复了使用 --pyargs 运行时,如果从不同的根目录运行,则会导致 items 具有空的 parent.nodeid 的 bug。 (#2775)

  • 修复了如果 argnames 指定为关键字参数时 @pytest.parametrize 的问题。 (#2819)

  • 从 INI 配置中读取 marker 名称时,去除 marker 名称中的空格。 (#2856)

  • 如果 docstring 中失败示例的行号 < 9,则在 pytest 输出中显示 doctest 源的完整上下文。 (#2882)

  • 将 fixture 路径与实际路径段匹配,以避免匹配共享前缀的文件夹。 (#2836)

改进的文档

  • 引入关于 conftest.py 的专用部分。 (#1505)

  • xfail 的文档中显式提及 xpass。 (#1997)

  • 在 example/parametrize 文档中附加 pytest.param 的示例。 (#2658)

  • 澄清关于 fixtures 参数的提案的语言 (#2893)

  • 在入门文档中列出 python 3.6 作为文档中支持的版本。 (#2903)

  • 澄清可用 fixture scopes 的文档。 (#538)

  • 添加关于 python -m pytest 调用将当前目录添加到 sys.path 的文档。 (#911)

pytest 3.2.3 (2017-10-03)

Bug 修复

  • 修复在未给出前缀时 tab 补全中的崩溃。 (#2748)

  • MarkDecorator 的相等性检查函数 (__eq__) 在一个对象不是 MarkDecorator 的实例时返回 False。 (#2758)

  • 在运行 pytest --fixtures-per-test 时:如果 item 没有 _fixtureinfo 属性(例如 doctests),则不要崩溃 (#2788)

改进的文档

  • -k 选项的帮助文本中,添加使用 not 来不选择名称与提供的表达式匹配的某些测试的示例。 (#1442)

  • parametrize.rst 中添加关于多次调用 metafunc.parametrize 的注释。 (#1548)

琐碎/内部更改

  • 在 pytest 自己的测试套件中设置 xfail_strict=True,以便在预期失败开始通过时立即捕获它们。 (#2722)

  • 修复了将可调用对象传递给 markers 的示例中的拼写错误 (在 example/markers.rst 中) (#2765)

pytest 3.2.2 (2017-09-06)

Bug 修复

  • 调用已弃用的 request.getfuncargvalue() 现在显示调用的来源。 (#2681)

  • 允许声明为 @staticmethod 的测试使用 fixtures。 (#2699)

  • 修复了集合期间的边缘情况:在访问时引发 pytest.fail 的属性会中止整个集合。 (#2707)

  • 修复了混合使用 unicode 和 UTF-8 参数的 ReprFuncArgs。 (#2731)

改进的文档

  • 在使用自定义 markers 的示例中,添加示例演示如何将 pytest.mark.MARKER_NAME.with_argspytest.mark.MARKER_NAME.__call__ 进行比较使用 (#2604)

  • 在一个简单的示例中,使用 pytest_collection_modifyitems() 基于命令行选项跳过测试,允许共享它,同时防止用户在参数解析之前访问 pytest.config 时发生错误。 (#2653)

琐碎/内部更改

  • 修复了“最佳实践/手动集成”代码片段中的小错误。 (#2691)

  • 修复了 goodpractices.rst 中的拼写错误。 (#2721)

  • 改进关于 --resultlog 弃用的用户指导。 (#2739)

pytest 3.2.1 (2017-08-08)

Bug 修复

  • 修复了收集单个测试 item 时的小终端故障。 (#2579)

  • 正确考虑 / 作为文件分隔符,以自动标记 Windows 上的插件文件以进行重写。 (#2591)

  • 在设置 PYTEST_CURRENT_TEST 环境变量时,正确转义测试名称。 (#2644)

  • 修复了 Windows 和 Python 3.6+ 上的错误,当 sys.stdout 已被替换为未实现完整 io 模块缓冲协议的类流对象时。 特别是,这会影响上述平台上的 pytest-xdist 用户。 (#2666)

改进的文档

  • 明确记录哪些 pytest 功能与 unittest 一起使用。 (#2626)

pytest 3.2.0 (2017-07-30)

弃用和移除

  • pytest.approx 不再支持 >>=<<= 运算符,以避免意外/不一致的行为。 有关更多信息,请参阅 approx() 文档。 (#2003)

  • pytest API 中当前类中的所有旧式特定行为在此刻都被视为已弃用,并将在未来的版本中移除。 这仅影响 Python 2 用户和在极少数情况下。 (#2147)

  • 现在,当在 pytest.mark.parametrize 中使用 marks 作为参数时,会引发弃用警告。 使用 pytest.param 将 marks 应用于参数。 (#2427)

功能

  • 添加对 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 和阶段(setupcallteardown)设置。 有关更多信息,请参阅 文档。 (#2583)

  • 引入 @pytest.mark.filterwarnings mark,它允许在每个测试、类或模块级别覆盖 warnings 过滤器。 有关更多信息,请参阅 文档。 (#2598)

  • --last-failed 现在永远记住测试何时失败,只有在再次通过时才会忘记它。 这使得通过选择性地运行文件和逐步修复测试来轻松修复测试套件。 (#2621)

  • 新的 pytest_report_collectionfinish hook,允许插件在集合成功完成后向终端报告添加消息。 (#2622)

  • 添加了对 PEP 415Exception.__suppress_context__ 的支持。 现在,如果 raise exception from None 被 pytest 捕获,pytest 将不再在测试报告中链接上下文。 该行为现在与 Python 的回溯行为匹配。 (#2631)

  • pytest.failpytest.skippytest.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)

改进的文档

  • 澄清 pytest_configure hook 调用顺序。 (#2539)

  • 使用 pytester 插件扩展测试插件代码的文档。 (#971)

琐碎/内部更改

  • 更新 --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)

琐碎/内部更改

  • 创建 invoke tasks 以更新 vendored packages。 (#2474)

  • 更新 LICENSE、README.rst 和文档中的版权日期。 (#2499)

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 警告捕获不再覆盖现有的警告过滤器。之前的行为会覆盖所有过滤器,并在配置警告过滤器以满足其需求的测试套件中引起回归。请注意,作为其副作用,DeprecationWarningPendingDeprecationWarning 默认不再显示。( #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.warns 现在检查子类关系而不是类相等性。感谢 @lesteve 的 PR (#2166)

  • 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。

  • 修复 #2308: 当同时使用 --lf--ff 时,只运行上次失败的测试。感谢 @ojii 的 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。

  • 在 Python 测试收集期间忽略从描述符(例如属性)引发的异常 (#2234)。感谢 @bluetech

  • --override-ini 现在可以正确覆盖一些基本选项,例如 python_files (#2238)。感谢 @sirex 的报告和 @nicoddemus 的 PR。

  • 根据 PEP 479 (#2160),用简单的 returns 替换代码中 raise StopIteration 的用法以完成生成器。感谢 @nicoddemus 的 PR。

  • 修复了在测试中引发无法打印的 AssertionError 时发生的内部错误。感谢 @omerhadari 的 PR。

  • 跳过插件现在也适用于自定义收集器生成的测试项 (#2231)。感谢 @vidartf

  • 修复了如果不存在 .ini 文件,控制台输出中的尾随空格问题 (#2281)。感谢 @fbjorn 的 PR。

  • 无条件 xfail 标记不再依赖于底层测试项是 PyobjMixin 的实例,因此可以应用于非内置 python 测试收集器收集的测试。感谢 @barneygale 的 PR。

3.0.6 (2017-01-22)

  • pytest 不再从其自身的操作生成 PendingDeprecationWarning,这是在版本 3.0.5 中错误引入的 (#2118)。感谢 @nicoddemus 的报告和 @RonnyPfannschmidt 的 PR。

  • pytest 不再将协程函数识别为 yield 测试 (#2129)。感谢 @malinoff 的 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.Functionitem.Module 等现在会发出弃用警告,请优先使用 pytest.Functionpytest.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。

  • 优雅地处理没有匹配 .py 文件的 .pyc 文件 (#2038)。感谢 @nedbat

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。

  • 报告测试失败时的 teardown 输出 (#442)。感谢 @matclab 的 PR。

  • 修复了生成的 xUnit XML 中的 teardown 错误消息。感谢 @gdyuldin 的 PR。

  • 正确处理 multiprocessing 任务中的异常 (#1984)。感谢 @adborden 的报告和 @nicoddemus 的 PR。

  • 在测试完成后清理 unittest TestCase 对象 (#1649)。感谢 @d-b-w 的报告和 PR。

3.0.3 (2016-09-28)

  • parametrizeids 参数再次接受 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)

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。

  • capsyscapfd 现在有一个 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 的结果缓存。

    感谢 @d6e, @sallner

  • 对于测试是元组字面量的断言,发出警告。 这样的断言永远不会失败,因为元组总是真值,并且通常是错误的(参见 #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)。

  • 在错误报告中高亮显示文件位置的路径,以便更易于复制/粘贴。 感谢 @suzaku 贡献了 PR (#1778)。

  • @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.initox.ini 文件中的 [pytest] 部分仍然受支持且未更改。 感谢 @nicoddemus 贡献了 PR。

  • 使用 pytest_funcarg__ 前缀声明 fixture 被认为是已弃用的,将在 pytest-4.0 中移除 (#1684)。 感谢 @nicoddemus 贡献了 PR。

  • 将命令行字符串传递给 pytest.main() 被认为是已弃用的,并计划在 pytest-4.0 中移除。 建议改为传递参数列表 (#1723)。

  • getfuncargvalue 重命名为 getfixturevaluegetfuncargvalue 仍然存在,但现在被认为是已弃用的。 感谢 @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。

  • 修复了 junit xml 输出中的测试总数 (#1798)。 感谢 @cboelsen 贡献了 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.codepytest 之外的用途非常少,并且它位于不同的仓库中,使得及时修复其代码中的错误变得困难。团队希望通过此举能够更好地重构和改进该代码。此更改不应影响用户,但如果用户遇到任何奇怪的行为,告知用户是有用的。

    请记住,pytest._code 的代码是私有的实验性的,因此您绝对不应该显式导入它!

    请注意,原始的 py.code 仍然可以在 pylib 中找到。

  • pytest_enter_pdb 现在可以选择性地接收 pytest config 对象。感谢 @nicoddemus 的 PR。

  • 移除了 Python 2.5 或更低版本的代码和文档,包括移除过时的 _pytest.assertion.oldinterpret 模块。感谢 @nicoddemus 的 PR (#1226)。

  • 当在环境中找到 CIBUILD_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。

  • 修复格式化 utf-8 解释消息 (#1379)。感谢 @biern 的 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.hookimplpytest.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 输出添加 fileline 属性。

  • 修复 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 等)之后的路径来发现 rootdirini 文件。感谢 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.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_valuesys.last_typesys.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.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.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.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.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.testpy.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]