更新日志

版本遵循 语义化版本控制 (<major>.<minor>.<patch>)。

不向后兼容(破坏性)的更改只会在主要版本中引入,并在发布版本的 弃用 部分提前通知。

pytest 8.4.0 (2025-06-02)

移除和向后不兼容的破坏性更改

  • #11372: 如果没有安装任何合适的插件,异步测试现在将失败,而不是警告+跳过。

  • #12346: 如果测试返回除 None 以外的任何值,现在将失败,而不是发出警告。

  • #12874: 我们放弃了对 Python 3.8 的支持,因为它已于 2024-10-07 结束生命周期。

  • #12960: 包含 yield 的测试函数现在会导致显式错误。自 pytest 4.0 以来,它们就未曾运行过,之前被标记为预期失败和弃用警告。

    更多信息请参见文档

弃用(在下个主要版本中移除)

  • #10839: 如果没有 pytest_fixture_setup 钩子来解析异步 fixture,现在请求异步 fixture 将发出 DeprecationWarning。这最常发生在同步测试请求异步 fixture 时。这应该不会影响大多数使用异步测试或 fixture 的异步 pytest 插件用户,但可能会影响非标准钩子设置或 autouse=True。有关如何解决此警告的指导,请参见同步测试依赖异步 fixture

新功能

  • #11538: 添加了 pytest.RaisesGroup,作为 pytest.raises() 的等价物,用于预期 ExceptionGroup。还添加了 pytest.RaisesExc,它现在是 pytest.raises() 背后的逻辑,并作为参数传递给 pytest.RaisesGroupRaisesGroup 包括指定多个不同预期异常的能力、嵌套异常组的结构以及用于模拟 except* 的标志。更多信息请参见关于预期异常组的断言和 docstrings。

  • #12081: 添加了 capteesys,用于捕获并传递输出到 --capture= 设置的下一个处理器。

  • #12504: pytest.mark.xfail() 现在接受 pytest.RaisesGroup 作为 raises 参数,当你预期一个异常组时。你也可以传递一个 pytest.RaisesExc,例如你想使用 check 参数时。

  • #12713: 新增 --force-short-summary 选项,强制无论详细程度如何,都显示精简的摘要输出。

    这允许用户仍然在作业输出的日志文件中看到失败的精简摘要输出,以便快速参考,这在非精简输出非常冗长时特别有用。

  • #12749: pytest 传统上会收集测试模块命名空间中的类/函数,即使它们是从另一个文件导入的。

    例如

    # contents of src/domain.py
    class Testament: ...
    
    
    # contents of tests/test_testament.py
    from domain import Testament
    
    
    def test_testament(): ...
    

    在这种默认选项下,pytest 会从 tests/test_testament.py 收集类 Testament,因为它以 Test 开头,即使在这种情况下,它是一个被导入到测试模块命名空间中的生产类。

    现在可以通过将新的 collect_imported_tests 配置选项设置为 false 来阻止这种行为,这将使 pytest 仅当 类/函数在测试文件中定义时才收集它们。

    —— 作者:@FreerGit

  • #12765: 现在可以使用 truncation_limit_linestruncation_limit_chars 设置触发代码片段截断的阈值。

    更多信息请参见修改截断限制

  • #13125: console_output_style 现在支持 times 以显示每个测试的执行时间。

  • #13192: pytest.raises() 现在在传递空字符串给 match 时会发出警告,因为这将匹配任何值。如果你想检查异常是否没有消息,请使用 match="^$"

  • #13192: pytest.raises() 现在在匹配失败且 match 参数包含 ^$ 且其他部分已被转义时,会打印有用的字符串差异。

  • #13192: 你现在可以传递 with pytest.raises(check=fn):,其中 fn 是一个接受引发的异常并返回布尔值的函数。raises 在没有引发异常时失败(像往常一样),在引发异常且 fn 返回 True 时通过(以及如果指定,在之前检查 match 和类型匹配),如果 fn 返回 False 则传播异常(这很可能也会导致测试失败)。

  • #13228: pytest.HIDDEN_PARAM 现在可以在 pytest.param()id 中或 Metafunc.parametrizeids 中使用。它会将参数集从测试名称中隐藏。

  • #13253: 新标志:--disable-plugin-autoload,可作为 PYTEST_DISABLE_PLUGIN_AUTOLOAD 的替代方案,当设置环境变量不方便时;并允许在配置文件中使用 addopts 进行设置。

现有功能的改进

  • #10224: pytest 的 shortlong 追溯样式(修改 Python 追溯打印)现在部分支持 PEP 657,并将在追溯中显示特定的代码段。

    ================================= FAILURES =================================
    _______________________ test_gets_correct_tracebacks _______________________
    
    test_tracebacks.py:12: in test_gets_correct_tracebacks
        assert manhattan_distance(p1, p2) == 1
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
    test_tracebacks.py:6: in manhattan_distance
        return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                               ^^^^^^^^^
    E   AttributeError: 'NoneType' object has no attribute 'x'
    

    —— 作者:@ammaraskar

  • #11118: 现在 pythonpath 在初始化过程中比以前更早地配置 $PYTHONPATH,这现在也影响通过 -p 命令行选项加载的插件。

    —— 作者:@millerdev

  • #11381: parser.addini 方法的 type 参数现在接受 "int""float" 参数,方便解析配置文件中的配置值。

    示例

    def pytest_addoption(parser):
        parser.addini("int_value", type="int", default=2, help="my int value")
        parser.addini("float_value", type="float", default=4.2, help="my float value")
    

    pytest.ini 文件

    [pytest]
    int_value = 3
    float_value = 5.4
    
  • #11525: Fixtures 现在在输出中清晰地表示为“fixture 对象”,而不是像以前那样作为普通函数,这使得初学者可以轻松发现错误,例如引用在同一模块中声明但未在测试函数中请求的 fixture。

    —— 作者:@the-compiler@glyphack

  • #12426: 当 pytest.mark.usefixtures 在未指定任何 fixture 的情况下使用时,现在会发出警告。以前,空的 usefixtures 标记会被默默忽略。

  • #12707: 在 Python 3.13+ 中进入 Pdb 时,可以导航异常链。

  • #12736: 为 pytest 生成的 junit-xml 的根标签 testsuites 添加了一个新的属性 name,其固定值为 "pytest tests"

    此属性是许多 junit-xml 规范的一部分,甚至也是 pytest 实现所基于的 junit-10.xsd 规范的一部分。

  • #12943: 如果测试因包含单个异常的异常组而失败,则该异常现在将显示在简短的测试摘要信息中。

  • #12958: 对 unraisable 进行了多项增强

    • 尽早设置 unraisable 钩子,尽晚取消设置,以收集尽可能多的 unraisable 异常。

    • 在取消设置 unraisable 钩子之前调用垃圾收集器,以收集任何零散的异常。

    • 每个测试阶段收集多个 unraisable 异常。

    • 报告 tracemalloc 分配追溯(如果可用)。

    • 避免使用基于生成器的钩子,以允许在测试失败时处理 StopIteration

    • 如果引发,将 unraisable 异常作为 pytest.PytestUnraisableExceptionWarning 异常的原因进行报告。

    • 在 unraisable 钩子中计算 unraisable 对象的 repr,以便在可用时获取最新信息,并有助于对象的复活。

  • #13010: pytest.approx() 现在可以比较包含数字和非数字混合的集合。

  • #13016: 对 threadexception 进行了多项增强

    • 尽早设置 excepthook,尽晚取消设置,以收集线程中尽可能多的未处理异常。

    • 每个测试阶段收集多个线程异常。

    • 报告 tracemalloc 分配追溯(如果可用)。

    • 避免使用基于生成器的钩子,以允许在测试失败时处理 StopIteration

    • 如果引发,将线程异常作为 pytest.PytestUnhandledThreadExceptionWarning 异常的原因进行报告。

    • 在 excepthook 中提取线程对象的 name,这将有助于线程的复活。

  • #13031: 像 pytest.mark.parametrize([], ids=idfunc) 这样的空参数集将不再触发对 idfunc 的内部对象调用。

  • #13115: 允许向 pytest.raises 提供 ExceptionGroup[Exception]BaseExceptionGroup[BaseException],以在 ExceptionInfo 上保持完整的类型提示

    with pytest.raises(ExceptionGroup[Exception]) as exc_info:
        some_function()
    

    使用其他异常类型进行参数化仍然是一个错误——我们不检查子异常的类型,因此不允许可能看起来像我们这样做的代码。

  • #13122: --stepwise 模式收到了一些改进

    • 如果 pytest 稍后在没有该标志的情况下执行,它不再忘记上次失败的测试。

      这使得以下工作流程成为可能

      1. 执行带有 --stepwise 的 pytest,然后 pytest 会在第一个失败的测试处停止;

      2. 迭代更新代码并在隔离模式下运行测试,不带 --stepwise 标志(例如在 IDE 中),直到它被修复。

      3. 再次执行带有 --stepwise 的 pytest,pytest 将从之前失败的测试处继续,如果它通过,则继续到下一个测试。

      以前,在第 3 步,pytest 会从头开始,忘记之前失败的测试。

      然而,此更改可能会导致在 --stepwise 模式长时间不使用时出现问题,因为状态可能会过时,因此如果测试套件发生更改,内部状态将自动重置(目前仅考虑测试数量,我们将来可能会更改/改进这一点)。

    • 新标志:--stepwise-reset/--sw-reset,允许用户显式重置分步状态并从头开始重新启动工作流程。

  • #13308: 添加了对 Python 3.14 的官方支持。

  • #13380: 修复 ExceptionGroup 追溯过滤,以排除 pytest 内部。

  • #13415: BibTex 示例的作者元数据现在以姓氏在前,名字在后的格式正确格式化。已添加 BibLaTex 示例。BibTex 和 BibLaTex 示例现在明确指出引用的是软件。

    —— 作者:@willynilly

  • #13420: 通过优化 FSCollector 中使用的路径解析,提高了测试收集性能。

  • #13457: 关于重复参数化的错误消息不再显示内部堆栈跟踪。

  • #4112: 在 pytest.param() 上使用 pytest.mark.usefixtures 现在会产生错误,而不是默默地不执行任何操作。

  • #5473: 将断言重写警告消息中的 : 替换为 ;,以便在调用 pytest.main() 之前可以使用标准 Python 警告过滤器进行过滤。

  • #6985: 改进了 pytest.approx(),以增强 0.001 到 1000 之间值范围和容差的可读性。
    • 现在,repr 方法为这些范围内的值提供了更清晰的输出,使其更容易解释结果。

    • 以前,这些值范围和容差的输出以科学记数法显示(例如,42 ± 1.0e+00)。更新后的方法现在以小数形式显示容差,以提高可读性(例如,42 ± 1)。

      示例

      旧输出

      >>> pytest.approx(42, abs=1)
      42 ± 1.0e+00
      

      当前输出

      >>> pytest.approx(42, abs=1)
      42 ± 1
      

    —— 作者:@fazeelghafoor

  • #7683: 以前可选的 pygments 依赖项现在是必需的,导致输出总是进行源高亮显示(除非通过 --code-highlight=no CLI 选项禁用)。

错误修复

  • #10404: 尽快应用来自 config/cli 的 filterwarnings,并尽可能晚地恢复它们,以便在 pytest 运行期间以及移除 unraisable 和 threadexcept 钩子之前收集警告作为错误。

    这允许非常晚的警告和 unraisable/threadexcept 异常导致测试套件失败。

    这还将 lsof 插件发出的警告从 PytestWarning 更改为新的警告 PytestFDWarning,以便更容易过滤。

  • #11067: 测试报告现在保持一致,无论测试是通过 pytest.mark.xfail 还是 pytest.fail() 进行 xfail 的。

    此前,通过标记进行 *xfail* 的测试会在消息前添加字符串 "reason: ",而通过函数进行 *xfail* 的测试则没有。前缀已被移除。

  • #12008: 在 #11220 中,通过更改直接参数的索引分配方式引入了无意的重新排序更改。更具体地说,在该更改之前,直接参数到 metafunc 的 callspecs 的索引是在所有参数化发生之后才分配的。现在,该更改已恢复。

  • #12863: 修复在 @staticmethod@classmethod 之上放置标记(包括 pytest.mark.parametrize)时的问题。

  • #12929: 正确处理来自测试用例、setup 和 teardown 的 StopIteration。

  • #12938: 修复了在使用 -vv--durations-min 参数未被遵守的问题。

  • #12946: 修复了 pytest 包装的 pdb 命令缺少帮助的问题——作者:@adamchainz

  • #12981: 防止 pytest.Config.add_cleanup() 回调中的异常阻止进一步的清理。

  • #13047: 恢复 pytest.approx()boolnumpy.bool_ 类型之间相等性检查的处理。

    8.3.48.3.5 版本中,使用 pytest.approx() 比较 boolnumpy.bool_ 意外地不再匹配

    >>> import numpy as np
    >>> from pytest import approx
    >>> [np.True_, np.True_] == pytest.approx([True, True])
    False
    

    此问题现已修复

    >>> [np.True_, np.True_] == pytest.approx([True, True])
    True
    
  • #13119: 改进了对过滤警告中无效正则表达式模式的处理,提供了清晰的错误消息。

  • #13175: 比较两个字符串时,差异现在也正确高亮显示。

  • #13248: 修复了在 Metafunc.parametrize 中传递 scope 并设置 indirect=True 时,可能导致其他 fixture 无法依赖于参数化 fixture 的问题。

  • #13291: 修复了在使用 attrs>=25.2 时,断言失败消息中 attrs 对象的 repr 问题。

  • #13312: 修复了 PyPy 在收集涉及更高作用域参数的测试时可能发生的 KeyError 崩溃。

  • #13345: 修复 pytest.TestReport.whenpytest.TestReport.location 的类型提示。

  • #13377: 修复了带纯位置参数语法的测试方法的处理问题。

    现在,支持正式将 self 定义为纯位置参数和/或将 fixture 参数定义为纯关键字参数的方法,例如:

    class TestClass:
    
        def test_method(self, /, *, fixture): ...
    

    此前,这会在 pytest 内部导致错误。

  • #13384: 修复了 pytest 可能报告负持续时间的问题。

  • #13420: 为 nodes._check_initialpaths_for_relpath 添加了 lru_cache

  • #9037: 在参数化测试中转义 id 时,遵守 disable_test_id_escaping_and_forfeit_all_rights_to_community_support

改进的文档

  • #12535: 这个示例`<https://pytest.cn/en/stable/example/simple.html#making-test-result-information-available-in-fixtures> 显示了 ``print` 语句,但它们并未完全反映不同分支的实际作用。该修复使示例更精确。

  • #13218: 在 pytest.approx() 文档中指出它将布尔值视为不等于数字零或一。

  • #13221: 改进了 --help 输出中 CLI 选项的分组。

  • #6649: 将 TerminalReporter 添加到 API 参考 文档页面。

  • #8612: 在文档中添加了处理抽象测试类的配方。

    文档中添加了一个新示例,演示如何使用 mixin 类处理抽象测试类,而无需为子类手动设置 __test__ 属性。这确保了抽象测试类的子类会自动被 pytest 收集。

打包更新和下游注意事项

  • #13317: 指定了 coloramainiconfigpackaging 的最低允许版本;并将 python_version<'3.11'exceptiongroup 的最低允许版本从发布候选版本提升到完整发布版本。

面向贡献者的更改

  • #12017: 混合内部改进

    • 在某些测试中将格式化迁移到 f-string。

    • 在 JUnitXML 测试中使用类型安全构造。

    • MockTiming 移动到 _pytest.timing 中。

    —— 作者:@RonnyPfannschmidt

  • #12647: 修复了使用 hypothesis pytest 插件运行测试套件的问题。

杂项内部更改

pytest 8.3.5 (2025-03-02)

错误修复

  • #11777: 修复了即使使用 -vv 详细级别,序列仍被缩短的问题。

  • #12888: 修复了在 Python 3.13+ 和 libedit 构建的 Python(例如在 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 年发布的 Towncrier 版本的支持——作者:@webknjaz

pytest 8.3.4 (2024-12-01)

错误修复

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

错误修复

  • #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 上 nodeid 路径中反斜杠转换不正确的问题,确保了跨环境的路径处理一致性。

  • #6682: 修复了在打印失败断言的“msg”部分(例如 assert condition, msg)时未遵守详细级别的问题。

  • #9422: 修复了通过 -p no:terminal 禁用终端插件时,会导致与缺少 verbose 选项相关的崩溃的问题。

    —— 作者:@GTowers1

改进的文档

  • #12663: 澄清了 pytest_deselected 钩子应在 pytest_collection_modifyitems 钩子实现中当项目被取消选择时调用。

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

杂项内部更改

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

pytest 8.3.2 (2024-07-24)

错误修复

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 行为与 8.0 之前在 xfail 追溯方面是相同的。虽然这是一个行为更改,但它将默认行为恢复到 8.0.0 之前的行为,这最终被认为是更好的做法。

    —— 作者:@okken

  • #12281: 添加了对标记表达式中关键字匹配的支持。

    现在可以通过标记关键字参数选择测试。支持的值有 int、(未转义的)strboolNone

    更多信息请参见标记示例

    —— 作者:@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 报告中,为测试套件时间戳添加了时区信息。

错误修复

  • #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 中收集器在 setup 期间引发异常的类似回归问题。

    此修复程序需要进行内部更改,这可能会影响某些插件

    • FixtureDef.cached_result[2] 现在是一个元组 (exc, tb) 而不是 exc

    • SetupState.stack 失败现在是一个元组 (exc, tb) 而不是 exc

  • #12275: 修复了遇到 抽象 类(包括抽象 unittest.TestCase 子类)时的收集错误。

  • #12328: 修复了 pytest 8.0.0 中的回归问题,即在某些情况下,包作用域的参数化项目未正确重新排序以最小化设置/拆卸。

  • #12424: 修复了在使用 pytest-rerunfailures 等插件重新运行 unittest 测试时,assert testcase is not None 断言失败导致的崩溃问题。该问题在 8.2.2 中回归。

  • #12472: 修复了从 pytest_report_teststatus 钩子返回类别 "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 入口点,因为这个概念现在更加通用。取而代之的是,使用了“外部”、“已安装”或“第三方”插件(或包)的术语。

    —— 作者:@webknjaz

  • #12577: CIBUILD_NUMBER 环境变量的作用在参考文档中进行了描述。它们现在也出现在执行 pytest -h 时——作者:@MarcBresson

面向贡献者的更改

  • #12467: 通过使用 annotations 未来导入,将所有内部类型注解迁移到 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 自动化创建拉取请求以更新插件列表的用户体验。以前,维护者必须关闭自动创建的拉取请求并重新打开它们以触发 CI 运行。从现在开始,他们只需要点击 Ready for review 按钮即可。

    —— 作者:@webknjaz

  • #12522: :pull: RST 角色已被更短的 :pr: 取代,因为开始使用第三方 sphinx-issues Sphinx 扩展的实现——作者:@webknjaz

  • #12531: 覆盖率报告配置已更新,以将 pytest 自己的被标记为预期失败的测试从覆盖率报告中排除。这会减少 flaky tests 对结果数字的影响。

    —— 作者:@webknjaz

  • #12533: extlinks Sphinx 扩展不再启用。它曾经声明的 :bpo: 角色已随之删除。BPO 本身已于多年前迁移到 GitHub,现在可以使用其 GitHub 问题编号和 sphinx-issues 扩展实现的 :issue: 角色来链接相关问题。

    —— 作者:@webknjaz

  • #12562: 现在通过 pre-commit 工具集成对使用 :user: RST 角色中可能出现的拼写错误进行 linting——作者:@webknjaz

pytest 8.2.2 (2024-06-04)

错误修复

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

  • #12367: 修复了 pytest 8.2.0 中的回归问题,即 unittest 类实例(每个测试都会创建一个新的)在测试 teardown 时不会立即释放,而只会在会话 teardown 时释放。

  • #12381: 修复了由于并发创建缓存目录(.pytest_cache)而可能出现的“目录不为空”崩溃。该问题在 pytest 8.2.0 中回归。

改进的文档

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

  • #12356: 文档中新增了一个小节,用于调试不稳定的测试,提及 pytest 中缺乏线程安全性可能是导致不稳定的一个来源。

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

pytest 8.2.1 (2024-05-19)

改进

  • #12334: 支持 Python 3.13(撰写本文时为 beta1 版本)。

Bug 修复

  • #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 或类似方法访问测试方法的类不受影响。

    重写 __init__ 的类应注意在给定 "runTest" 时不要崩溃,如 unittest.TestCase 的实现所示。或者,考虑使用 setUp 代替 __init__

    如果在使用 tornado.AsyncTestCase 时遇到此问题,请参阅 issue 12263

    如果在使用抽象 TestCase 子类时遇到此问题,请参阅 issue 12275

    历史说明:此更改对自定义 TestCase 实现的影响最初未得到充分考虑,因此在次要版本中进行了此更改。对于由此带来的不便,我们深表歉意。

弃用

功能

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

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

改进

Bug 修复

  • #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 时,在某些情况下会导致不可靠且不直观的拆卸顺序的问题。

  • #12194: 修复了 --importmode=importlib--doctest-modules 的一个错误,即子模块未在父模块中显示为属性。

  • #1489: 修复了在某些情况下,高作用域 fixture 的拆卸未按其初始化时的相反顺序发生的问题。

琐碎/内部更改

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

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

pytest 8.1.2 (2024-04-26)

Bug 修复

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

pytest 8.1.1 (2024-03-08)

注意

此版本并非通常的错误修复版本——它包含功能和改进,是 8.1.0 的后续版本,而 8.1.0 已从 PyPI 中撤回。

功能

改进

  • #10865: pytest.warns() 现在验证 warnings.warn() 是否使用 strWarning 调用。目前在 Python 中可以使用其他类型,但这会导致在使用 warnings.filterwarnings() 过滤这些警告时引发异常(有关讨论,请参阅 CPython #103577)。尽管这可以被认为是 CPython 中的一个错误,但我们决定在 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 的多个终结器引发异常时,现在所有异常都报告为异常组。以前只报告第一个异常。

Bug 修复

  • #11475: 修复了 --importmode=importlib 会多次导入非测试模块的回归问题。

  • #11904: 修复了 pytest 8.0.0 中的一个回归问题,即在使用 --pyargs 时,测试收集会因权限错误而失败。

    此更改改进了使用 --pyargs 指定的测试的收集树,有关与 pytest 8.0 和 <8 的比较,请参阅 #12043

  • #12011: 修复了 8.0.1 中的一个回归问题,即当传递 --doctest-modules 时,setup_module xunit 风格的 fixture 不会执行。

  • #12014: 修复了警告 fixture 上使用的标记时所使用的 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)

Bug 修复

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

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

  • #12021: 撤销了 pytest 8.0.0 中对 --maxfail 处理的修复,因为它导致了 pytest-xdist 中的一个回归问题,即当达到最大失败次数时,会话 fixture 的拆卸可能会执行多次。

pytest 8.0.1 (2024-02-16)

Bug 修复

  • #11875: 正确处理 Python 3.13 中 getpass.getuser() 产生的错误。

  • #11879: 修复了 ExceptionInfo._stringify_exception 可能导致 pytest.raises() 崩溃的边缘情况。

  • #11906: 修复了 pytest.warns() 使用自定义警告子类时,其 __init__ 中有多个参数的回归问题。

  • #11907: 修复了 pytest 8.0.0 中的一个回归问题,即在 pytest.warns() 块内调用 pytest.skip() 和类似控制流异常时,它们会被抑制而不是传播。

  • #11929: 修复了 pytest 8.0.0 中的一个回归问题,即模块中定义的 autouse fixture 会被模块中的 doctests 忽略。

  • #11937: 修复了 pytest 8.0.0 中的一个回归问题,即在某些情况下,项目会以相反的顺序收集。

pytest 8.0.0 (2024-01-27)

Bug 修复

  • #11842: 在写入 JUnit XML 文件时,正确转义 skip 标记的原因。

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

pytest 8.0.0rc2 (2024-01-17)

改进

  • #11233: 改进了 -r 对 xfailures 和 xpasses 的处理

    • 当设置 -rx 时,报告 xfailures 的回溯信息。

    • 当设置 -rX 时,报告 xpasses 的捕获输出。

    • 对于 xpasses,在摘要中的测试名称和原因之间添加 -,以匹配 xfail 的显示方式。

  • #11825: pytest_plugin_registered 钩子新增了一个 plugin_name 参数,其中包含插件注册的名称。

Bug 修复

  • #11706: 修复了在使用 --maxfail--stepwise 时,高作用域 fixture 的拆卸错误报告问题。

    注意:此更改在 pytest 8.0.2 中被撤销,以修复它在 pytest-xdist 中导致的回归问题

  • #11758: 修复了在 if highlighted[-1] == "\n" and source[-1] != "\n" 中发生的 IndexError: string index out of range 崩溃。这个错误是在 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=NoneNone 也未被遵守。

    现在 parser.addini 的行为如下:

    • 如果没有传递 default 但提供了 type,则将返回类型特定的默认值。例如,type=bool 将返回 Falsetype=str 将返回 "",等等。

    • 如果传递了 default=None 并且测试会话中未定义该选项,则将返回 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 对异常组的支持。

自定义目录收集器

“新样式”钩子包装器

其他改进

Bug 修复

  • #10701: pytest.WarningsRecorder.pop() 将返回列表中最接近匹配的警告,而不是请求类型的第一个警告实例。

  • #11255: 修复了在没有包的情况下 parametrize(..., scope="package") 崩溃的问题。

  • #11277: 修复了一个错误,即当间接参数有多个 fixture 时,参数集会选择最高作用域的 fixture 的作用域,而不是选择作用域最窄的那个。

  • #11456: 参数化测试现在确实确保了每个输入给定的 ID 是唯一的——例如,a, a, a0 现在产生 a1, a2, a0 而不是以前(有缺陷的)a0, a1, a0。这必然意味着更改先前冲突的 nodeid,并且为了可读性,当非唯一 ID 以数字结尾时会添加下划线。

  • #11563: 修复了当同一参数化值多次使用空字符串时发生的崩溃。

  • #11712: 修复了 NO_COLORFORCE_COLOR 的处理方式,使其忽略空值。

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

改进文档

  • #11011: 增加了关于在使用 caplog 进行测试期间修改根记录器(root 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)

错误修复

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

  • #11572: 处理了一个边界情况,即当故障处理器(Fault Handler)正在拆解时,sys.stderrsys.__stderr__ 可能已经关闭。

  • #11710: 修复了集合(collection)错误的回溯信息未被修剪的问题。

  • #7966: 移除了当 __iter__ 方法中抛出异常时,断言重写机制中无用的错误信息。现在它们被视为不可迭代。

改进文档

  • #11091: 更新了文档,以引用带连字符的选项:将 --junitxml 替换为 --junit-xml,将 --collectonly 替换为 --collect-only

pytest 7.4.3 (2023-10-24)

错误修复

  • #10447: 标记现在以反向 MRO 顺序考虑,以确保基类标记首先被考虑——这解决了回归问题。

  • #11239: 修复了断言中使用 := 影响不相关测试用例的问题。

  • #11439: 处理了一个边界情况,即当故障处理器(Fault Handler)正在拆解时,sys.stderr 可能已经关闭。

pytest 7.4.2 (2023-09-07)

错误修复

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

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

  • #11367: 修复了一个错误,即如果 fixture 在拆解过程中失败,user_properties 不会保存到 JUnit XML 文件中。

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

改进文档

  • #11391: 改进了 pytest 插件参考页面上的免责声明,以更好地表明这是一个自动生成的、非人工整理的列表。

pytest 7.4.1 (2023-09-02)

错误修复

  • #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 本身在内的其他插件忽略该路径。解决方法是对于您的 hook 不想忽略的路径,返回 None 而不是 False

  • #8711: 如果 level 通过 logging.disable(LEVEL) 全局禁用,caplog.set_level()caplog.at_level() 将暂时启用请求的 level

错误修复

  • #10831: 终端报告:修复了在 --tb=line 模式下运行 pytest.fail(pytrace=False) 测试时报告 None 的错误。

  • #11068: 修复了针对 非 Python 测试文件--last-failed 整文件跳过功能(“跳过 N 个文件”)。

  • #11104: 修复了 pytest 7.3.2 中的一个回归问题,该问题导致 testpaths 在加载初始 conftest 时被考虑,即使它未被使用(例如,当命令行中给出了显式路径时)。现在 testpaths 仅在使用时才被考虑。

  • #1904: 修复了通过 __tracebackhide__ = True 隐藏的回溯条目仍会显示在链式异常中(即“……以上异常……”消息之后的部分)。

  • #7781: 修复了使用 --debug 时向日志文件写入不可编码文本的问题。

改进文档

微小/内部变更

  • #11031: 增强了 -c 的 CLI 标志,现在包含 --config-file,以明确该标志适用于自定义配置文件的使用。

pytest 7.3.2 (2023-06-10)

错误修复

  • #10169: 修复了在某些系统上,非常长的选项名称可能导致 pytest 出现 OSError: [Errno 36] File name too long 错误的问题。

  • #10894: 支持 Python 3.12(撰写本文时为 Beta 版)。

  • #10987: testpaths 现在可以被尊重地加载根 conftests

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

  • #11028: 修复了断言重写中的一个错误,即使用海象运算符赋值的变量无法在后续函数调用中使用。

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

pytest 7.3.1 (2023-04-14)

改进

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

  • #10890: Python 3.12 支持:修复了使用 tmp_pathshutil.rmtree(onerror=...) 弃用警告的问题。

错误修复

  • #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: 如果在拆解过程中引发多个错误,我们现在会重新引发一个 ExceptionGroup,而不是丢弃除最后一个之外的所有错误。

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

  • #10710: 为 TestReport 对象添加了 startstop 时间戳。

  • #10727: 将 rootdirconfig filetestpaths 的报告头分开,使每个都有自己的一行。

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

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

错误修复

  • #10743: 当断言表达式包含海象运算符时,断言重写机制现在可以正常工作。

  • #10765: 修复了在 emscripten 平台上,由于缺少 os.getuid()tmp_path fixture 总是引发 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)

错误修复

  • #10533: 修复了 pytest.approx() 处理包含一个或多个 0.0 值的字典的问题。

  • #10592: 修复了同时传递 --cache-show--help 时崩溃的问题。

  • #10597: 修复了一个错误,即名为 teardown 的 fixture 方法会被作为 nose 拆解阶段的一部分调用。

  • #10626: 修复了同时传递 --fixtures--help 时崩溃的问题。

  • #10660: 修复了 pytest.raises() 返回一个“ContextManager”,以便类型检查器可以将 pytest.raises(...) if ... else nullcontext() 缩小到“ContextManager”而不是“object”。

改进文档

  • #10690: 在文档中添加了 CIBUILD_NUMBER 环境变量。

  • #10721: 修复了使用 Hatch 的文档示例中的入口点声明。

  • #10753: 更改了模块级别跳过的措辞,明确指出不收集测试也不执行模块的其余部分。

pytest 7.2.1 (2023-01-13)

错误修复

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

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

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

  • #10607: 修复了创建 junitxml 报告时可能出现的竞态条件,该条件可能在 pytest 的多个实例并行执行时发生。

  • #10641: 修复了创建或更新 stepwise 插件缓存时可能出现的竞态条件,该条件可能在多个 xdist 工作节点尝试同时更新 stepwise 插件缓存时发生。

pytest 7.2.0 (2022-10-23)

弃用

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

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

  • #4562: 弃用使用属性/标记配置 hook 规范/实现的方式。

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

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

    这包括

    • 普通的 setupteardown 函数和方法:这可能会让用户感到惊讶,因为 setup()teardown() 不是 pytest 的惯用法,而是 nose 支持的一部分。

    • 使用 @with_setup 装饰器进行 setup/teardown。

    有关更多详细信息,请查阅弃用文档

  • #7337: 如果测试函数返回 None 以外的值,现在会发出弃用警告。这可以防止初学者常见的错误,他们可能期望返回布尔值(例如 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.raises() 返回的 pytest.ExceptionInfo.match() 的匹配比较。

  • #8646: 改进了 pytest.raises()。以前传递空元组会给出令人困惑的错误。现在我们立即引发一个更具帮助性的消息。

  • #9741: 在 Python 3.11 上,使用标准库的 tomllib 来解析 TOML。

    tomli 不再是 Python 3.11 的依赖项。

  • #9742: 使用 -vv 显示不带转义换行符的断言消息。

  • #9823: 改进了当给定文件未找到收集器时显示的错误消息。

  • #9873: 短测试摘要中已添加了一些颜色。

  • #9883: 规范化所有命令行选项的帮助描述。

  • #9920: 在 CI 环境中运行时,在“短测试摘要信息”中显示完整的崩溃消息。

  • #9987: 通过允许 .pytest.ini 作为 pytest.ini 的替代方案,增加了对隐藏配置文件的支持。

错误修复

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

  • #10382: 当 raise unittest.SkipTest() 出现在文件顶层时,不要进入 pdb。

  • #7792: 测试类中的标记现在按照完整的 MRO 顺序继承。以前,如果一个测试类继承自两个或更多类,则只有来自第一个超类的标记会生效。

    从超类继承标记时,子类的标记现在在 MRO 顺序中排在超类标记之前。以前是相反的。

    从超类继承标记时,子类的 pytestmark 属性现在只包含直接应用于它的标记。以前,它也包含来自其超类的标记。请注意,此属性通常不应直接访问;请改用 Node.iter_markers

  • #9159: 即使在使用 --tb=native 以外的显示选项时,也通过强制在 ExceptionGroups 中进行原生显示来显示内部异常。这是在完全实现 ExceptionGroups 中内部异常的 pytest 原生显示之前的临时步骤。

  • #9877: 确保在调用 caplog.clear() 后,caplog.get_records(when) 返回当前/正确的数据。

改进文档

  • #10344: 更新了有关编写插件的信息,建议使用 pyproject.toml 而不是 setup.py

  • #9248: 文档现在使用 Sphinx 5.x 构建(以前是 3.x)。

  • #9291: 更新了关于 pytest.warns() 如何影响 DeprecationWarning 的文档。

微小/内部变更

  • #10313: 使 _pytest.doctest.DoctestItem 导出 pytest.DoctestItem 以用于类型检查和运行时目的。使 _pytest.doctest 使用内部 API 以避免循环导入。

  • #9906: 使 _pytest.compat 在类型检查器看来重新导出 importlib_metadata

  • #9910: 修复 cacheprovider 中的默认编码警告(EncodingWarning

  • #9984: 改进了尝试访问已拆解的 fixture 时的错误消息。在 docstring 中添加了一个额外的句子,解释何时不宜调用 getfixturevalue

pytest 7.1.3 (2022-08-31)

错误修复

  • #10060: 在使用 --pdb 运行时,当通过 unittest.skippytest.mark.skip 跳过测试类时,TestCase.tearDown 不再为这些测试调用。

  • #10190: setup 或 teardown 错误消息中的无效 XML 字符现在已为 JUnit 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)

错误修复

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

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

  • #9869: 增加了 NODE_CTOR_FSPATH_ARG 弃用的 stacklevel,使其指向用户代码,而不是 pytest。

  • #9871: 修复了一个奇怪(但幸运的是很少见)的错误,即 temp_path fixture 在尝试获取当前用户的用户名时可能引发内部错误。

pytest 7.1.1 (2022-03-17)

错误修复

  • #9767: 修复了 pytest 7.1.0 中的一个回归问题,即源树之外的一些 conftest.py 文件(例如在 site-packages 目录中)未被识别。

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: 当检测到 attrsdataclasses 中覆盖了默认的 __eq__ 时,pytest 现在会避免专门的断言格式化。

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

  • #9644: 现在可以通过启用 tracemalloc 获取导致 Python 抛出 ResourceWarning 的资源位置的更多信息。

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

  • #9678: @pytest.mark.parametrizeids 参数现在接受更多类型。以前只接受 strfloatintbool;现在 bytescomplexre.PatternEnum 以及任何具有 __name__ 的类型也都被接受。

  • #9692: pytest.approx() 现在在给定无序序列(如 set)时会引发 TypeError

    请注意,这意味着仅实现 __iter____len__ 的自定义类不再受支持,因为它们不保证顺序。

错误修复

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

错误修复

  • #9608: 修复了 Python 3.9 中 importlib.readers 的无效导入问题。

  • #9610: 恢复 UnitTestFunction.obj 返回非绑定方法而不是绑定方法。修复了 unittest 测试用例在拆解失败时(使用非默认 __init__)的崩溃问题。在 pytest 7.0.0 中引入的回归。

  • #9636: pythonpath 插件已重命名为 python_path。这避免了与 pytest-pythonpath 插件的冲突。

  • #9642: 修复了在参数化部分中使用 :: 按 ID 运行测试的问题。

  • #9643: 延迟发出关于涉及 ItemCollector 的菱形继承的 PytestWarning,以便可以使用标准警告过滤器进行过滤。

pytest 7.0.0 (2022-02-03)

(**请参阅下方 7.0.0rc1 注释中此版本的完整更改集**)

弃用

错误修复

  • #9355: 修复了 Python 3.8 及更高版本中,使用 `assert` 时错误消息打印函数装饰器的问题。

  • #9396: 确保在 pytest_cmdline_main hook 期间 pytest.Config.inifile 可用(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: hook 的 py.path.local 参数已被弃用。有关完整详情,请参阅弃用说明

    Node 构造函数的 py.path.local 参数已被弃用。有关完整详情,请参阅弃用说明

    注意

    Node 参数和属性的名称(新属性为 path)与 hook 的情况(旧参数为 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: 以下 hook 现在接受一个额外的 pathlib.Path 参数,等同于现有的 py.path.local 参数

    注意

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

    这是一个不幸的历史遗留问题,应该在未来的版本中解决,因为我们将逐渐摆脱对 py 的依赖(有关更长的讨论,请参阅 #9283)。

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

    注意

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

    这是一个不幸的历史遗留问题,应该在未来的版本中解决,因为我们将逐渐摆脱对 py 的依赖(有关更长的讨论,请参阅 #9283)。

  • #8421: pytest.approx() 现在适用于映射/字典和序列/列表中的 Decimal

  • #8606: 使用 --fixtures-per-test--fixtures 调用 pytest 已得到增强:

    • 夹具位置路径与夹具名称一起打印。

    • 夹具 docstring 的第一部分在夹具名称下方打印。

    • 使用 --verbose 选项时,夹具的整个 docstring 在夹具名称下方打印。

  • #8761: 新增 pytest.version_tuple 属性,这使得用户可以更简单地根据 pytest 版本执行操作(例如声明在较新版本中引入的 hook)。

  • #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() 现在在保存字典时保留键的顺序。

错误修复

  • #7124: 修复了当提供了 --doctest-modules 时,__main__.py 会引发 ImportError 的问题。

  • #8061: 修复了继承自父测试类的 staticmethod 测试用例失败的问题。

  • #8192: testdir.makefile 现在默默地接受不以 . 开头的值,以保持与旧版 pytest 的向后兼容性。

    如果 ext 参数中缺少 .pytester.makefile 现在会发出更清晰的错误。

  • #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: 修复了从会话范围的 fixture 访问 request.fspath / request.path 时出现混淆错误消息的问题。

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

  • #9163: 断言重写语句的结束行号和结束列偏移量现在已正确设置。

  • #9169: 支持重写文件中 importlib.resourcesfiles API。

  • #9272: nose 兼容模块级别的 fixture setup()teardown() 现在只在每个模块中调用一次,而不是为每个测试函数调用。即使定义了对象级别的 setup/teardown,它们现在也会被调用。

文档改进

  • #4320: 改进了 pytester.copy_example 的文档。

  • #5105: 添加了自动生成的Pytest 插件列表。该列表会定期更新。

  • #8337: 在 pytest.approx() 文档中推荐使用 numpy.testing 模块。

  • #8655: --pdbcls 的帮助文本更准确地反映了该选项的行为。

  • #9210: 删除了关于 confcutdir 是配置选项的不正确文档:它只能通过 --confcutdir 命令行选项设置。

  • #9242: 升级 readthedocs 配置以使用更新的 Ubuntu 版本 <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 上传器。

  • #9225: 更改了用于创建 sdist 和 wheel artifact 的命令:使用 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)

错误修复

  • #8539: 修复了 Python 3.10 上的断言重写问题。

pytest 6.2.3 (2021-04-03)

错误修复

  • #8414: pytest 过去会在 /tmp 下创建具有全局可读权限的目录。这意味着系统中的任何用户都能够读取测试在临时目录中写入的信息(例如由 tmp_path/tmpdir fixture 创建的目录)。现在这些目录以私有权限创建。

    pytest 过去会静默使用预先存在的 /tmp/pytest-of-<username> 目录,即使它由另一个用户拥有。这意味着另一个用户可以预先创建这样一个目录并控制另一个用户的临时目录。现在这种情况会导致错误。

pytest 6.2.2 (2021-01-25)

错误修复

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

  • #8249: 修复了在与 twisted.logger 一起运行并使用 pytest --capture=nofaulthandler 插件的问题。

pytest 6.2.1 (2020-12-15)

错误修复

  • #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: pytest 现在会在 Python>=3.8 上警告测试中发生的不可提升异常和未处理的线程异常。有关更多信息,请参阅不可提升异常和未处理线程异常警告

  • #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: 现在可以直接构造 MonkeyPatch 对象为 pytest.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 fixture 的类型现已导出,以便可在测试函数的类型注解中使用。新导出的类型包括

    构造它们不受支持(MonkeyPatch 除外);它们仅用于类型注解。这样做会发出弃用警告,并且在 pytest 8.0 中可能会成为硬性错误。

    子类化它们也不受支持。目前在运行时不强制执行,但会被 mypy 等类型检查器检测到。

  • #7527: 当相同类型的 namedtuple 实例之间比较失败时,pytest 现在显示不同的字段名称(可能嵌套),而不是它们的索引。

  • #7615: Node.warn 现在允许任何 Warning 的子类,而不仅仅是 PytestWarning

  • #7701: 改进了使用 --collected-only 时的报告。现在它将在摘要统计中显示收集到的测试数量。

  • #7710: 在 pytest.approx() 中对非数值类型使用严格相等比较,而不是引发 TypeError

    这是 3.7 之前未文档化的行为,但现在是正式支持的功能。

  • #7938: 新增 --sw-skip 参数,它是 --stepwise-skip 的简写。

  • #8023: 将 'node_modules' 添加到 norecursedirs 的默认值中。

  • #8032: doClassCleanups(在 Python 3.8 的 unittest 中引入)现在被适当地调用。

错误修复

  • #4824: 修复了使用自动夹具和 xunit 夹具收集项目时的二次行为并提高了性能。

  • #7758: 修复了 pytest 5.4.0 中引入的一个问题,即包中的某些文件在 --lf 中丢失,即使它们包含失败的测试。

  • #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: 在拉取请求部分,要求在编辑 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)

错误修复

  • #7758: 修复了 pytest 5.4.0 中引入的一个问题,即包中的某些文件在 --lf 中丢失,即使它们包含失败的测试。

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

文档改进

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

pytest 6.1.1 (2020-10-03)

错误修复

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

  • #7814: 修复了在报告头部时,当 testpaths 使用并包含绝对路径时发生的崩溃(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 'not expr'

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

  • #7255: pytest_warning_captured 钩子已弃用,取而代之的是 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 修复

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

改进的文档

  • #1477: 移除了 faq.rst 及其在 contents.rst 中的引用。

琐碎/内部更改

  • #7536: 内部 junitxml 插件已重写为使用 xml.etree.ElementTree。XML 元素中属性的顺序可能会有所不同。一些不必要的转义不再执行。

  • #7587: 对 more-itertools 包的依赖已被移除。

  • #7631: capfd.readouterr()(及类似)的结果类型不再是命名元组,但其所有行为都应与命名元组相同。这是出于技术原因。

  • #7671: 在收集测试时,pytest 通过检查 Python 对象(模块、类和实例)的属性来查找测试类和函数。为了加快此过程,pytest 现在会忽略内置属性(如 __class____delattr____new__),而无需查阅 python_classespython_functions 配置选项,也无需通过 pytest_pycollect_makeitem 钩子将它们传递给插件。

pytest 6.0.2 (2020-09-04)

Bug 修复

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

  • #7394: 现在允许向 Parser.add_option 传递空的 help 值,而不是在运行 pytest --help 时崩溃。传递 None 会引发更具信息性的 TypeError

  • #7558: 修复 pylint 对 pytest.mark.parametrize() 和其他内置标记(skipskipifxfailusefixturesfilterwarnings)的 not-callable 错误。

  • #7559: 修复了当 TestReport.longrepr 不是字符串时,使用 TestReport.longreprtext 的插件(例如 pytest-html)中的回归问题。

  • #7569: 修复了在调用 caplog.set_level() 后,日志捕获处理程序的级别在 teardown 时未重置的问题。

pytest 6.0.0 (2020-07-28)

(请参阅下方 6.0.0rc1 说明中的此版本完整变更集)

破坏性更改

  • #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() 方法已被移除。

特性

改进

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

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

Bug 修复

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

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

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

  • #7534: 恢复了因意外更改而导致 TracebackEntry.__str__ 之前的格式。

改进的文档

  • #7422: 澄清了 usefixtures 标记何时可以应用于测试夹具。

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

琐碎/内部更改

  • #7389: fixture 作用域 package 不再被视为实验性功能。

pytest 6.0.0rc1 (2020-07-08)

破坏性更改

  • #1316: TestReport.longrepr 现在始终是 ReprExceptionInfo 的实例。以前,当测试因 pytest.fail(..., pytrace=False) 失败时,它是一个 str

  • #5965: 在收集和匹配 conftest.py 文件与测试文件路径时,不再解析符号链接。

    在 3.9.0 版中,为当前目录和在收集期间解析符号链接作为 bug 修复引入,但它实际上是一个新功能,在 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: 由日志插件设置的 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 钩子规范。这个钩子至少十年未被 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()

弃用

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

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

  • #4049: pytest_warning_captured 已弃用,支持 pytest_warning_recorded 钩子。

特性

  • #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 的新钩子,用于传达有关内部 pytest 警告插件捕获的警告信息。

    此钩子旨在取代已弃用并将在未来版本中移除的 pytest_warning_captured

  • #6471: 新命令行标志:

    • --no-header: 禁用初始头部,包括平台、版本和插件信息。

    • --no-summary: 禁用最终测试摘要,包括警告。

  • #6856: 现在当从配置 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 时未找到任何必需插件,则会引发错误。

改进

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

  • #4391: 提高了测试持续时间测量的精度。CallInfo 项现在有一个新的 <CallInfo>.duration 属性,使用 time.perf_counter() 创建。此属性用于填充 <TestReport>.duration 属性,它比以前的 <CallInfo>.stop - <CallInfo>.start 更准确(因为这些基于 time.time())。

  • #4675: dataclasses 和 attrs 类的富比较现在是递归的。

  • #6285: 暴露了 pytest.FixtureLookupError 异常,当无法返回给定名称的 fixture 时,request.getfixturevalue()(其中 requestFixtureRequest fixture)会引发此异常。

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

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

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

  • #6817: 命令行选项帮助文本中的显式换行符被保留,允许插件更好地控制向用户显示的帮助信息。

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

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

  • #7091: 当使用 fd 捕获时,通过 --capture=fdcapfdcapfdbinary fixtures,并且文件描述符(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() 不再影响在“捕获日志报告”部分中显示的日志级别。

  • #7348: 改进了 dataclasses / attrs 上比较断言的递归 diff 报告。

  • #7385: --junitxml 现在在 setup 和 teardown 期间的失败中,将异常原因包含在 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: 防止在 marker 表达式(-m)调用 eval() 时引发任何异常时崩溃,并提供用户友好的错误。

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

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

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

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

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

  • #6871: 修复了使用 capsysbinary 时捕获输出导致的崩溃。

  • #6909: 恢复了 #6330 引入的更改,该更改要求 @pytest.mark.parametrize 的所有参数都必须在函数签名中或通过 indirect 显式定义。

    原始更改的意图是消除预期中的意外/令人惊讶的行为,但事实证明许多人依赖它,因此该限制已被恢复。

  • #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: clean up indirection via config for factories” #6767,因为它会破坏 pytest-xdist。

  • #7061: 当一个 yielding fixture 无法 yield 值时,报告一个测试 setup 错误而不是崩溃。

  • #7076: @pytest.mark.skip 跳过的文件在 SKIPPED 报告中的路径现在相对于调用目录。以前它相对于根目录。

  • #7110: 修复了回归问题:asyncbase.TestCase 测试现在再次正确执行。

  • #7126: 当 Python 使用 -bb 标志调用时,--setup-show 不再在字节值用作 parametrize 参数时引发错误。

  • #7143: 修复 pytest.File.from_parent,使其将额外的关键字参数转发给构造函数。

  • #7145: 具有损坏的 __getattribute__ 方法的类在失败时会正确显示。

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

  • #7180: 修复 _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: clean up indirection via config for factories” #6767,因为它会破坏 pytest-xdist。

  • #7110: 修复了回归问题:asyncbase.TestCase 测试现在再次正确执行。

  • #7143: 修复 File.from_parent,使其将额外的关键字参数转发给构造函数。

  • #7145: 具有损坏的 __getattribute__ 方法的类在失败时会正确显示。

  • #7180: 修复 _is_setup_py 对于与区域设置编码不同的文件的问题。

pytest 5.4.1 (2020-03-13)

Bug 修复

  • #6909: 恢复了 #6330 引入的更改,该更改要求 @pytest.mark.parametrize 的所有参数都必须在函数签名中或通过 indirect 显式定义。

    原始更改的意图是消除预期中的意外/令人惊讶的行为,但事实证明许多人依赖它,因此该限制已被恢复。

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

pytest 5.4.0 (2020-03-12)

破坏性更改

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

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

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

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

    此钩子已被标记为弃用,并且十多年来甚至没有被 pytest 调用过。

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

  • #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: 添加了对 doctests 中调用 pytest.xfail()pytest.importorskip() 的支持。

  • #3823: --trace 现在与 unittests 兼容。

  • #4445: 修复了 pytest 产生的一些警告报告,使其指向用户代码中警告的正确位置。

  • #5301: 修复了 --last-failed 无法从已知失败的文件中收集新测试的问题。

  • #5928: 在用户代码级别报告 PytestUnknownMarkWarning,而不是在 pytest 级别。

  • #5991: 修复了 --pdb 与 unittests 的交互:不再使用 unittest 的 TestCase.debug()

  • #6334: 修复了当 -r 命令行选项中同时使用 f/Fs/S 报告字符(例如 -rFf)时,摘要条目出现两次的问题。

    大写形式从未被文档化,首选形式应为小写。

  • #6409: 对于没有先前通过的非最后一个项目,带有彩色终端进度指示器时,回退到绿色(而不是黄色)。

  • #6454: --disable-warnings-ra-rA 时也生效。

  • #6497: 修复了 fixture 中请求键与缓存键比较时的 bug。

    构造 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.exit() 在从 pytest_sessionfinish 钩子发出时得到处理。这包括从调试器退出。

  • #6752: 当 pytest.raises() 作为函数(而不是上下文管理器)使用时,match 关键字参数现在会传递给被测试的函数。以前它会被吞噬并忽略(pytest 5.1.0 中的回归)。

  • #6801: 对于 doctests 中意外异常的堆栈跟踪,不要在中间显示空行。

  • #6802: testdir fixture 现在可以在 doctests 中使用。

改进的文档

  • #6696: 在 fixture 章开头添加 fixture 列表。

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

琐碎/内部更改

  • #6404: 移除了对 parser 模块的使用,该模块在 Python 3.9 中已弃用。

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: 拆卸期间捕获的输出显示为 -rP

  • #5971: 修复了处理 multiprocessing 模块创建的子进程中引发的异常时 pytest-xdist 崩溃的问题。

  • #6436: FixtureDef 对象现在可以正确地将其终结器注册到在夹具堆栈中其之前执行的 autouse 和参数化夹具,以便它们在正确的时间以正确的顺序拆卸。

  • #6532: 修复了 testdir 结果中包含多个错误的结果解析问题(5.3.0 版本中的回归)。

琐碎/内部更改

  • #6350: 优化了测试参数 ID 的自动重命名功能。

pytest 5.3.2 (2019-12-13)

改进

  • #4639: 恢复“现在对 None 进行断言时会发出警告”。

    事实证明,该警告不如最初预期有用,并且存在相当多的误报情况。

错误修复

  • #5430: junitxml: 如果测试在调用阶段失败,则失败测试的日志现在会传递到 junit 报告中。

  • #6290: .pytest_cache 目录中的支持文件在执行 --cache-clear 时会保留,现在它只清除缓存值。

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

pytest 5.3.1 (2019-11-25)

改进

错误修复

pytest 5.3.0 (2019-11-19)

废弃

  • #6179: junit_family 选项的默认值将在 pytest 6.0 中更改为 "xunit2",因为这是现代处理此类文件的工具默认支持的版本。

    为了平滑过渡,如果在命令行中指定了 --junitxml 选项但未在 pytest.ini 中明确配置 junit_family,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 的参数,以便在设置命令行选项时可以调用钩子。这对于一个插件向另一个插件通信非常有用,例如传递默认值或要添加的命令行选项集。

改进

  • #5061: 终端摘要统计使用多种颜色。

  • #5630: 现在在 doctest 项中正确处理从调试器退出。

  • #5924: 改进了序列的详细差异输出。

    之前

    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: reprExceptionInfo 对象已得到改进,以尊重底层异常的 __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 不再无条件跳过/xfail FreeBSD 上的测试。

  • #6097: 测试摘要中的“[...%]”指示器现在根据最终(新)多色行的主要颜色进行着色。

  • #6116: 添加 --co 作为 --collect-only 的同义词。

  • #6148: atomicwrites 现在仅在 Windows 上使用,修复了 Unix 上断言重写的性能回归问题。

  • #6152: 现在参数化将使用任何对象的 __name__ 属性作为 ID,如果存在的话。以前它只对函数和类使用 __name__

  • #6176: 改进了 pytester 的 Hookrecorder.assertoutcome 的失败报告。

  • #6181: 会话停止的原因,例如由于 --maxfail / -x,现在会在测试摘要中报告。

  • #6206: 提高了 cache.set 的健壮性和性能。

错误修复

  • #2049: 修复了 --setup-plan 显示关于夹具生命周期的不准确信息的问题。

  • #2548: 修复了终端摘要中跳过测试的行偏移不匹配问题。

  • #6039: 当取消配置 doctest 插件时,PytestDoctestRunner 现在会正确失效。

    这在使用 pytesterrunpytest_inprocess 时很重要。

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

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

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

琐碎/内部更改

  • #4901: pytester 中的 RunResult 现在在 ret 属性是有效的 pytest.ExitCode 值时显示其助记符。

pytest 5.2.4 (2019-11-15)

错误修复

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

  • #6197: 撤销“现在正确跳过包中第一个标有 @pytest.mark.skip 的测试(__init__.py)。”。

pytest 5.2.3 (2019-11-14)

错误修复

  • #5830: 包中第一个标有 @pytest.mark.skip 的测试(__init__.py)现在会正确跳过。

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

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

pytest 5.2.2 (2019-10-24)

错误修复

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

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

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

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

pytest 5.2.1 (2019-10-06)

错误修复

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

pytest 5.2.0 (2019-09-28)

废弃

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

功能

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

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

错误修复

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

错误修复

  • #5807: 修复了 Windows 上 pypy3.6(每夜版)的问题。

  • #5811: 正确处理 pytest.raises--fulltrace 的配合使用。

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

pytest 5.1.2 (2019-08-30)

错误修复

  • #2270: 修复了函数作用域夹具中定义的插件类的 self 引用问题:以前 self 是对*测试*类的引用,而不是*插件*类的引用。

  • #570: 修复了长期存在的问题,即在参数化期间使用间接夹具时,夹具作用域未被尊重。

  • #5782: 修复了打印来自 --pastebin 的错误响应时的解码错误。

  • #5786: 测试和收集报告中的链式异常现在已正确序列化,允许像 pytest-xdist 这样的插件正确显示它们。

  • #5792: Windows: 修复了在某些情况下从工作目录加载 conftest.py 时出现的问题,该工作目录的大小写与文件系统中存储的大小写不同(例如,c:\test 而不是 C:\test)。

pytest 5.1.1 (2019-08-20)

错误修复

  • #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.raisespytest.warnsParameterSet.param 现在使用原生的仅关键字语法。这可能会改变以前版本的异常消息,但它们仍然像以前一样在未知关键字参数时引发 TypeError

    • pytest.config 全局变量。

    • tmpdir_factory.ensuretemp 方法。

    • pytest_logwarning 钩子。

    • RemovedInPytest4Warning 警告类型。

    • request 现在是夹具的保留名称。

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

  • #5565: 移除了 unittest2 的未使用支持代码。

    自 Python 3.3+ 以来,unittest2 后向移植模块不再需要,pytest 中支持它的少量代码似乎也未使用:移除后,所有测试仍然不变地通过。

    尽管我们的政策是在移除任何功能或对第三方库的支持之前引入废弃期,但由于此代码显然根本未使用(即使 unittest2 被 pytest 执行的测试套件使用),因此决定在此版本中将其移除。

    如果您因此遇到回归问题,请提交一个 issue

  • #5615: pytest.failpytest.xfailpytest.skip 不再支持将字节作为消息参数。

    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) =====
    

错误修复

  • #4344: 修复了仅使用“__init__.py”收集包时出现的 RuntimeError/StopIteration 问题。

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

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

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

  • #5537: 在 Python 3.8+ 上,用标准库中的 importlib.metadata 替换 importlib_metadata 后向移植。

  • #5578: 改进了一些引发异常的函数(pytest.xfailpytest.skip 等)的类型检查,以便在用户旨在使用标记(例如 @pytest.xfail 而不是 @pytest.mark.xfail)时提供更好的错误消息。

  • #5606: 修复了当测试函数用无法与其他值进行真值比较的对象(例如 numpy 数组)打补丁时出现的内部错误。

  • #5634: pytest.exit 现在在 unittest 案例中得到正确处理。这使得 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 子类(PermissionErrorFileNotFoundError 等)替换手动处理 OSError.errno 的方式。

pytest 5.0.1 (2019-07-04)

错误修复

  • #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 认为这是明确的,因此允许这样做,但由于插件选项的延迟解析,这可能是不正确的。例如,请参阅 issues #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: funcargnames 属性自 pytest 2.3 以来一直是 fixturenames 的别名,现在在代码中也已废弃。

功能

  • #3457: 新增 pytest_assertion_pass 钩子,当断言*通过*时,会随上下文信息一起调用。

    此钩子仍处于**实验性**阶段,请谨慎使用。

  • #5440: faulthandler 标准库模块现在默认启用,以帮助用户诊断 C 模块中的崩溃。

    此功能通过将外部 pytest-faulthandler 插件集成到核心中提供,因此如果用户曾使用该插件,则应将其从依赖项中移除。

    更多信息请参阅文档:故障处理程序

  • #5452: 当警告被配置为错误时,pytest 警告现在显示为源自 pytest.,而不是内部的 _pytest.warning_types. 模块。

  • #5125: Session.exitcode 值现在编码在 pytest.ExitCode(一个 IntEnum)中。这使得退出代码可供消费者代码使用,并且比仅仅文档化更明确。用户定义的退出代码仍然有效,但应谨慎使用。

    团队预计此更改通常不会破坏测试套件或插件,但在一些深奥/特定的场景中除外。

    pytest-xdist 用户应升级到 1.29.0 或更高版本,因为此更改导致 pytest-xdist 需要兼容性修复。

错误修复

  • #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 中引入的错误,该错误导致在向 pytest.mark.parametrize 传递超过 2 个位置参数时出现收集错误。

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

改进的文档

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

  • #5416:修复 run/skip 示例中的 PytestUnknownMarkWarning。

pytest 4.6.11 (2020-06-04)

错误修复

  • #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 的一个严重交互问题,因此也可以将其视为一个错误修复。

琐碎/内部更改

  • #6404: 移除了对 parser 模块的使用,该模块在 Python 3.9 中已弃用。

pytest 4.6.9 (2020-01-04)

错误修复

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

pytest 4.6.8 (2019-12-19)

新特性

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

错误修复

  • #5430: junitxml: 如果测试在调用阶段失败,则失败测试的日志现在会传递到 junit 报告中。

琐碎/内部更改

  • #6345:将 colorama 仅固定到 0.4.1 版本,用于 Python 3.4,以便更新的 Python 版本仍能接收 colorama 更新。

pytest 4.6.7 (2019-12-05)

错误修复

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

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

pytest 4.6.6 (2019-10-11)

错误修复

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

  • #5537: 在 Python 3.8+ 上,用标准库中的 importlib.metadata 替换 importlib_metadata 后向移植。

  • #5806: 修复了从 --pastebin 上传到 bpaste.net 时,将“lexer”用作“text”的问题。

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

琐碎/内部更改

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

pytest 4.6.5 (2019-08-05)

错误修复

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

错误修复

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

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

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

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

pytest 4.6.3 (2019-06-11)

错误修复

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

  • #5389:修复 #5063 导致的 importlib_metadata.PathDistribution 回归,其 files 属性为 None

  • #5390:修复 TestCase 项目的 obj 属性不再绑定到方法的问题。

pytest 4.6.2 (2019-06-03)

错误修复

  • #5370:撤销 all() 的展开以修复嵌套推导式中的 NameError

  • #5371:撤销 all() 的展开以修复带 if 的生成器处理不正确的问题。

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

pytest 4.6.1 (2019-06-02)

错误修复

  • #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 选项的输出。

  • #5269pytest.importorskip 现在在默认的 reason 中包含 ImportError

  • #5311:为每个失败测试输出的捕获日志现在使用 ColoredLevelFormatter 进行格式化。

  • #5312:改进了 Python 3 中多行日志消息的格式。

错误修复

  • #2064:调试插件现在按需导入包装的 Pdb 类(--pdbcls)。

  • #4908pytest_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:扩展了关于使用 monkeypatchsetenvdelenv 的文档。

pytest 4.5.0 (2019-05-11)

新特性

  • #4826:当未知标记用作装饰器时,现在会发出警告。这通常是由于拼写错误引起的,可能导致测试在不声不响中损坏。

  • #4907:在 JUnitXML 消息字段中显示 XFail 原因。

  • #5013:崩溃报告中的消息现在在测试摘要中显示,并截断为终端宽度。

  • #5023:新增 --strict-markers 标志,当测试套件中使用未知标记(例如:未通过配置文件中的 markers 选项注册的标记)时,将触发错误。

    现有的 --strict 选项目前具有相同的行为,但将来可以增加额外的检查。

  • #5026:序列和字典的断言失败消息现在包含不同项目的数量。

  • #5034:改进了 --lf--ff(运行上次失败)的报告。

  • #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 会话范围 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 范围。

错误修复

  • #5113:使用 pytest_collect_modifyitems 作为 hookwrapper 的插件中取消选择的项目现在已正确报告。

  • #5144:出现使用错误时,exitstatus 现在在 pytest_sessionfinish 钩子中如预期般设置为 EXIT_USAGEERROR

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

改进的文档

  • #4935:扩展了关于注册标记以及 --strict 影响的文档。

琐碎/内部更改

  • #4942logging.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 的子元素,根据最新的schema,这是不允许的。

  • #5239:将 pluggy 固定到 < 1.0 版本,以避免在其发布时自动更新到 1.0:因为 1.0 版本计划有破坏性更改,我们希望确保 pytest 正确支持 pluggy 1.0

pytest 4.4.2 (2019-05-08)

错误修复

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

  • #5139:消除了核心对“terminal”插件的依赖。

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

改进的文档

  • #5171:文档:pytest_ignore_collectpytest_collect_directorypytest_collect_filepytest_pycollect_makemodule 钩子的 'path' 参数的文档类型现在是 py.path.local

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

琐碎/内部更改

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

pytest 4.4.1 (2019-04-15)

错误修复

  • #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 选项现在通过模块属性处理类(例如与 pdbpp 一起使用 pdb:pdb.Pdb),并且其验证得到了改进。

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

    此外,inifile 仅在存在配置文件时显示,而不是显示为空的 inifile: 字符串。

  • #4911:Doctest 现在可以使用 pytest.skip() 动态跳过。

  • #4920:已进行内部重构,以便实现 pytest-subtests 插件,该插件增加了 unittest 子测试支持和一个新的 subtests fixture,如 #1367 中讨论。

    有关内部重构的详细信息,请参阅相关 PR 的详细说明。

  • #4931:pytester 的 LineMatcher 断言传递的行是一个序列。

  • #4936:处理在 -p no:plug 之后的 -p plug

    这可以用于从命令行等覆盖被阻止的插件(例如在“addopts”中)。

  • #4951:当仅通过 fixtures (capsys, capfs) 并使用 pdb.set_trace() 进行捕获时,输出捕获得到正确处理。

  • #4956pytester 在测试运行期间将 $HOME$USERPROFILE 设置为临时目录。

    这确保不会从实际用户的主目录加载配置文件。

  • #4980:使用 monkeypatch.syspath_prependtestdir.syspathinsert(通过 pkg_resources.fixup_namespace_packages)更好地处理命名空间包。

  • #4993:分步插件现在报告状态信息。

  • #5008:如果 setup.cfg 文件包含 [tool:pytest] 以及不再支持的 [pytest] 小节,pytest 将使用 [tool:pytest] 并忽略 [pytest]。以前它会无条件报错。

    这使得插件更容易支持旧版本的 pytest。

错误修复

  • #1895:修复了一个错误,即通过 request.getfixturevalue() 动态请求的 fixture 可能会在请求 fixture 之前被拆除。

  • #4851:pytester 现在取消设置 PYTEST_ADDOPTS,以便在使用 testdir.runpytest() 时不使用外部选项。

  • #4903:在重写的 .pyc 文件中,对 2038 年之后的年份使用正确的修改时间。

  • #4928:修复 ScopeMismatch 错误中的行偏移。

  • #4957:对于默认(内部)插件,-p no:plugin 现在得到正确处理,例如与 -p no:capture 一起使用时。

    以前它们总是被加载(导入),使得例如 capfd fixture 可用。

  • #4968:在使用 pdbppdebug 命令之后使用 quit 命令时,pdb 能够正确处理。

  • #4975:修复 -qq 选项的解释问题,之前它被错误地视为 -v

  • #4978outcomes.Exit 不再在 assertrepr_compare 中被吞噬。

  • #4988:会话结束时,显式关闭日志文件处理程序。

  • #5003:修复标记收集错误中的行偏移(偏差为 1)。

改进的文档

  • #4974:更新 pytest_cmdline_parse 钩子的文档,以说明可用性限制。

琐碎/内部更改

  • #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 **实验性** 钩子。

    这些钩子将用于 pytest-xdistpytest-subtests 以及 resultlog 的替代方案,以序列化和自定义报告。

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

    欢迎插件作者和用户提供反馈。

  • #4987Collector.repr_failure 现在遵守 --tb 选项,但现在(使用 auto 时)仅默认为 short

pytest 4.3.1 (2019-03-11)

错误修复

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

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

  • #4898:修复了 testdir.copy_exampleAttributeError: FixtureRequest has no 'confg' attribute 错误。

琐碎/内部更改

  • #4768:避免在顶层导入 pkg_resources。

pytest 4.3.0 (2019-02-16)

弃用

  • #4724pytest.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() 方法,现在可以通过钩子设置 log_file 路径。

错误修复

  • #4651--help--version 现在通过 UsageError 处理。

  • #4782:修复包中收集损坏的符号链接时出现的 AssertionError 错误。

pytest 4.2.1 (2019-02-12)

错误修复

  • #2895pytest_report_collectionfinish 钩子现在也通过 --collect-only 调用。

  • #3899:当导入的包包含 pytest_plugins.py 子模块时,不再引发 UsageError

  • #4347:修复在使用 pdb++ 进行递归调试时输出捕获的问题。

  • #4592:修复通过父级 conftest.py 处理 collect_ignore 的问题。

  • #4700:修复回归问题:即使子类中应用了 unittest.skip() 装饰器导致所有测试被跳过,setUpClass 仍然会在子类中被调用。

  • #4739:修复当函数返回非字符串时 parametrize(... ids=<function>) 的问题。

  • #4745:修复/改进在传入 __init__.py 和测试文件时参数的收集。

  • #4770:当 Python 2.7 兼容性需要时,more_itertools 现在被限制为 <6.0.0。

  • #526:修复在链接到实际源代码的构建目录中运行时出现的“ValueError: Plugin already registered”异常。

改进的文档

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

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

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

琐碎/内部更改

  • #4741:TerminalReporter 插件中一些与详细程度相关的属性现在是只读属性。

pytest 4.2.0 (2019-01-30)

新特性

  • #3094经典 xunit 风格的函数和方法现在遵守 autouse fixture 的范围。

    这修复了许多令人惊讶的问题,例如 setup_method 在会话范围的 autouse fixture 之前被调用(参见 #517 获取示例)。

  • #4627:当在 Python 2.7 和 3.4 下运行时,测试会话结束时会显示一条消息,表明 pytest 5.0 将不再支持这些 Python 版本。

  • #4660:当使用 -k-m 标志时,现在也会显示 已选择 测试的数量。

  • #4688pytest_report_teststatus 钩子现在也可以接收 config 参数。

  • #4691pytest_terminal_summary 钩子现在也可以接收 config 参数。

错误修复

  • #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 分组警告。

    这使得输出更紧凑,并更好地传达了实际生成警告的代码量,而不是有多少测试调用该代码。

  • #4536monkeypatch.delattr 现在处理类描述符,例如 staticmethod/classmethod

  • #4649:恢复将标记视为关键字表达式的关键字。

  • #4653tmp_path fixture 及其他相关 fixture 现在提供解析后的路径(即真实路径)。

  • #4667pytest_terminal_summary 现在使用 pytest_report_teststatus 钩子的结果,而不是硬编码的字符串。

  • #4669:正确处理 Python 2 中包含非 ASCII 字符的 unittest.SkipTest 异常。

  • #4680:确保 tmpdirtmp_path fixture 指向同一个文件夹。

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

琐碎/内部更改

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

    np.asscalar 已在 numpy 1.16. 中被弃用

  • #4657: 从 pylib 复制 saferepr

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

pytest 4.1.1 (2019-01-12)

错误修复

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

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

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

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

改进的文档

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

琐碎/内部更改

  • #4602: 在 regen tox 环境中卸载 hypothesis

pytest 4.1.0 (2019-01-05)

移除

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

  • #3078: 移除旧的内部警告系统:config.warnNode.warnpytest_logwarning 现在在实现时会发出警告。

    请参阅我们关于如何更新代码的文档

  • #3079: 移除对 yield 测试的支持——它们从根本上是损坏的,因为它们在收集和测试执行分离后不能正确支持 fixture。

    请参阅我们关于如何更新代码的文档

  • #3082: 移除对直接在 @pytest.mark.parametrize 中对值应用标记的支持。请改用 pytest.param

    请参阅我们关于如何更新代码的文档

  • #3083: 移除了 Metafunc.addcall。这是 @pytest.mark.parametrize 的前身机制。

    请参阅我们关于如何更新代码的文档

  • #3085: 移除对将字符串传递给 pytest.main 的支持。现在,请始终传递一个字符串列表。

    请参阅我们关于如何更新代码的文档

  • #3086: 不再支持 **setup.cfg** 文件中的 [pytest] 部分,请改用 [tool:pytest]setup.cfg 文件旨在与 distutils 一起使用,而名为 pytest 的部分一直以来都是冲突和 bug 的来源。

    请注意,对于 **pytest.ini** 和 **tox.ini** 文件,该部分仍然是 [pytest]

  • #3616: 移除了 node.Class/Function/Module 的弃用兼容属性 - 现在请使用 pytest.Class/Function/Module

    请参阅我们关于如何更新代码的文档

  • #4421: 移除了 pytest_namespace 钩子的实现。

    请参阅我们关于如何更新代码的文档

  • #4489: 移除了 request.cached_setup。这是现代 fixture 的前身机制。

    请参阅我们关于如何更新代码的文档

  • #4535: 移除了弃用的 PyCollector.makeitem 方法。此方法很久以前因错误而公开。

  • #4543: 移除了对使用 pytest_funcarg__ 前缀定义 fixture 的支持。请改用 @pytest.fixture 装饰器。

    请参阅我们关于如何更新代码的文档

  • #4545: 现在直接调用 fixture 总是会引发错误,而不是警告。

    请参阅我们关于如何更新代码的文档

  • #4546: 移除了 Node.get_marker(name),其返回值除了进行存在性检查外无法用于更多用途。

    请使用 Node.get_closest_marker(name) 作为替代。

  • #4547: 弃用的 record_xml_property fixture 已被移除,请改用更通用的 record_property

    有关更多信息,请参阅我们的文档

  • #4548: 如果 pytest_plugins 变量定义在非顶级 conftest.py 文件中(即,不在 rootdir 中),现在会引发错误。

    有关更多信息,请参阅我们的文档

  • #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 with a string as the second argument

新功能

  • #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 关键字参数的支持。

    它像 Python 3.7 那样处理 header,并将任何其他关键字参数转发给 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 参数,当请求的模块无法导入时,将显示此原因。

错误修复

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

错误修复

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

错误修复

  • #3952: 再次在“short test summary info”之前显示警告,但仍将后面的警告显示在最后。

  • #4386: 处理 repr/str 中未初始化的 exceptioninfo。

  • #4393: 不要在现有缓存目录中创建 .gitignore/README.md 文件。

  • #4400: 重新安排 yield 测试错误的处理,以便 4.0.x 中的 opt-out 正常工作。

  • #4405: 修复 --pyargs 对测试路径的收集。

  • #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 环境使用不同的缓存。

错误修复

  • #3554: 修复 CallInfo.__repr__ 在调用尚未完成时的情况。

pytest 3.10.1 (2018-11-11)

错误修复

  • #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 中的 byte/unicode 助手替换为 Python 级别语法。

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 时,才会对逐个测试的输出进行着色。

  • #4225: 在非静默模式下使用终端时,提高收集报告的性能。

    “collecting …” 消息每 0.5 秒打印/更新一次。

错误修复

  • #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: 补充了关于传递给过滤警告的模块名称未进行正则表达式转义的缺失文档。

琐碎/内部更改

  • #4272: 如果非默认,即使在非详细模式下也显示缓存目录。

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

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

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

pytest 3.9.3 (2018-10-27)

错误修复

  • #4174: 修复使用符号链接的 conftest 插件导致的“ValueError: Plugin already registered”。

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

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

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

错误修复

  • #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: 恢复 symlinking 当前测试运行的 tmpdir 行为。

  • #4192: 修复 Python 2 下使用 recwarnwarnings.warn 报告的文件名。

pytest 3.9.1 (2018-10-16)

新功能

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

pytest 3.9.0 (2018-10-15 - 未发布,由于发布自动化 bug)

弃用

  • #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 比较部分

    • Collector 子类中使用名为 "Class" 的对象来自定义收集节点的类型已弃用。用户应改用 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 选项,以便在参数化收集到空集时引发异常。

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

错误修复

  • #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 的问题,其中 testsproject/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: 在 CONTRIBUTING.rst 指南中添加 tempir 测试示例

琐碎/内部更改

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

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

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

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

pytest 3.8.2 (2018-10-02)

弃用和移除

  • #4036: pytest_warning_captured 钩子的 item 参数现在已记录为弃用。我们在 3.8 版本发布后才意识到此参数与 pytest-xdist 不兼容。

    我们的策略是不在 bug 修复版本中弃用功能,但在这种情况下,我们认为它是有意义的,因为我们只是将其记录为弃用,而不会发出可能破坏测试套件的警告。这将传达一个信息:钩子实现者不应使用此参数。

    在未来的版本中,item 将始终为 None,并且当钩子实现使用它时会发出适当的警告。

错误修复

  • #3539: 修复断言重写模块上的重新加载问题。

  • #4034: TestReport 对象的 .user_properties 属性是 (名称, 值) 元组的列表,但有时可能被实例化为元组的元组。现在它始终是一个列表。

  • #4039: 当使用 --pyargs 时,不再发出关于在非顶级目录中使用 pytest_plugins 的警告:当前的 --pyargs 机制不可靠,可能产生假阴性结果。

  • #4040: 使用 -rP 选项时,排除通过测试的空报告。

  • #4051: 改进向 -m 选项传递无效 Python 表达式时的错误消息。

  • #4056: 当环境变量名称在 Python 2 中不是 str 时,MonkeyPatch.setenvMonkeyPatch.delenv 会发出警告。

    在 Python 2 中,向 os.environ 添加 unicode 键会导致 subprocess(以及可能其他模块)出现问题,这使其成为一个隐秘的 bug,尤其是在与 from __future__ import unicode_literals 一起使用时。

改进的文档

  • #3928: 为 fixture scope 添加可能的取值到文档中。

pytest 3.8.1 (2018-09-22)

错误修复

  • #3286: .pytest_cache 目录现在由 Git 自动忽略。希望为其他 SCM 贡献解决方案的用户请查阅/评论此问题。

  • #3749: 修复在包内收集测试时出现的以下错误

    TypeError: object of type 'Package' has no len()
    
  • #3941: 修复间接参数化会考虑测试函数使用的所有 fixture 的作用域来确定参数化作用域的 bug,而不仅仅是参数化 fixture 的作用域。

  • #3973: 修复断言重写器在测试更改当前工作目录而未还原时崩溃的问题。

  • #3998: 修复阻止某些 caplog 属性(例如 record_tuples)在启用 --pdb 进入调试器时可用的问题。

  • #3999: 修复 python2.x 中当类在断言中返回非 ASCII 二进制 __repr__ 且断言也包含非 ASCII 文本时出现的 UnicodeDecodeError

改进的文档

  • #3996: 新的弃用和移除页面显示了所有当前弃用的功能、弃用原因以及更新代码的替代方案。它还列出了以前主要版本中从 pytest 中移除的功能,以帮助使用旧版 pytest 的用户进行升级。

琐碎/内部更改

  • #3955: 改进 changelog 文件名的预提交检测

  • #3975: 移除围绕 im_func 的旧代码,因为它只支持 Python 2。

pytest 3.8.0 (2018-09-05)

弃用和移除

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

  • #3936: @pytest.mark.filterwarnings 的第二个参数不再进行正则表达式转义,从而使其能够实际使用正则表达式来检查警告消息。

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

新功能

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

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

  • #2908: 如果未配置其他警告过滤器,DeprecationWarningPendingDeprecationWarning 现在默认显示。这使得 pytest 更符合**PEP 506#recommended-filter-settings-for-test-runners**。更多信息请参阅文档

  • #3251: 警告现在在测试收集期间被捕获并显示。

  • #3784: 设置 PYTEST_DISABLE_PLUGIN_AUTOLOAD 环境变量会禁用插件自动加载。

  • #3829: 添加了 count 选项到 console_output_style,以启用将进度显示为计数而不是百分比。

  • #3837: 为 pytester.RunResult.assert_outcomes 签名添加了对“xfailed”和“xpassed”结果的支持。

错误修复

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

错误修复

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

错误修复

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

  • #3773: 修复当 __init__.py 文件中的测试与 python_files 配置选项匹配时的收集问题。

  • #3796: 修复连续子包的 fixture 的 teardown 只在外层包结束时执行一次的 bug。

  • #3816: 修复 --show-capture=no 选项仍会显示 fixture teardown 期间打印的日志的 bug。

  • #3819: 修复实时 CLI 日志记录激活时 stdout/stderr 未被捕获的问题。

  • #3843: 修复当在命令行中直接使用 test.py::test 语法并结合 --doctest-modules 指定测试函数时出现的收集错误。

  • #3848: 修复 Python 2 上无法将 Unicode 参数传递给 testdir.runpytest 的 bug。

  • #3854: 修复当文件名以大写字母开头时,包内测试重复收集的问题。

改进的文档

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

  • #3833: 补充了 pytester.Testdir 的缺失文档。

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

琐碎/内部更改

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

  • #3845: 从文档中删除对 issue #568 的引用,该问题已修复。

pytest 3.7.2 (2018-08-16)

错误修复

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

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

  • #3771: 修复如果 pytest_ignore_collect 钩子返回 False 而不是 None 时,收集期间的无限递归问题。

  • #3774: 修复装饰器 fixture 会失去功能(例如 @mock.patch)的 bug。

  • #3775: 修复导入带有 pytest_ 前缀的模块或其他对象时会引发 PluginValidationError 的 bug。

  • #3788: 修复在 __init__ 期间引发异常的 TestCase 子类在 teardown 期间的 AttributeError

  • #3804: 修复带有 __cause__ 循环的异常的回溯报告。

改进的文档

  • #3746: 添加了 metafunc.config 的文档,该文档之前被错误地隐藏了。

pytest 3.7.1 (2018-08-02)

错误修复

  • #3473: 如果 approx() 给出其不理解的类型(例如字符串、嵌套字典等)的预期值,则立即引发异常。

  • #3712: 在 approx() 上调用 repr() 时,正确表示 numpy 数组的维度。

  • #3742: 修复收集过程中与第三方插件不兼容的问题,该问题产生了 object has no attribute '_collectfile' 错误。

  • #3745: 如果 cache_dirrootdir 不相对,则显示绝对路径而不是失败。

  • #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: 修复了一个 bug,即通过直接参数(例如参数化)覆盖的 fixture 会被实例化,即使它们未被测试使用。

  • #3695: 修复 ApproxNumpy 初始化参数混淆问题,absrel 容差被颠倒,导致比较结果异常。新增测试以检查 np.arrayabsrel 容差,并测试 np.array() 预期 nan 的情况。

  • #980: 修复了详细模式下本地变量输出被截断的问题。

文档改进

  • #3295: 修正了 --last-failed-no-failures 的使用文档,在示例中添加了缺失的 --last-failed 参数,因为之前的示例具有误导性,会让人误以为不需要该缺失参数。

小改动/内部变更

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

  • 修复了 pytest.approx 处理零维 numpy 数组时的错误。 (#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)

  • 当先前作用域中的终结器引发异常时,继续调用栈中的其他终结器。 (#3569)

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

文档改进

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

小改动/内部变更

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

  • 改进 --fulltraceKeyboardInterrupt 相关提示的显示。 (#3545)

  • pytest 的测试套件不再能通过 python setup.py test 运行——请直接调用 pytesttox。 (#3552)

  • 修复文档中的拼写错误 (#3567)

pytest 3.6.1 (2018-06-05)

Bug 修复

  • 修复了当测试被标记为 xfail 时,junitxml 会两次记录标准输出和标准错误的 bug。 (#3491)

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

  • 修复了断言重写器与猴子补丁 file 对象的库之间的兼容性问题。 (#3503)

文档改进

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

小改动/内部变更

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

  • 将 pytest 切换到 src/ 布局,因为我们已经建议将其作为良好实践——现在我们也将其实现。 (#3513)

  • 修复测试中的条件,以支持 3.7.0b5,其中 AST 中的文档字符串处理被还原。 (#3530)

  • 移除部分 Python 2.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。这种有缺陷的行为会导致令人惊讶的问题,如果它在测试套件中起作用,那多半是偶然的。 (#2334)

  • 支持 Python 3.7 内置的 breakpoint() 方法,有关详细信息请参阅使用内置 breakpoint 函数一节。 (#3180)

  • monkeypatch 现在支持 context() 函数,该函数作为上下文管理器,可以撤销 with 块中完成的所有补丁操作。 (#3290)

  • --pdb 选项现在会在 KeyboardInterrupt 时进入调试器,而不是停止测试会话。在 Python 2.7 中,再次按下 CTRL+C 退出调试器。在 Python 3.2 及更高版本中,请使用 CTRL+D。 (#3299)

  • log-level 参数的数值大于根日志记录器级别时,pytest 不再更改根日志记录器的日志级别,这使其与用户代码中的自定义日志配置更好地配合。 (#3307)

Bug 修复

  • 一个可能导致 Windows 上 .pyc 文件损坏的罕见竞态条件有望得到解决。 (#3008)

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

  • 在显示失败断言的差异时,如果内容只包含空白字符,请先使用 repr() 进行转义,以便更容易发现差异。 (#3443)

文档改进

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

小改动/内部变更

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

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

  • 由于 pluggy 正在弃用 PluginManagerimplprefix 参数,现在使用内部插件管理器来检测 pytest_ 前缀的钩子。 (#3487)

  • python_api.py::approx 中,从 _pytest.compat 导入 MappingSequence,而不是直接从 collections 导入。将 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 才会打印带有前导 _ 的 fixture。 (#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 命令行选项,用于覆盖发现根目录的规则。有关详细信息,请参阅文档中的自定义部分。 (#1642)

  • Fixture 现在根据其作用域进行实例化,更高作用域的 fixture(如 session)会比更低作用域的 fixture(如 function)优先实例化。相同作用域的 fixture 的相对顺序保持不变,基于它们的声明顺序和依赖关系。 (#2405)

  • record_xml_property 已更名为 record_property,现在与 xdist、标记和任何报告器兼容。record_xml_property 这个名称现已弃用。 (#2770)

  • 新增 --nf--new-first 选项:首先运行新测试,然后运行其余测试,两种情况下测试也会按文件修改时间排序,最近修改的文件优先。 (#3034)

  • 新增 --last-failed-no-failures 命令行选项,允许指定缓存插件的 `--last-failed 功能在上次运行没有测试失败(或未找到缓存)时的行为:noneall(默认值)。 (#3139)

  • 新增 --doctest-continue-on-failure 命令行选项,使 doctest 能够显示每个片段的多个失败,而不是在第一个失败时停止。 (#3149)

  • 如果 junit_logging ini 选项设置为 system-out,捕获的日志消息会添加到生成的 junit xml 文件中的 <system-out> 标签。如果此 ini 选项的值为 system-err,日志将写入 <system-err>junit_logging 的默认值为 no,表示捕获的日志不会写入输出文件。 (#3156)

  • 当启用实时日志时,允许日志插件处理 pytest_runtest_logstartpytest_runtest_logfinish 钩子。 (#3189)

  • 在命令行中传递 --log-cli-level 现在会自动激活实时日志记录。 (#3190)

  • 添加命令行选项 --deselect,允许在收集时取消选择单个测试。 (#3198)

  • 在进入 pdb 之前打印捕获的日志。 (#3204)

  • 现在在运行测试之前显示取消选择的项计数,例如 collected X items / Y deselected。 (#3213)

  • 内置模块 platform 现在可以在 pytest.mark 的表达式中使用。 (#3236)

  • “短测试摘要信息”部分现在在终端中的回溯和警告之后显示。 (#3255)

  • 新增 --verbosity 标志以明确设置详细级别。 (#3296)

  • pytest.approx 现在支持将 numpy 数组与标量进行比较。 (#3312)

Bug 修复

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

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

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

文档改进

小改动/内部变更

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

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

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

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

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

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

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

  • 重构以统一内部详细程度的处理方式。 (#3296)

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

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

pytest 3.4.2 (2018-03-04)

Bug 修复

  • 当捕获选项为 no 时,移除了进度信息。 (#3203)

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

  • 修复了使用 approx 处理 Decimal 值时引发 TypeError 的问题。 (#3247)

  • 修复了使用 request fixture 时产生的引用循环问题。 (#3249)

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

文档改进

  • 将日志插件添加到插件列表。 (#3209)

小改动/内部变更

  • 修复 fixture.rst 中的小拼写错误 (#3259)

pytest 3.4.1 (2018-02-20)

Bug 修复

  • doctest.UnexpectedException 的导入移至顶层,以避免在使用 --pdb 时可能出现的错误。 (#1810)

  • 在进入 pdb 之前增加了捕获的标准输出/标准错误的打印,并改进了一个在输出捕获方面给出假阴性的测试。 (#3052)

  • 修复了使用参数化 fixture 的测试排序问题,该问题可能导致 fixture 被不必要地创建多次。 (#3161)

  • 修复了在“测试运行”钩子之外的钩子中发生日志记录会导致内部错误的问题。 (#3184)

  • 当安装并导入 pypi mock.patch 时,正确检测由 unittest.mock.patch 装饰器注入的参数。 (#3206)

  • 现在,当带有 match=pytest.raises() 失败时,显示的错误信息更清晰地说明了发生的情况:如果未引发异常,则删除了“匹配‘…’”部分,因为它错误地暗示已引发异常但未匹配到。如果引发了错误的异常,现在会直接抛出(就像不带 match=pytest.raises() 那样),而不是抱怨不匹配的文本。 (#3222)

  • 修复了 macOS 上 doctest 中的输出捕获处理问题。 (#985)

文档改进

  • pytest.raisesmatchmessage 参数添加 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)

  • 不兼容的变更:根据社区反馈,日志功能进行了一些更改。有关详细信息,请查阅日志文档。 (#3013)

  • 当禁用捕获(-s)时,控制台输出会回退到“经典”模式,否则输出会变得混乱,以至于毫无用处。 (#3038)

  • 新增 pytest_runtest_logfinish 钩子,它在测试项执行完成时被调用,类似于 pytest_runtest_logstart。 (#3101)

  • 在使用大量 fixture 收集测试时提高性能。 (#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)

  • 修复了在插件设置钩子之前测试中止时跳过插件报告钩子的问题。 (#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 一起使用的钩子(定义为 historic=True)。 (#2423)

  • 澄清警告捕获默认不改变警告过滤器。 (#2457)

  • 澄清了将 pytest_fixture_setup 与返回 None 的 fixture 函数一起使用时可能存在的混淆。 (#2698)

  • 修正了关于 pytest 中使用的 doctest 标志的句子措辞。 (#3076)

  • 文档中的链接更倾向于使用 https://*.readthedocs.io 而不是 http://*.rtfd.org。 (#3092)

  • 提高入门指南的可读性(措辞、语法) (#3131)

  • 增加了注意事项,指出由于导入缓存,不建议在同一个进程中多次调用 pytest.main。 (#3143)

小改动/内部变更

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

  • 更改参数化自动测试 ID 生成方式,使用函数的 __name__ 属性,而不是回退的参数名加计数器。 (#2976)

  • py.std 替换为标准库导入。 (#3067)

  • 修正了日志文档中“you”为“your”的错误。 (#3129)

pytest 3.3.2 (2017-12-25)

Bug 修复

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

  • 修复了 内存泄漏 问题,即 fixture 返回的对象从未被垃圾回收器销毁。 (#2981)

  • 修复了在 Python 2 上将 pyargs 转换为文件名时,不转换符号链接的问题。 (#2985)

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

文档改进

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

小改动/内部变更

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

  • 通过将 _ast 的导入和引用替换为 ast 来清理代码。 (#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“bug”链接 (#2949)

pytest 3.3.0 (2017-11-23)

弃用和移除

  • pytest 不再支持 Python 2.63.3。这些 Python 版本已终止生命周期一段时间,并给 pytest 核心团队带来了维护和兼容性成本,因此在与社区其他成员协商后,我们决定从该版本开始不再支持它们。仍然需要这些版本的用户应将 pytest 版本锁定为 <3.3。 (#2812)

  • 移除内部 _preloadplugins() 函数。此移除是 pytest_namespace() 钩子弃用的一部分。 (#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 钩子现在可以接收 request 参数。 (#2124)

  • 将 compat.py 中用于确定 fixture 可用参数的旧内省代码替换为 Python 3 上的 inspect.signature 和 Python 2 上的 funcsigs.signature。这应该尊重函数上的 __signature__ 声明。 (#2267)

  • 只报告一次带有全局 pytestmark 变量的测试。 (#2549)

  • 现在 pytest 在运行测试时显示总进度百分比。可以通过将 console_output_style 设置配置为 classic 来设置以前的输出样式。 (#2657)

  • 通过添加 match 关键字,使 warns 的签名与 raises 匹配。 (#2708)

  • pytest 现在可以捕获并显示来自标准 logging 模块的输出。用户可以通过在 pytest.ini 中、命令行中以及在单个测试中使用标记来控制要捕获的日志级别。此外,还提供了一个 caplog fixture,使用户能够在特定测试期间测试捕获的日志(例如类似于 capsys)。有关更多信息,请参阅日志文档。此功能通过合并流行的 pytest-catchlog 插件引入,感谢 @thisch。请注意,在合并过程中,已弃用了与已停止维护的 pytest-capturelog 的向后兼容接口。 (#2794)

  • pytest.skip() 添加 allow_module_level 关键字参数,使其能够跳过整个模块。 (#2808)

  • 允许在 PYTEST_ADDOPTS 中设置 file_or_dir-c-o。 (#2824)

  • 将标准输出/标准错误捕获结果作为 namedtuple 返回,这样可以通过属性访问 outerr。 (#2879)

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

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

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

Bug 修复

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

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

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

  • capsyscapfd 现在可以被其他 fixture 使用。 (#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 中没有描述的标记。 (#2942)

小改动/内部变更

  • 为了便于代码维护,pytest 现在依赖 attrs 用于内部结构。 (#2641)

  • 重构了内部 Python 2/3 兼容性代码,以使用 six。 (#2642)

  • 停止捆绑 pluggy —— 我们没有从中获得多少益处,却错过了它最新的更改 (#2719)

  • 内部重构:在较新的 Python 3 版本中,通过使用 backslashreplace 错误处理程序来简化 ASCII 字符串转义。 (#2734)

  • 移除 unittest 插件中不必要的标记评估器 (#2767)

  • 现在调用 Metafunc.addcall 会发出弃用警告。此函数计划在 pytest-4.0 中移除。 (#2876)

  • 将参数集提取内部移动到更易于维护的位置。 (#2877)

  • 内部重构以简化作用域节点查找。 (#2910)

  • 配置 pytest 以防止 pip 在不支持的 Python 版本中安装 pytest。 (#2922)

pytest 3.2.5 (2017-11-15)

Bug 修复

  • 移除 pytestpy<1.5 的限制,因为这可能导致某些安装中出现版本冲突。 (#2926)

pytest 3.2.4 (2017-11-13)

Bug 修复

  • 修复了当从不同根目录运行时,使用 --pyargs 会导致条目的 parent.nodeid 为空的问题。 (#2775)

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

  • 从 INI 配置中读取标记名称时,去除其前后的空白字符。 (#2856)

  • 如果文档字符串中失败示例的行号小于 9,则在 pytest 输出中显示 doctest 源代码的完整上下文。 (#2882)

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

文档改进

  • 引入关于 conftest.py 的专门章节。 (#1505)

  • xfail 的文档中明确提及 xpass。 (#1997)

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

  • 澄清 fixture 参数提案的语言 (#2893)

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

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

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

pytest 3.2.3 (2017-10-03)

Bug 修复

  • 修复了未提供前缀时 Tab 自动补全崩溃的问题。 (#2748)

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

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

文档改进

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

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

琐碎/内部更改

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

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

pytest 3.2.2 (2017-09-06)

Bug 修复

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

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

  • 修复了收集过程中的极端情况:访问时引发 pytest.fail 的属性会导致整个收集中止。 (#2707)

  • 修复 ReprFuncArgs 与混合 unicode 和 UTF-8 参数的问题。 (#2731)

文档改进

  • 在处理自定义标记的示例中,添加了演示 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 修复

  • 修复了收集单个测试项时终端的小故障。 (#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 中使用参数标记时,现在会引发弃用警告。请改用 pytest.param 来将标记应用于参数。 (#2427)

功能

  • 为 approx 添加了对 numpy 数组(和字典)的支持。 (#1994)

  • 现在测试函数对象具有一个 pytestmark 属性,其中包含直接应用于测试函数的标记列表,而不是从父类或模块继承的标记。 (#2516)

  • 收集默认忽略本地虚拟环境;--collect-in-virtualenv 选项会覆盖此行为。 (#2518)

  • 允许装饰为 @staticmethod 的类方法成为测试函数的收集候选。 (仅适用于 Python 2.7 及更高版本。Python 2.6 仍将忽略静态方法。) (#2528)

  • 引入 mark.with_args,以允许将函数/类作为唯一参数传递给标记。 (#2540)

  • 新的 cache_dir ini 选项:设置缓存插件内容存储的目录。目录可以是相对或绝对路径:如果是相对路径,则相对于 rootdir 创建目录,否则按原样使用。此外,路径可能包含在运行时展开的环境变量。 (#2543)

  • 引入 PYTEST_CURRENT_TEST 环境变量,该变量设置了当前正在执行测试的 nodeid 和阶段(setupcallteardown)。更多信息请参见文档。 (#2583)

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

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

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

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

  • pytest.failpytest.skippytest.xfail 引发的异常现在继承自 BaseException,使其更难被普通代码意外捕获。 (#580)

Bug 修复

  • pytester.py.Testdir.popen() 中将 stdin 设置为已关闭的 PIPE,以避免不必要的交互式 pdb (#2023)

  • 使用 capsys 捕获模式时,为 sys.std* 流添加缺失的 encoding 属性。 (#2375)

  • 修复了如果 coloramaconftest.py 文件中导入时,Windows 终端颜色变为黑色的问题。 (#2510)

  • 修复报告跳过测试摘要时的行号问题。 (#2548)

  • 捕获:确保 EncodedFile.name 是一个字符串。 (#2555)

  • 选项 --fixtures--fixtures-per-test 现在将保留文档字符串中的缩进。 (#2574)

  • doctest 行号现在正确报告,修复了 pytest-sugar#122。 (#2610)

  • 修复 fixture 收集顺序中的非确定性问题。为 Python 2.6 添加了新依赖 (ordereddict)。 (#920)

文档改进

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

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

琐碎/内部更改

  • 更新 --strict 的帮助消息,明确它只处理未注册的标记,而不处理警告。 (#2444)

  • 内部代码移动:将 pytest.approx/pytest.raises 的代码移动到自己的文件,以减少 python.py 的大小 (#2489)

  • 将实用函数 _pytest.compat._escape_strings 重命名为 _ascii_escaped,以便更好地传达函数目的。 (#2533)

  • 改进 CollectError 与 skip/skipif 的错误消息。 (#2546)

  • 仅对每个生成器发出一次关于 yield 测试已弃用的警告。 (#2562)

  • 确保最后收集的行不包含先前写入的残留。 (#2571)

  • 修复了所有 flake8 错误和警告。 (#2581)

  • 添加了 fix-lint tox 环境以在代码上运行自动 pep8 修复。 (#2582)

  • 在 pytest 自己的测试套件中将警告转换为错误,以便更及时地捕获由于弃用导致的回归。 (#2588)

  • 在 CHANGELOG 条目中显示多个问题链接。 (#2620)

pytest 3.1.3 (2017-07-03)

Bug 修复

  • 修复 Python 2 中文档字符串中 doctests 的解码错误。 (#2434)

  • 现在,在清理器中由终结器引发的异常会被抑制,直到所有终结器都被调用,然后重新引发初始异常。 (#2440)

  • 修复在命令行指定测试时“collected items”报告不正确的问题。 (#2464)

  • deprecated_call 在上下文管理器形式下现在可以捕获弃用警告,即使相同的警告已经引发。此外,deprecated_call 将始终生成相同的错误消息(以前在上下文管理器与函数调用模式下会生成不同的消息)。 (#2469)

  • 修复了 pytest 收集的路径可能具有三重前导 / 字符的问题。 (#2475)

  • 修复尝试检测递归回溯开始时发生的内部错误。 (#2486)

文档改进

  • 明确指出哪些钩子在第一个非 None 结果后停止调用。 (#2493)

琐碎/内部更改

  • 创建 invoke 任务以更新捆绑包。 (#2474)

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

pytest 3.1.2 (2017-06-08)

Bug 修复

  • 通过 pytest_addoption 添加的必选选项将不再阻止在不传递它们的情况下使用 --help。(#1999)

  • 在断言重写中尊重 python_files。(#2121)

  • 修复当回溯中的帧包含无法比较的对象(如 numpy 数组)时,递归错误检测的问题。(#2459)

  • 仅当消息包含非 ASCII unicode 时,内部 pytest 警告插件才发出 UnicodeWarning (仅限 Python 2)。(#2463)

  • 添加了针对 Python 3.6 WindowsConsoleIO 因 Pytest 的 FDCapture 而中断的解决方法。其他使用控制台句柄的代码可能仍受相同问题影响,可能需要进一步的解决方法/修复,例如 colorama。(#2467)

文档改进

  • 修复到 pluggy 对象的内部 API 链接。(#2331)

  • 明确指出 pytest.xfail 在调用点停止测试执行,并改进了 skipping 文档的整体流程。(#810)

pytest 3.1.1 (2017-05-30)

Bug 修复

  • pytest 警告捕获不再覆盖现有警告过滤器。以前的行为会覆盖所有过滤器,并在配置警告过滤器以满足其需求的测试套件中导致回归。请注意,此副作用是默认不再显示 DeprecationWarningPendingDeprecationWarning。(#2430)

  • 修复 doctest 文本文件中非 ASCII 内容的问题。(#2434)

  • 修复 Python 2 中 unicode 警告的编码错误。(#2436)

  • pytest.deprecated_call 现在在上下文管理器形式下捕获 PendingDeprecationWarning。(#2441)

文档改进

  • 引入 towncrier 进行更新日志管理。(#2390)

3.1.0 (2017-05-22)

新功能

  • pytest-warnings 插件已集成到核心中,现在 pytest 会在测试会话结束时自动捕获并显示警告。

    警告

    此功能可能会干扰自行应用和处理警告的测试套件,可以在您的 pytest.ini 中禁用。

    [pytest]
    addopts = -p no:warnings
    

    更多信息请参见警告文档页面

    感谢 @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。

更改

  • 移除所有内部使用 pytest_namespace 钩子的地方,这是为了准备在 pytest 4.0 中移除 preloadconfig。感谢 @RonnyPfannschmidt 的 PR。

  • 当可调用 ID 在参数化测试中引发时,pytest 现在会发出警告。感谢 @fogo 的 PR。

  • 现在可以通过将 __test__ 属性设置为 False 来跳过测试类的收集 (#2007)。感谢 @syre 的报告和 @lwm 的 PR。

  • 更改 junitxml.py 以生成符合 Junitxml 架构的报告。如果相同的测试在调用中失败,然后又在拆卸中出错,我们将测试用例元素拆分为两个,一个包含错误,另一个包含失败。 (#2228) 感谢 @kkoukiou 的 PR。

  • 带有 url 属性的测试用例报告现在将正确写入 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。

  • 钩子现在在收集完成后进行验证,而不是在加载已安装插件后立即验证。这使得编写插件钩子变得容易,这些钩子将在收集期间加载,例如使用 pytest_plugins 特殊变量 (#1821)。感谢 @nicoddemus 的 PR。

  • 修改 pytest_make_parametrize_id() 钩子以接受 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 修复

  • 修复在 python 3 中使用 capsys fixture 时 sys.stdout.buffer / sys.stderr.buffer 上的 AttributeError 问题。 (#1407)。感谢 @asottile

  • 将 capture.py 的 DontReadFromInput 类更改为在 fileno 方法中抛出 io.UnsupportedOperation 错误而不是 ValueError (#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。

  • 修复回归,pytest 现在在运行 --pdb 时能正确跳过 unittest (#2137)。感谢 @gst 的报告和 @mbyt 的 PR。

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

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

  • 根据 PEP 479,将代码中 raise StopIteration 的用法替换为简单的 returns 来结束生成器 (#2160)。感谢 @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)

  • -o/--override-ini 未正确传递 option=value 时,添加警告 (#2105)。同时改进了帮助文档。感谢 @mbukatov 的报告和 @lwm 的 PR。

  • 现在 --confcutdir--junit-xml 分别作为目录和文件名正确验证 (#2089#2078)。感谢 @lwm 的 PR。

  • 向错误消息添加提示,暗示可能缺少 __init__.py (#478)。感谢 @DuncanBetts

  • 更准确地描述 fixture 终结在文档中何时发生 (#687)。感谢 @DuncanBetts

  • recwarn.rst 提供 :ref: 目标,以便我们可以使用 intersphinx 引用。感谢 @dupuy 的报告和 @lwm 的 PR。

  • 在 Python 2 中,在 pytest.approx 的字符串表示中使用简单的 +- ASCII 字符串(例如 "4 +- 4.0e-06"),因为它在 pytest 内部的不同上下文和表示中处理起来很脆弱,可能导致诸如 #2111 之类的错误。在 Python 3 中,表示仍使用 ±(例如 4 ± 4.0e-06)。感谢 @kerrick-lyft 的报告和 @nicoddemus 的 PR。

  • 现在使用 item.Function, item.Module 等会发出弃用警告,请改用 pytest.Function, pytest.Module 等 (#2034)。感谢 @nmundar 的 PR。

  • 修复使用 approx 和复数时的错误消息 (#2082)。感谢 @adler-j 的报告和 @nicoddemus 的 PR。

  • 修复了断言重写钩子因 pytest_plugins 机制多次导入模块而产生的误报警告。感谢 @nicoddemus 的 PR。

  • 移除了一个内部缓存,该缓存可能导致子目录中 conftest.py 文件的钩子在其他目录中被错误调用 (#2016)。感谢 @d-b-w 的报告和 @nicoddemus 的 PR。

  • 移除了旨在支持早期 Python 3 版本的内部代码,该代码会产生在 sys.modules 中留下 None 的副作用,当 pytest 评估表达式时(例如将条件作为字符串传递给 pytest.mark.skipif)(#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 显式标记或隐式作为插件标记的模块产生的误报警告 (#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() 调用的错误作用域值。

  • 此版本包含 pluggy-0.4.0,它正确处理插件中的 VersionConflict 错误 (#704)。感谢 @nicoddemus 的 PR。

3.0.2 (2016-09-01)

  • 改进了向 pytest.mark.parametrize 传递非字符串 id 时的错误消息 (#1857)。感谢 @okken 的报告和 @nicoddemus 的 PR。

  • 向 stdin 存根类 pytest.capture.DontReadFromInput 添加 buffer 属性。感谢 @joguSD 的 PR。

  • 修复当字符串与 unicode 比较失败时发生的 UnicodeEncodeError。 (#1864) 感谢 @AiOO 的 PR。

  • 如果 pytest_plugins 被定义为字符串(而不是字符串序列),当模块被考虑用于断言重写时,现在会正确处理。由于这个 bug,如果测试套件使用 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)

不兼容的更改

此版本中进行了许多不兼容的更改,旨在移除长期弃用的功能或更改现有行为以使其不那么令人惊讶/更有用。

  • 重解释模式现已移除。仅提供 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。

  • 新增 pytest.fixture 装饰器的 name 参数,允许为 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) 钩子,插件可以使用它为自定义类型提供友好的字符串。感谢 @palaviv 完成此 PR。

  • capsyscapfd 现在有一个 disabled() 上下文管理器方法,可用于在测试中暂时禁用捕获。感谢 @nicoddemus 完成此 PR。

  • 新增 CLI 标志 --fixtures-per-test:显示每个选定测试项正在使用的 fixture。默认显示 fixture 的 doc string。如果与 -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。

  • 新增钩子

    • pytest_fixture_setup(fixturedef, request):执行 fixture setup;

    • pytest_fixture_post_finalizer(fixturedef):在 fixture 的 finalizer 之后调用,并可以访问 fixture 的结果缓存。

    感谢 @d6e@sallner

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

  • 显式传递的参数化 ID 不再被转义为 ascii(#1351)。感谢 @ceridwen 完成此 PR。

  • 现在,当测试函数中声明了未知 fixture 时,错误消息中会按字母顺序排序 fixture。感谢 @nicoddemus 完成此 PR。

  • pytest_terminal_summary 钩子现在接收测试会话的 exitstatus 作为参数。感谢 @blueyed 完成此 PR (#1809)。

  • 参数化 ID 可以接受 None 作为特定测试 ID,在这种情况下将使用该参数的自动生成 ID。感谢 @palaviv 完成此 PR (#1468)。

  • xunit 风格的 setup/teardown 方法(setup_methodsetup_module 等)的参数现在是可选的,可以省略。感谢 @okken 提出此问题,以及 @nicoddemus 完成此 PR。

  • 在参数化中存在重复 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 向后兼容性支持浮点/复数类型(#457)。

  • 细化了确定 rootdir 的逻辑,只考虑有效路径,从而修复了许多问题:#1594#1435#1471。根据当前行为更新了文档。感谢 @blueyed@davehunt@matthiasha 完成此 PR。

  • 始终包含完整的断言解释。以前的行为会隐藏恰好为 False 的子表达式,认为这是冗余信息。感谢 @bagerard 报告此问题 (#1503)。感谢 @davehunt@tomviner 完成 PR。

  • 在未使用参数化变量的情况下,消息更佳(参见 #1539)。感谢 @tramwaj29 完成此 PR。

  • 更新了 docstring,使其风格更统一。

  • 在启动期间为 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 文件中的 bug 变得更容易(#1516)。感谢 @txomon 完成此 PR。

  • 不包含任何 doctest 的文本文档不再显示为“跳过”。感谢 @graingert 报告并提供了完整的 PR (#1580)。

  • 修复了带有自定义 __new__ 方法的类的收集。修复了 #1579。感谢 @Stranger6667 完成此 PR。

  • 修复了 metafunc.parametrize 中作用域覆盖的问题(#634)。感谢 @Stranger6667 完成此 PR。

  • 修复了 junit xml 输出中的总测试计数(#1798)。感谢 @cboelsen 完成此 PR。

  • 修复了 request.node.warn 行的 off-by-one 错误。感谢 @blueyed 完成此 PR。

2.9.2 (2016-05-31)

Bug 修复

  • 修复 #510:跳过其中一个参数化维度为空的测试。感谢 Alex Stapleton 的报告和 @RonnyPfannschmidt 完成此 PR。

  • 修复 Xfail 在使用条件关键字参数时不工作的问题。感谢 @astraw38 报告此问题(#1496),以及 @tomviner 完成 PR(#1524)。

  • 修复 win32 路径问题,当在 pytest.main("-c your_absolute_path") 中放置带有绝对路径的自定义配置文件时。

  • 修复检测最大递归深度时,抛出的错误类不识别 unicode/编码字节的问题。感谢 @prusse-martin 完成此 PR (#1506)。

  • 修复 pytest.mark.skip 标记在严格模式下使用时的问题。感谢 @pquentin 完成此 PR,以及 @RonnyPfannschmidt 展示如何修复此 bug。

  • 文档的一些小改进和修复。感谢 @omarkohl 完成此 PR。

  • 修复 --fixtures 以显示所有 fixture 定义,而不是每个 fixture 名称只显示一个。感谢 @hackebrot 完成此 PR。

2.9.1 (2016-03-17)

Bug 修复

  • 改进插件加载失败时的错误消息。感谢 @nicoddemus 完成此 PR。

  • 修复(#1178):pytest.fail 包含非 ascii 字符时引发内部 pytest 错误。感谢 @nicoddemus 完成此 PR。

  • 修复(#469):junit 在 params ID 包含 :: 时错误解析 report.nodeid。感谢 @tomviner 完成此 PR (#1431)。

  • 修复(#578):包含非 ascii 行的 SyntaxError 在故障点生成内部 py.test 错误。感谢 @asottile 报告,以及 @nicoddemus 完成此 PR。

  • 修复(#1437):当向参数化传递字节字符串正则表达式模式时,尝试将其解码为 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 异常。修复了动态生成代码(fixture 和测试)的 pytest 内部错误,其中源行是故意伪造的。

更改

  • 重要py.code 已合并到 pytest 仓库中,成为 pytest._code。做出此决定是因为 py.codepytest 之外很少使用,而且它位于不同的仓库中,导致难以及时修复其代码中的 bug。团队希望通过此举能够更好地重构和改进该代码。此更改不应影响用户,但如果遇到任何奇怪的行为,让用户知晓会很有用。

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

    请注意,原始的 py.code 仍然可在 pylib 中使用。

  • pytest_enter_pdb 现在可选地接收 pytest 配置对象。感谢 @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 失败消息中。

  • 收集仅在终端中显示进度(“收集 X 项”)。这避免了在使用 --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。

  • 修复 回溯样式文档 以描述所有可用选项(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 等插件组合失败。

  • 解决 pyreadline 中使用 --pdb 并启用标准 I/O 捕获时发生的异常。感谢 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:修复了在收集过程中注入的类属性可能破坏 pytest 的问题。PR 由 Alexei Kozlenok 完成,感谢 Ronny Pfannschmidt 和 Bruno Oliveira 的审查和帮助。

  • 修复 #1074:预计算 junitxml 块,而不是将整个树存储在对象中。感谢 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() 现在在 deprecated 函数已被同一模块中的另一个测试调用时也能工作。感谢 Mikhail Chernykh 报告,以及 Bruno Oliveira 完成此 PR。

  • 修复 #1198:--pastebin 选项现在在 Python 3 上工作。感谢 Mehdy Khoshnoody 完成此 PR。

  • 修复 #1219:当捕获的输出包含非 ascii 字符时,--pastebin 现在可以正常工作。感谢 Bruno Oliveira 完成此 PR。

  • 修复 #1204:使用讨厌的 __getattr__() 进行收集时出现另一个错误。感谢 Florian Bruhin 完成此 PR。

  • 修复没有运行测试时打印的摘要。感谢 Florian Bruhin 完成此 PR。

  • 修复 #1185 - 确保 MANIFEST.in 与 sdist 中应该包含的内容完全匹配

  • 一些关于良好实践的文档现代化。感谢 Bruno Oliveira 完成此 PR。

2.8.3 (2015-11-18)

  • 修复 #1169:为 TestCaseFunction 中的 testcase 添加 __name__ 属性,以支持函数和方法上的 @unittest.skip 装饰器。感谢 Lee Kamentsky 完成此 PR。

  • 修复 #1035:如果测试模块级别对象有 __getattr__(),则收集测试。感谢 Suor 报告,以及 Bruno Oliveira / Tom Viner 完成此 PR。

  • 修复 #331:如果测试失败无法正确报告,例如它们是类的可调用实例,则不收集测试。

  • 修复 #1133:修复了过滤回溯时,如果其中一个条目属于不再可用的文件,则内部错误的问题。感谢 Bruno Oliveira 完成此 PR。

  • 增强功能,以红色突出显示失败测试的名称,使其在输出中更醒目。感谢 Gabriel Reis 完成此 PR。

  • 添加更多讲座到文档中

  • 扩展 --ignore cli 选项的文档

  • 使用 pytest-runner 进行 setuptools 集成

  • 与 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 fixture 和 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:更优雅地处理插件加载期间的版本冲突。感谢 Bruno Oliveira 完成此 PR。

  • 修复问题 #1064:与“pytest-xdist”插件一起使用“--junitxml”时的回归,导致测试报告被分配给错误的测试。感谢 Daniel Grunwald 报告,以及 Bruno Oliveira 完成此 PR。

  • (实验性)适应更多 SEMVER 风格的版本控制,并更改 git 仓库中 master 分支的含义:“master”分支现在保留 bug 修复,旨在用于微版本发布。“features”分支将仅随次要或主要 pytest 版本发布。

  • 通过删除 distutils 的文档引用来修复问题 #766。感谢 Russel Winder。

  • 修复问题 #1030:现在字节字符串被转义以生成项目节点 ID,使其始终可序列化。感谢 Andy Freeland 报告,以及 Bruno Oliveira 完成此 PR。

  • Python 2:如果 unicode 参数化值可转换为 ascii,则其 ascii 表示用于节点 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。

  • 通过引入版本特定的检查帮助器来避免 python3.5 弃用警告,感谢 Michael Droettboom。

  • 修复 issue562:@nose.tools.istest 现在完全被尊重。

  • 修复 issue934:当字符串比较失败且 diff 太大无法显示而未传递 -vv 时,仍然显示几行 diff。感谢 Florian Bruhin 报告,以及 Bruno Oliveira 完成此 PR。

  • 修复 issue736:修复了当 fixture 参数与参数化标记结合使用时会被丢弃的 bug。感谢 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:不要应用已应用的标记。感谢 ojake 完成此 PR。

  • 更好地处理捕获失败,以减少异常丢失到 /dev/null。感谢 David Szotten 完成此 PR。

  • 修复 issue730:弃用并警告 --genscript 选项。感谢 Ronny Pfannschmidt 报告,以及 Christian Pommranz 完成此 PR。

  • 修复 issue751:如果使用两个或更多测试方法对类进行参数化,则多个参数化与 ID 的 bug。感谢 Sergey Chipiga 报告,以及 Jan Bednarik 完成 PR。

  • 修复 issue82:默认情况下避免从 setup.cfg/pytest.ini/tox.ini 文件及以上加载 conftest 文件(--confcutdir 仍可设置以覆盖此设置)。感谢 Bruno Oliveira 完成此 PR。

  • 修复 issue768:在 python 模块中找到的 docstring 未设置 session fixture。感谢 Jason R. Coombs 报告,以及 Bruno Oliveira 完成此 PR。

  • 添加了 tmpdir_factory,这是一个 session-scoped fixture,可用于在基本临时目录中创建目录。以前此对象作为 config 对象的 _tmpdirhandler 属性安装,但现在它已成为官方 API 的一部分,并且使用 config._tmpdirhandler 已弃用。感谢 Bruno Oliveira 完成此 PR。

  • 修复 issue808:pytest 的内部断言重写钩子现在实现了可选的 PEP 302 get_data API,以便测试可以访问它们旁边的数据文件。感谢 xmo-odoo 的请求和示例,以及 Bruno Oliveira 完成此 PR。

  • rootdir 和 inifile 现在在使用错误时显示,以帮助用户诊断诸如意外的 ini 文件添加未知选项被 pytest 拾取等问题。感谢 Pavel Savchenko 在 #821 中提出此问题,以及 Bruno Oliveira 完成此 PR。

  • 摘要栏现在在警告情况下显示为黄色,例如:所有测试都被跳过或 xpass/xfailed,或者根本没有运行测试(这是 issue500 的部分修复)。

  • 修复 issue812:在根本没有运行测试的情况下,pytest 现在以状态码 5 退出,例如命令行中给定的目录不包含任何测试,或者由于命令行选项过滤掉所有测试(例如 -k)。感谢 Eric Siegerman (issue812) 和 Bruno Oliveira 完成此 PR。

  • 摘要栏现在在警告情况下显示为黄色,例如:所有测试都被跳过或 xpass/xfailed,或者根本没有运行测试(与 issue500 相关)。感谢 Eric Siegerman。

  • 新增 testpaths ini 选项:在执行 pytest 时搜索测试的目录列表。这可用于加快测试收集速度,当项目有明确的测试目录时,通常比为所有不包含测试的目录配置 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。

  • 内部重构插件管理器 API 和代码,以便在 pytest-agnostic 的简单插件管理器和 PytestPluginManager 之间有明确的区别,后者添加了大量行为,其中包括处理本地 conftest 文件。在文档化方法方面,这是一个向后兼容的更改,但它仍然可能破坏依赖于细节(特别是 pluginmanager.add_shutdown() API)的第三方插件。感谢 Holger Krekel。

  • 插件管理:引入 pytest.hookimplpytest.hookspec 装饰器,用于设置 impl/spec 特定参数。这取代了以前现在弃用的 pytest.mark 的使用,该标记旨在仅包含测试函数的标记。

  • 编写/完善“编写插件”的文档,现在它们有自己的页面,并与“使用/安装插件”页面分开。

  • 修复 issue732:正确取消注册任何钩子调用站点的插件,允许在测试执行期间拥有临时插件。

  • 弃用并警告钩子实现中的 __multicall__ 参数。请改用 pytest-2.7 中已引入的 hookwrapper 机制。请注意,pytest-2.8 计划停止支持旧的 __multicall__,并且只支持 hookwrapper 协议。

  • 大幅加快插件钩子的调用速度。

  • 在内置 pytest 插件中使用 hookwrapper 机制。

  • 添加 doctest 标志的 doctest ini 选项,感谢 Holger Peters。

  • 在文档中添加注释,如果您想标记参数并且参数是可调用的,则还需要传递一个原因以将其与“装饰器”情况区分开。感谢 Tom Viner。

  • “python_classes”和“python_functions”选项现在支持 glob 模式进行测试发现,如 issue600 中所讨论。感谢 Ldiary Translations。

  • 允许用非参数化的 fixture 覆盖参数化的 fixture,反之亦然(bubenkoff)。

  • 修复 issue463:对“parameterize”拼写错误抛出特定错误(pfctdayelise)。

  • 允许用非参数化的 fixture 覆盖参数化的 fixture,反之亦然(bubenkoff)。

  • 失败时,sys.last_valuesys.last_typesys.last_traceback 被设置,以便用户可以通过事后调试检查错误(almarklein)。

  • 2.6.4 (2014-10-24)

  • 通过使用 ndiff 和 pprint 改进可迭代对象的断言失败报告。

从源代码树中删除了过时的日语文档。

  • “pytest_addhooks”钩子文档。感谢 Bruno Oliveira。

  • 更新了插件索引文档。感谢 Bruno Oliveira。

  • 修复 issue557:使用“-k”时,我们只允许字符串开头的旧式“-”表示否定,即使那也是弃用的。请改用“not”。这应该允许选择参数化测试,其中参数中出现了“-”。

  • 修复 issue604:转义断言消息中的 % 字符。

  • 修复 issue620:在 --genscript 目标中添加关于二进制 blob 含义的解释。感谢 Dinu Gherman。

  • 修复 issue614:修复了 pastebin 支持。

  • 2.6.3 (2014-09-24)

  • 修复 issue575:xunit-xml 报告收集错误为失败而不是错误,感谢 Oleg Sinyavskiy。

  • 修复 issue582:修复 setuptools 示例,感谢 Laszlo Papp 和 Ronny Pfannschmidt。

  • 修复了 pickling capture.EncodedFile 时无限递归的 bug,感谢 Uwe Schmitt。

修复 issue589:修复与 numpy 等在显示异常时发生的不良交互。检查精确的“超出最大递归深度”异常,而不是假设任何 RuntimeError 都是该异常(在 py dep 中实现)。感谢 Charles Cloud 分析此问题。

  • 修复 conftest 相关 fixture 可见性问题:当在测试包之外的 CWD 运行 pytest 时,fixture 发现会出错。感谢 Wolfgang Schnerring 找出了可重现的示例。

  • 引入 pytest_enter_pdb 钩子(例如 pytest_timeout 需要它来在交互式进入 pdb 时取消超时)。感谢 Wolfgang Schnerring。

  • 修复 issue713:doctest 失败的 JUnit XML 报告。感谢 Punyashloka Biswal。

  • 检查 xfail/skip 也适用于非 Python 函数测试项。感谢 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 doc 示例。

  • 不要标记为通用 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:为捕获流添加“errors”属性,以满足某些 distutils 和可能访问 sys.stdout.errors 的其他代码。

  • 解决 issue170:允许 pytest.mark.xfail(...) 通过可选的“raises=EXC”参数指定预期异常,其中 EXC 可以是单个异常或异常类元组。感谢 David Mohr 完成此 PR。

  • 修复 pytest 与 unittest.mock.patch 装饰器在测试中使用“new”参数时的集成问题。感谢 Nicolas Delaby 提供测试和 PR。

  • 修复检测 conftest 文件的问题,如果参数包含“::”节点 ID 规范(从“-v”输出复制)。

  • 修复 issue544,只在“::”分隔部分末尾且部分具有“.py”扩展名时删除“@NUM”

  • 增加了关于 Bitbucket 和 GitHub 上新的 pytest-dev 团队的文档。请参阅 https://pytest.cn/en/stable/contributing.html 。感谢 Anatoly 的推动和初步工作。

  • 修复 issue650:新增选项 --doctest-ignore-import-errors ,它会将 doctest 中的导入错误转换为跳过。感谢 Charles Cloud 提供了完整的 PR。

  • 修复 issue655:解决了导致 Python 2/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。

  • 修复捕获.EncodedFile 序列化时的无限递归错误,感谢 Uwe Schmitt。

  • 修复 issue589:修复显示异常时与 numpy 及其他库的不良交互。检查精确的“最大递归深度超出”异常,而不是假设任何 RuntimeError 都是该异常(在 py 依赖项中实现)。感谢 Charles Cloud 分析了该问题。

  • 修复 conftest 相关的 fixture 可见性问题:当在测试包之外的当前工作目录 (CWD) 运行 pytest 时,fixture 发现会出现错误。感谢 Wolfgang Schnerring 找到了一个可重现的示例。

  • 引入 pytest_enter_pdb hook(例如 pytest_timeout 需要此 hook,以便在交互式进入 pdb 时取消超时)。感谢 Wolfgang Schnerring。

  • 对于非 Python 函数测试项,也检查 xfail/skip。感谢 Floris Bruynooghe。

2.6.2 (2014-09-05)

  • 添加了函数 pytest.freeze_includes(),它使得使用 cx_freeze 等工具将 pytest 嵌入到可执行文件中变得容易。请参阅文档以获取示例和原理。感谢 Bruno Oliveira。

  • 改进了断言重写缓存失效的精度。

  • 修复 issue561:调整了 autouse fixture 示例以适应 Python 3。

  • 修复 issue453:断言重写问题,当 __repr__ 包含“n{”、“n}”和“n~”时。

  • 修复 issue560:如果“else:”或“finally:”后跟同一行上的语句,则正确显示代码。

  • 修复 monkeypatch 文档中的示例,感谢 t-8ch。

  • 修复 issue572:更正了 tmpdir 文档示例以适应 Python 3。

  • 不标记为通用 wheel,因为 Python 2.6 由于额外的 argparse 依赖项而与其他构建不同。修复了 issue566。感谢 sontek。

  • 实现 issue549:用户提供的断言消息不再替换 py.test 内省消息,而是作为补充显示。

2.6.1 (2014-08-07)

  • 在 –verbose 输出中不再显示行号,输出现在纯粹是节点 ID。行号仍显示在失败报告中。感谢 Floris Bruynooghe。

  • 修复 issue437,其中断言重写可能导致 pytest-xdist 工作节点收集不同的测试。感谢 Bruno Oliveira。

  • 修复 issue555:向捕获流添加“errors”属性,以满足某些 distutils 和可能访问 sys.stdout.errors 的其他代码。

  • 修复 issue547:当输出捕获(“-s”)被禁用时,capsys/capfd 也能工作。

  • 解决 issue170:允许 pytest.mark.xfail(…) 通过可选的“raises=EXC”参数指定预期异常,其中 EXC 可以是单个异常或异常类元组。感谢 David Mohr 提供了完整的 PR。

  • 修复 pytest 与 unittest.mock.patch 装饰器在使用“new”参数时的集成。感谢 Nicolas Delaby 提供了测试和 PR。

  • 修复了当参数包含“::”节点 ID 规范时(从“-v”输出复制粘贴)检测 conftest 文件的问题

  • 修复 issue544:只在“::”分隔部分末尾且部分具有“.py”扩展名时才删除“@NUM”

  • 不要使用 py.std 导入助手,而是直接导入。感谢 Bruno Oliveira。

2.6

  • 根据作用域缓存 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。

  • 将 XPASS 颜色更改为黄色而不是红色,当测试以 -v 运行时。

  • 修复 issue473:解决 mock 在双重打补丁时将未绑定方法放入类字典的问题。

  • 修复 issue498:如果 fixture finalizer 失败,确保 fixture 仍然失效。

  • 修复 issue453:pytest_assertrepr_compare 钩子的结果现在会转义其换行符,以便 format_exception 不会崩溃。

  • 内部新警告系统:当 pytest 在您的测试收集或执行中检测到异常时,它现在会生成警告。警告最终发送到一个新的 pytest_logwarning 钩子,目前只有终端插件实现了该钩子,它在摘要行中显示警告,并在指定 -rw(报告警告)时显示更多详细信息。

  • 将带有 __init__ 的测试类和看起来像测试但不是函数的测试模块中的可调用对象跳过转换为警告。

  • 修复 issue436:通过使用 parse_known_args 的结果而不是以前不稳定的启发式方法,改进了从命令行参数中查找初始 conftest 文件。感谢 Marc Abramowitz 在此领域的测试和初步修复方法。

  • 修复 issue #479:在测试模块的收集/加载过程中,正确处理 nose/unittest(2) SkipTest 异常。感谢 Marc Schlaich 完成此 PR。

  • 修复 issue490:在文档中包含 pytest_load_initial_conftests 并改进 docstring。

  • 修复 issue472:澄清 pytest.config.getvalue() 在命令行解析之前触发时无法工作。

  • 合并 PR123:改进了 pytest 与 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 目录中运行测试(使用 tox -e doctesting 进行此操作)

  • 修复 issue486:更好地报告和处理早期 conftest 加载失败。

  • 内部 conftest 处理的一些清理和简化。

  • 更努力地打破捕获异常时的引用循环。感谢 Jurko Gospodnetic。

  • 修复 issue443:修复跳过示例以使用正确的比较。感谢 Alex Groenholm。

  • 支持模块、类和函数上的 nose 风格 __test__ 属性,包括 unittest 风格的类。如果设置为 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 属性的异常现在在 Python 2 和 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 docstring 以指向 argparse 而不是 optparse。感谢 Daniel D. Wright。

2.5.0 (2013-12-12)

  • 从 pytest 自身的自动化发布测试中移除了 Python 2.5,这意味着它可能很快就会失效(但我们相信此版本仍然可用)。

  • 简化并修复了在涉及参数化 fixture 或函数参数时调用终结器(finalizer)的实现。终结现在在设置时惰性执行,而不是在“拆卸阶段”。虽然这听起来有些奇怪,但它有助于确保我们即使在复杂的代码中也能正确处理设置/拆卸。用户级别的代码不应受到影响,除非它正在实现 pytest_runtest_teardown hook 并期望某些 fixture 实例在此期间被拆卸(这种情况非常罕见,而且无论如何都不可靠)。

  • PR90:添加 –color=yes|no|auto 选项以强制终端着色模式(“auto”是默认值)。感谢 Marc Abramowitz。

  • 修复 issue319 - 正确显示断言错误中的 Unicode 字符。非常感谢 Floris Bruynooghe 提供了完整的 PR。这也意味着我们现在依赖于 py>=1.4.19。

  • 修复 issue396 - 正确排序和终结类范围的参数化测试,独立于类中的方法数量。

  • 以更好的方式重新修复 issue323 —— 参数化现在绝不会导致运行时递归错误,因为用于按范围/按 fixture 重新排序测试的基础算法不再是递归的(之前是尾递归,这可能导致超过 966 个非函数范围参数的问题)。

  • 修复 issue290 - 现在初步支持用重复的相同值进行参数化(有时用于测试第二次调用是否像第一次一样有效)。

  • 关闭 issue240 - 精确文档 pytest 模块导入的工作方式,讨论两种常见的测试目录布局,以及它如何与 PEP 420 命名空间包交互。

  • 修复 issue246:修复终结器顺序,使其对于依赖于函数范围之上参数化 fixture 的独立 fixture 遵循 LIFO 顺序。(付出了相当大的努力,所以请理解这句话的复杂性 :) 感谢 Ralph Schmitt 提供了精确的失败示例。

  • 修复 issue244:通过为参数实现特殊索引,仅对参数化测试 ID 使用索引

  • 修复 issue287:运行所有终结器,但保存第一个失败终结器的异常并重新抛出,以便拆卸仍会失败。我们重新抛出第一个失败异常,因为它可能是其他终结器失败的原因。

  • 修复在使用 mock.patch 或其他标准装饰器包装器进行测试方法时的排序问题。这解决了 issue346,并应有助于解决随机的“xdist”收集失败。感谢 Ronny Pfannschmidt 和 Donald Stufft 帮助隔离问题。

  • 修复 issue357 - 特殊处理“-k”表达式,允许使用简单的字符串进行过滤,这些字符串不是有效的 Python 表达式。示例:“-k 1.3”匹配所有参数化为 1.3 的测试。“-k None”过滤所有名称中包含“None”的测试,反之亦然,“-k ‘not None’”也一样。以前这些示例会引发语法错误。

  • 修复 issue384:移除了试验支持代码,因为 unittest 兼容性增强功能允许试验自行处理。

  • 导入插件时,如果产生 ImportError,不要隐藏它。修复了 issue375。

  • 修复 issue275 - 允许使用 usefixtures 和 autouse fixtures 运行 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 调用转换为无操作(它已经中和了 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 会得到一个已经装饰过的函数。我们现在至少会检测这个参数是否是 lambda,这样示例就能工作了。感谢 Alex Gaynor 提出这个问题。

  • 对检查错误编码/ASCII 的 pypy 测试进行 xfail(pypy 不会报错)。修复了 issue385。

  • 内部使 varnames() 处理类的 __init__,尽管 pytest 本身目前不需要它。还修复了缓存。修复了 issue376。

  • 修复 issue221 - 正确处理没有 __init__.py 的命名空间包导入。

  • 重构内部 FixtureRequest 处理以避免 monkeypatching。积极的用户可见效果之一是“request”对象现在可以在闭包中使用。

  • 修复了 pytest.importskip(modname, minverstring) 中的版本比较

  • 修复 issue377:在 nose-compat 文档中澄清 pytest 不会将 unittest-API 复制到“plain”命名空间中。

  • 修复 @mock 修饰的测试函数的详细报告

2.4.2 (2013-10-04)

  • 在 Windows 上,需要 colorama 和较新版本的 py 库,以便 py.io.TerminalWriter() 现在使用 colorama 而不是其自身的 ctypes 技巧。(修复 issue365) 感谢 Paul Moore 提出此问题。

  • 修复“-k”匹配测试的问题,其中“repr”、“attr”和其他名称由于内部实现怪癖(别问)而导致错误的匹配,现在已正确实现。修复了 issue345。

  • 避免 tmpdir fixture 创建过长的文件名,尤其是在使用参数化时 (issue354)

  • 修复 pytest-pep8 和 pytest-flakes / pytest 交互(标记插件中的收集名称假设项始终具有函数,而这些插件则不适用等等)。感谢 Andi Zeidler。

  • 引入 node.get_marker/node.add_marker API,供 pytest-pep8 和 pytest-flakes 等插件使用,以避免 node.keywords 伪字典的繁琐细节。调整了文档。

  • 删除启动时尝试“复制”stdout 的做法,因为它很糟糕。正常的捕获应该能捕捉到测试搞乱标准文件描述符的足够多的可能性。

  • 为插件兼容性添加 pluginmanager.do_configure(config) 作为 config.do_configure() 的链接

2.4.1 (2013-10-02)

  • 使用 parser.addoption() 时,传递给“type”关键字的 Unicode 参数也应转换为相应的类型。感谢 Floris Bruynooghe, @dnozay。(修复了 issue360 和 issue362)

  • 修复使用 argcomplete 时点分文件名补全的回归问题,感谢 Anthon van der Neuth。(修复了 issue361)

  • 修复使用 1 元组 (“arg”,) 指定参数化时的回归(参数化的值嵌套在元组中传递)。感谢 Donald Stufft。

  • 合并文档拼写错误修复,感谢 Andy Dirnberger

2.4

已知不兼容性

  • 如果从 Python 2.7 或更高版本调用 –genscript,则只能获得一个可在 Python 2.7 或更高版本上运行的独立脚本。使用 Python 2.6 也可以获得 Python 2.5 兼容版本。

  • 如果相应的 setup 方法失败,则所有 xunit 风格的拆卸方法(nose 风格、pytest 风格、unittest 风格)将不会被调用,请参见下面的 issue322。

  • pytest_plugin_unregister hook 从未被正确调用,并且没有已知的 hook 实现——因此它被移除了。

  • pytest.fixture 装饰的函数不能再是生成器(即使用 yield)。如果这导致了意想不到的实际问题,此更改可能会在 2.4.1 中撤销。但是,您始终可以编写并返回一个内部函数/生成器,并更改 fixture 消费者以迭代返回的生成器。此更改是根据新的 pytest.yield_fixture 装饰器进行的,请参见下文。

新功能

  • 实验性地引入了一个新的 pytest.yield_fixture 装饰器,它接受与 pytest.fixture 完全相同的参数,但强制 fixture 函数使用 yield 语句而不是 return statement。这允许与 fixture 函数中的“with 风格”上下文管理器直接集成,并且通常避免注册终结回调,而是将“yield 之后”的代码视为拆卸代码。感谢 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:引入新的实验性 hook,供 IDE/终端截获调试:pytest_exception_interact(node, call, report)

  • 新的 monkeypatch.setattr() 变体,用于提供更短的调用来修补模块中的类/函数

    monkeypatch.setattr("requests.get", myfunc)

    将“requests”模块的“get”函数替换为 myfunc

  • 修复 issue322:如果 setUpClass 失败,则不运行 tearDownClass。感谢 Mathieu Agopian 的初步修复。此外,使所有 pytest/nose 终结器模仿相同的通用行为:如果 setupX 存在并失败,则不运行 teardownX。这在内部引入了一个新方法“node.addfinalizer()”辅助函数,该函数只能在节点的设置阶段调用。

  • 简化 pytest.mark.parametrize() 签名:允许传入逗号分隔的字符串来指定参数名。例如: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/跳过单独的参数集。感谢 Brianna Laugher。

  • 调用新的实验性 pytest_load_initial_conftests hook,允许第三方插件在 conftest 加载之前做一些事情。

Bug 修复

  • 修复 issue358 - 现在使用新的 parser.parse_known_args 方法更正确地解析捕获选项。

  • pytest 现在使用 argparse 而不是 optparse(感谢 Anthon),这意味着如果安装到 Python 2.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 终结器(以前终结器不总是被调用)

  • 修复 issue320 - 修复 fixture 与模块级别函数混合使用时的类范围。感谢 Anatoly Bubenkoff。

  • 您可以指定“-q”或“-qq”以获得不同程度的“更安静”报告(感谢 Katarzyna Jachim)

  • 修复 issue300 - 修复在子目录中启动 py.test 时 conftest 加载顺序。

  • 修复 issue323 - 许多模块范围参数化的排序

  • 使 sessionfinish hook 在与会话启动时相同的 CWD 上下文中执行(有助于修复以相对路径写入输出文件的插件行为,例如 pytest-cov)

  • 修复 issue316 - 正确引用文档中的收集 hook

  • 修复 issue 306 - 清理 -k/-m 选项,使其分别仅匹配标记/测试名称/关键字。感谢 Wouter van Ackooy。

  • 改进了 Python 模块中 doctest 的计数——不再显示没有任何 doctest 项的文件,并且 doctest 示例被计为单独的测试项。感谢 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)

  • 问题 265 - 将 nose 的 setup/teardown 与 setupstate 集成,使其在未 setup 时不尝试 teardown

  • 问题 271 - 不在工作节点上写入 junitxml

  • 问题 274 - 当 doctest 不知道示例位置时,不要尝试显示完整的 doctest 示例

  • 问题 280 - 在有缺陷的 CPython 2.6.0 上禁用断言重写

  • 注入“getfixture()”辅助函数以从 doctest 中检索 fixture,感谢 Andreas Zeidler

  • 问题 259 - 在断言重写时,与 Python 2 上的默认源编码 ASCII 保持一致

  • 问题 251 - 报告跳过,而不是忽略带有 init 的类

  • issue250:参数化名称和值中的 unicode/str 混合现在可以正常工作

  • issue257:以注释行结尾的源代码的断言触发编译不会在 python2.5 中崩溃(通过 py>=1.4.13.dev6 修复)

  • 修复 –genscript 选项以生成也适用于 python3.3 的独立脚本(导入器排序)

  • issue171 - 在断言重写中,显示一些全局变量的 repr

  • 修复“-k”的选项帮助

  • 将分发包的长描述移至 README.rst

  • 改进 metafunc.parametrize() 的 docstring

  • 修复在测试函数中使用 capsys 和 pytest.set_trace() 时,查看 capsys.readouterr() 会中断的 bug

  • 允许在自定义 `python_functions` 测试发现时,指定以“_”开头的前缀。(感谢 Graham Horler)

  • 通过将额外数据放在新行并增加缩进,改进 PYTEST_DEBUG 跟踪输出

  • 确保 skip/fail 等 OutcomeExceptions 已初始化异常属性

  • 问题 260 - 不在普通的 unittest 案例中使用 nose 特殊设置

  • 修复 issue134 - 打印阻止运行指定测试项的收集错误

  • 修复 issue266 - 接受 MarkEvaluator 表达式中的 Unicode 字符

2.3.4 (2012-11-20)

  • yielded 测试函数现在将激活 autouse-fixture,但不能接受 fixture 作为 funcarg——无论如何,建议使用 2.0 之后的参数化功能而不是 yield,参见: https://pytest.cn/en/stable/example/how-to/parametrize.html

  • 修复 autouse 问题:如果 autouse-fixture 定义在 a/conftest.py 文件中,而测试在 a/tests/test_some.py 中,则不会被发现

  • 修复 issue226 - fixture teardown 的 LIFO 顺序

  • 修复 issue224 - 参数大于 256 个字符的调用现在可以正常工作

  • 修复 issue91 - 在示例中添加/讨论包/目录级别的设置

  • 允许通过 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 的请求对象,如果请求未激活,在 getattr 访问时会崩溃。感谢 Thomas Waldmann。

  • 修复 issue213 - 允许使用不支持 __eq__ 运算符的值(如 numpy 数组)进行参数化

  • 修复 issue215 - 将 test_python.org 拆分为多个文件

  • 修复 issue148 - @unittest.skip 对类的跳过现在被识别,并避免调用 setUpClass/tearDownClass,感谢 Pavel Repin

  • 修复 issue209 - 通过依赖于较新的 pylib 重新引入 Python 2.4 支持,该 pylib 重新引入了用于 AST 解释器之前的语句查找功能

  • nose 支持:如果它是可调用对象,才调用 setup,感谢 Andrew Taumoefolau

  • 修复 issue219 - 添加 py2.4-3.3 分类器到 TROVE 列表

  • 在回溯中,*,** 参数值现在显示在正常参数旁边(感谢 Manuel Jacob)

  • 修复 issue217 - 支持 mock.patch 与 pytest 的 fixture - 请注意,您需要 mock-1.0.1 或 Python 3.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 分发包中,以便正确分发 ignore-dirs 和其他配置位,供运行 pytest 自身测试的维护者使用

2.3.1 (2012-10-20)

  • 修复 issue202 - 修复回归:从 fixture 函数中使用“self”现在可以按预期工作(它是使用 fixture 的测试方法所看到的同一个“self”实例)

  • 在 freebsd* 系统上跳过使用 pexpect 的测试(主要是 test_pdb.py),因为 pexpect 不支持它(挂起)

  • 链接到 –markers 输出中的网页,该网页提供了 pytest.mark.* 用法的帮助。

2.3.0 (2012-10-19)

  • 修复 issue202 - 更好地自动命名参数化测试函数

  • 修复 issue139 - 引入 @pytest.fixture,它允许直接指定 funcarg 工厂的范围和参数化。

  • 修复 issue198 - 在某些情况下,Windows 32 位系统上,嵌套目录结构会导致 conftest fixture 找不到,原因是路径操作问题

  • 修复 issue193:跳过使用空参数集参数化的测试函数

  • 修复 Python 3.3 兼容性,主要是之前依赖于字典排序的报告部分

  • 引入按资源和参数化设置重新排序测试的功能,该功能优先于通常的文件排序

  • 修复 issue185:猴子补丁 time.time 不会导致 pytest 失败

  • 修复 issue172:pytest.fixture 装饰的 setup_module 函数重复调用

  • 修复 junitxml=path 构造,以便如果测试更改了当前工作目录并且路径是相对路径,则它会从原始当前工作目录正确构造。

  • 修复“python setup.py test”示例,使其返回正确的“errno”

  • 修复 issue165 - 修复损坏的文档链接并提及 Stack Overflow 的 FAQ

  • 捕获 Unicode 问题时,将失败表示写入终端,以防止整个会话崩溃

  • 修复 xfail/skip 混淆:跳过标记或命令式 pytest.skip 现在将优先于 xfail 标记,因为在跳过的情况下我们无法确定 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 标记测试的失败设置应报告为 xfail(而不是 xpass)

  • 修复 issue128:在使用 capsys/capfd 时显示捕获的输出

  • 修复 issue179:正确显示工厂的依赖链

  • pluginmanager.register(…) 如果插件已注册或名称已被占用,现在将引发 ValueError

  • 修复 issue159:改进 https://pytest.cn/en/6.0.1/faq.html ,特别是关于“魔法”历史的部分,也提到了 pytest-django、trial 和 unittest 集成。

  • 使 request.keywords 和 node.keywords 可写。所有派生的收集节点都将看到关键字值。关键字是包含标记和其他信息的字典。

  • 修复 issue 178:XML 二进制转义符现在包装在 py.xml.raw 中

  • 修复 issue 176:即使我们在 Python 级别用子类替换了 AssertionError,也能正确捕获内置的 AssertionError

  • 工厂发现不再因提供不健全的 __code__ 对象(例如 mock.call)的魔法全局可调用对象而失败

  • 修复 issue 182:testdir.inprocess_run 现在会考虑传入的插件

  • 修复 issue 188:确保 Python 2 上 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:允许参数化多次应用,例如从模块、类和函数级别。

  • 修复 issue107:实际执行会话范围的终结

  • 在参数化中不检查间接参数是否是 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 的内部错误现在产生更好的输出 - 通过标准化 pytest_internalerror 输入参数来修复。

  • 修复 issue97 / 回溯问题 (在 pytest 和 py 中):改进与 jinja2 和 cython 结合时的回溯输出,这些工具会修改回溯。

  • 修复 issue93 (在 pytest 和 pytest-xdist 中):避免“延迟拆卸”:测试节点中的最后一个测试现在将直接运行其拆卸,而不是等待会话结束。感谢 Dave Hunt 的良好报告和反馈。pytest_runtest_protocol 和 pytest_runtest_teardown hook 现在都有“nextitem”可用,当其为 None 时表示测试运行结束。

  • 修复由于未知源收集项导致的收集崩溃,感谢 Ralf Schmitt(通过依赖较新版本的 pylib 修复)

2.2.0 (2011-11-18)

  • 修复 issue90:引入测试项的提前拆卸,以便更早地调用拆卸函数。

  • 添加一个功能强大的 metafunc.parametrize 函数,允许分多步参数化测试函数参数,因此可以从独立的插件和位置进行参数化。

  • 添加一个 @pytest.mark.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 现在可以在 Python 3 下工作

  • 修复 issue89:–pdb 在 doctest 中出现意外异常时更合理地工作

  • 修复并清理 pytest 自身的测试套件,使其不泄露文件描述符

  • 修复 issue83:链接到生成的 funcarg 列表

  • 修复 issue74:pyarg 模块名称现在根据 imp.find_module 假阳性进行检查

  • 修复与 twisted/trial-11.1.0 用例的兼容性

  • 简化 Node.listchain

  • 通过依赖 py.xml 简化 junitxml 输出代码

  • 添加对 unittest 类和函数的跳过属性支持

2.1.3 (2011-10-18)

  • 修复 issue79:断言重写在某些布尔运算比较上失败

  • 正确处理零长度参数(例如 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 / 涉及包含“%”的字符串的插入的断言重写

  • 修复带 ** 参数的调用上的断言重写

  • 如果禁用字节码生成,则不缓存重写模块

  • 修复只读目录中的断言重写

  • 修复 issue59:为 junitxml 输出提供 system-out/err 标签

  • 修复 issue61:3个或更多操作数的布尔运算的断言重写

  • 您现在可以使用“cd doc ; make man”构建手册页

2.1.0 (2011-07-09)

  • 修复 issue53:以正确的顺序调用 nose 风格的 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 调用时(尤其是早期配置/会话启动 hook)回溯更美观

  • 修复 junitxml 文件中缺少的跳过原因/元信息,通过 http://lists.idyll.org/pipermail/testing-in-python/2011-March/003928.html 报告

  • 修复 issue34:避免收集失败,当“test”前缀类派生自 object 时。

  • 如果未实际使用 –genscript,则 genscript 插件不需要 zlib(和其他库)。

  • 加速跳过(通过内部不进行完整的回溯表示)

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

  • 修复 issue28 - setup_method 和 pytest_generate_tests 协同工作:setup_method fixture 方法现在也为从 pytest_generate_tests hook 生成的测试函数调用。

  • 修复 issue27 - collectonly 和关键字选择 (-k) 现在可以一起工作。此外,如果您执行“py.test –collectonly -q”,现在会得到一个扁平的测试 ID 列表,您可以将其粘贴到 py.test 命令行以执行特定测试。

  • 修复 issue25:避免报告 –pdb 和 Python 3.2/编码输出相关的问题

  • 修复 issue23 - tmpdir 参数现在可以在 Python 3.2 和 Windows XP 上工作。从 Python 3.2 开始,可能支持 os.symlink。通过要求较新版本的 py 库,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 上的导入-* 报告问题),通过要求 py>1.4.0(1.4.1 将包含它)

  • 修复 issue10(numpy 数组真值检查),通过优化 py 库中的断言解释

  • 修复 issue15:使 nose 兼容性测试与 Python 3 兼容(现在 nose-1.0 支持 Python 3)

  • 删除了有些令人惊讶的“same-conftest”检测功能,因为它会忽略出现在多个子目录中的 conftest.py。

  • 改进断言(“not in”),感谢 Floris Bruynooghe

  • 改进在“python -OO”上运行时(断言和文档字符串被关闭,可能导致假阳性)的行为/警告

  • 引入 pytest_cmdline_processargs(args) hook,允许命令行参数的动态计算。这修复了一个回归,因为 pytest 在 2.0 之前允许从 conftest.py 文件设置命令行选项,而 pytest-2.0 至今只允许从 ini 文件设置。

  • 修复 issue7:doctest 模块中的断言失败。doctest 中意外的失败通常会更美观地显示,即在 doctest 失败的上下文中。

  • 修复 issue9:xfail 标记测试的 setup/teardown 函数如果失败则报告为 xfail,但如果成功则报告为正常通过(非 xpassing)。这仅适用于“直接”的 setup/teardown 调用,因为 teardown_class/teardown_module 无法与单个测试紧密相关。

  • 修复 issue14:进程退出时没有日志错误

  • 对非 TTY 上的“收集”输出进行优化

  • 优化内部插件注册和 –traceconfig 输出

  • 引入一种机制,从命令行阻止/取消注册插件,请参见 https://pytest.cn/en/stable/how-to/plugins.html#cmdunregister

  • 默认激活 resultlog 插件

  • 修复了由于收集前运行语义导致的 yielded 测试的回归问题,这些测试不像 pytest 1.3.4 那样进行了设置。但是,请注意,推荐的更清晰的测试参数化方法仍然是“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) 用于早期加载一些自定义插件。

  • 更努力地以更兼容的方式运行 unittest 测试套件,通过将 setup/teardown 语义推迟到 unittest 包。也更努力地运行 twisted/trial 和 Django 测试,现在这些测试应该基本上默认就可以工作。

  • 引入了一种通过 ini 风格文件设置配置选项的新方法,默认情况下会搜索 setup.cfg 和 tox.ini 文件。旧方法(某些环境变量,动态 conftest.py 读取)已被移除。

  • 添加了一个新的“-q”选项,它降低了详细程度并打印了更像 nose/unittest 风格的“点”输出。

  • 修复 issue135 - marks 现在也适用于 unittest 测试用例

  • 修复 issue126 - 引入 py.test.set_trace(),即使在捕获进行中,也能通过 PDB 跟踪测试执行。

  • 修复 issue123 - py.test 的新“python -m py.test”调用方式(需要 Python 2.5 或更高版本)

  • 修复 issue124 - 使报告对文件描述符 1 (stdout) 上打开文件的测试更具弹性。

  • 修复 issue109 - 不再加载同级 conftest.py 文件。(并且目录收集器不能再从目录的 conftest.py 中自定义 - 这需要在至少上一级完成)。

  • 引入(可定制的)断言失败表示,并增强了比较和其他情况的断言失败输出(Floris Bruynooghe)

  • nose-plugin:在 setup/teardown 函数中传递类型签名失败,而不是不调用它们(Ed Singleton)

  • 删除 py.test.collect.Directory(源于收集过程的重大重构和简化)

  • 大幅减少 py.test 核心代码,将函数/python 测试转移到自己的插件

  • 修复 issue88(从命令行参数查找自定义测试节点)

  • 优化“tmpdir”创建,现在将创建与测试名称更相关的基本名称(感谢 Ronny)

  • “xpass”(意外通过)测试不会导致退出代码!=0

  • 修复 issue131 / issue60 - 导入用作命名空间包的 __init__ 文件中的 doctest

  • 修复 bug:在类/模块级别应用“pytestmark”现在也适用于 unittest 收集的函数

  • 新增了对 cached_setup 辅助函数的“class”级别的支持

  • 修复怪异之处:mark.* 对象现在是不可变的,创建新实例

  • 1.3.4 (2010-09-14)

修复 issue111:改进 Windows 的安装文档

  • 修复 issue119:修复 __init__.py 作为模块的自定义可收集性

  • 修复 issue116:–doctestmodules 也能与 __init__.py 文件一起工作

  • 修复 issue115:统一内部异常传递/捕获/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 作为上下文管理器,参见示例

  • (感谢 Ronny Pfannschmidt)

    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
    

    Funcarg 工厂现在可以动态地将标记应用于测试调用。例如,如果工厂为测试提供预期失败的参数,这会很有用

  • 改进了收集和导入错误的错误报告。这利用了一种更通用的机制,即对于自定义测试项/收集节点,node.repr_failure(excinfo) 现在被统一调用,因此您可以覆盖它以返回您选择的字符串错误表示,该表示将作为(红色)字符串报告。

    def pytest_funcarg__arg(request):
        request.applymarker(py.test.mark.xfail(reason="flaky config"))
        ...
    
    def test_function(arg):
        ...
    
  • 引入“–junitprefix=STR”选项,用于在 junitxml 文件中所有报告前添加前缀。

  • 使测试和 pytest_recwarn 插件特别是完全兼容 Python 2.7(如果您使用 recwarn funcarg,则警告将启用,以便您可以以跨 Python 的方式正确检查它们的存在)。

Bug 修复

  • 优化 –pdb:忽略 xfail 测试,统一其 TB 报告,并且不再在末尾再次显示失败。

  • 修复使用 ** 运算符的断言解释问题(感谢 Benjamin Peterson)

  • 修复 issue105:在失败断言的同一行进行赋值(感谢 Benjamin Peterson)

  • 修复 issue104:junitxml 插件中测试名称的正确转义(感谢匿名用户)

  • 修复 issue57 -f|–looponfail 以使用 xpassing 测试(感谢 Ronny)

  • 修复 issue92:collectonly reporter 和 –pastebin(感谢 Benjamin Peterson)

  • 修复 py.code.compile(source) 以生成唯一文件名

  • 通过将代码编译推迟到(可覆盖的)Frame.eval 类,修复 PyPy 上的断言重新解释问题。(感谢 Amaury Forgeot)

  • 修复 py.path.local.pyimport() 以与目录一起工作

  • 简化 py.path.local.mkdtemp 的实现和使用

  • 显示 junitxml 文件名时不打印空行

  • 向 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 插件中执行分布式测试相关报告,而不是在通用 py.test 分发包中包含分布式相关代码

  • 修复 Windows 上的 homedir 检测

  • 发布 distribute_setup.py 版本 0.6.13

  • 添加了新 capturelog 和 coverage 插件的链接

1.3.1 (2010-05-25)

修复 issue103:引入 py.test.raises 作为上下文管理器,参见示例

  • 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() 返回退出状态而不是引发 SystemExit,并允许它被多次调用。这当然要求您的应用程序和测试被正确拆卸且不具有全局状态。

Bug 修复

  • 改进的回溯显示:- 改进并统一了“–tb=short”选项的报告 - 测试模块导入期间的错误大大缩短(使用 –tb=short 样式) - raises 显示更短更相关的回溯 - –fulltrace 现在更系统地使跟踪更长/抑制截断

  • 通过操作 Python 的 linecache.cache 而不是之前创建自定义代码对象的 hacky 方式,改进了对 raises 和其他动态编译代码的支持。这使其在 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”字符组成的字符串参数。这些字符与您在点状进度打印期间看到的单个字符相关,并将在测试运行结束时为每个测试打印额外的一行。这一行指示了确切的位置或测试 ID,您可以直接将其粘贴到 py.test 命令行以重新运行特定测试。

  • 允许外部插件通过新的 pytest_addhooks(pluginmanager) hook 注册新的 hook。新发布的用于分布式和循环失败测试的 pytest-xdist 插件需要此功能。

  • 添加了一个新的 pytest_ignore_collect(path, config) hook,允许项目和插件为其目录结构定义排除行为——例如,您可以在 conftest.py 中定义此方法

    def pytest_ignore_collect(path):
        return path.check(link=1)
    

    以阻止对符号链接目录中任何测试的收集尝试。

  • 新的 pytest_pycollect_makemodule(path, parent) hook,用于允许自定义匹配测试模块的 Module 收集对象。

  • 扩展和完善 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 输出的测试

  • 修复/优化 Python 3 兼容性(感谢 Benjamin Peterson)

  • 修复了 Jython/Win32 组合的工作问题,但请注意:Jython 2.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 及其帮助字符串(各自工厂函数的 docstring)

  • 如果 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 配置对象,用于访问命令行参数,现在可以在测试中轻松使用。

  • 安装 py.testpy.which 时带上 -$VERSION 后缀,以区分 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 收集 hook。

  • 收集/项节点特定的 runtest/collect hook 仅在匹配的 conftest.py 文件上精确调用,即那些位于项文件系统路径正下方的文件

  • 更改:第一个返回内容的 pytest_collect_directory hook 将阻止后续 hook 的调用。

  • 更改: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:在分布式测试期间,在工作节点上调用 pytest_sessionstart 和 pytest_sessionfinish hook,正确报告模块/会话拆卸 hook。

  • 修复 issue65:如果远程未安装 execnet/py 库,则正确处理分布式测试。

  • 如果 execnet 不可用,跳过某些安装测试

  • 修复文档,修复内部 bin/ 脚本生成

1.1.0 (2009-11-05)

  • 引入通过 setuptools 的 pkg_resources.iter_entry_points 实现‘pytest11’入口点的自动插件注册

  • 修复 py.test 分布式测试,使其与 execnet >= 1.0.0b4 兼容

  • 重新引入 `py.test.cmdline.main()` 以提供更好的向后兼容性

  • SVN 路径:修复 `path.check(versioned=True)` 处理 SVN 路径的错误,允许 SVN 路径中包含“%”,使 `svnwc.update()` 默认像 1.0.x 版本一样进入交互模式,并添加 `svnwc.update(interactive=False)` 来禁止交互。

  • 优化分布式 tarball,使其包含测试文件而不包含 `.pyc` 文件

  • 进一步努力,使 `py.compat.*` 访问的弃用警告能报告正确的位置

1.0.3

  • 调整和改进文档

  • 移除 `py.rest` 工具和内部命名空间 - 它从未真正被宣传过,如果需要,仍然可以在旧版本中使用。如果有人感兴趣,我想它可以作为一个独立的工具被复活。

  • 修复 issue48 和 issue59:如果从导入的测试文件模块看起来不来自其文件路径,则抛出错误 - 避免了多次报告的“同名”混淆问题

  • 合并了 Ronny 的 nose 兼容性修改:现在支持 nose 风格的 `setup_module()` 和 `setup()` 函数

  • 引入通用化的 `py.test.mark` 函数标记

  • 重新调整/优化命令行分组

  • 弃用 `parser.addgroup`,推荐使用创建选项组的 `getgroup`

  • 添加 `--report` 命令行选项,允许控制跳过/预期失败部分的显示

  • 通用跳过:一种新的方式,可以根据平台或 `sys` 模块属性,在函数、类和模块级别使用 `skipif` 或 `xfail` 标记 Python 函数。

  • 扩展 `py.test.mark` 装饰器以允许位置参数

  • 引入并测试“`py.cleanup -d`”以删除空目录

  • 修复 issue #59 - 增强 `unittest` 测试收集的健壮性

  • 通过向 `ApiModule` 添加 `__all__` 属性使 bpython/help 交互工作,并清理 `initpkg`

  • `pylib` 使用 MIT 许可证,并添加了一些贡献者

  • 移除 `py.execnet` 代码,并将所有用法替换为真正的“`execnet`”

  • 修复 issue50 - 对于具有多个参数的测试函数,`cached_setup` 现在更符合预期地进行缓存。

  • 合并 Jarko 的修复,包括 issue #45 和 #46

  • 添加为 `py.lookup` 指定搜索路径的功能

  • 修复了一个 `funcarg cached_setup` 错误,该错误可能只在分布式测试和带有 `teardown` 的“模块”作用域中发生。

  • 为使代码库与 Python 3 兼容进行了许多修复和更改,非常感谢 Benjamin Peterson 的帮助。

  • 整合 `builtins` 实现以兼容 >=2.3 版本,并添加辅助函数以简化维护 2.x 和 3.x 兼容代码。

  • 弃用 `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`”风格的文件转换为更简单的断言/直接测试类 `py.test/nosetests` 风格。该脚本由 Laura Creighton 编写。

  • 简化了内部 `localpath` 实现

1.0.2 (2009-08-27)

  • 修复了由 Fedora Red Hat 打包触发的打包问题,同时将 `doc`、`examples` 和 `contrib` 目录添加到了 `tarball` 中。

  • 添加了指向新 Django 插件的文档链接。

1.0.1 (2009-08-19)

  • 添加了一个“`pytest_nose`”插件,它处理 `nose.SkipTest`、nose 风格的函数/方法/生成器 `setup/teardown`,并尝试正确报告函数。

  • 捕获 Unicode 写入或编码字符串到 `sys.stdout/err` 的效果更好,同时终端写入功能在 Windows 和 Linux 之间进行了调整并有所统一。

  • 大量改进了文档布局和内容

  • 添加了“`--help-config`”选项,用于显示所有长选项命令行选项的 `conftest.py` / 环境变量名称,以及一些特殊的 `conftest.py` 变量。相应地,将 `conftest` 设置中的“`conf_capture`”重命名为“`option_capture`”。

  • 修复 issue #27:更好地报告命令行上给定的不可收集项(例如 `.pyc` 文件)

  • 修复 issue #33:添加了 `--version` 标志(感谢 Benjamin Peterson)

  • 修复 issue #32:为 `wcpath.status()` 添加了对“不完整”路径的支持

  • 如果以“Test”为前缀的类具有 `__init__` 方法,则默认情况下将不再收集它们

  • `monkeypatch setenv()` 现在接受“`prepend`”参数

  • 改进了收集错误回溯的报告

  • 简化了 `multicall` 机制和插件架构,重命名了一些内部方法和参数名

1.0.0 (2009-08-04)

  • 更简洁的报告,尝试显示相对于当前目录的文件系统路径

  • 稍微改进 `xfail` 输出

1.0.0b9 (2009-07-31)

  • 清晰地处理并报告测试设置的最终 `teardown`

  • 修复 `py.path.svnwc().versioned()` 与 SVN 1.6 的兼容性问题(感谢 Wouter Vanden Hove)

  • `setup/teardown` 或收集问题现在在进度行中显示为 `ERROR` 或大写“`E`”。它们被单独报告和计数。

  • 分布式测试:正确处理本地收集但无法在远程端收集的测试项——这通常是由于平台/依赖关系原因。

  • 简化了 `py.test.mark` API - 参见关键词插件文档

  • 更好地与日志记录集成:现在默认情况下,捕获功能会将测试函数及其即时 `setup/teardown` 捕获到单个流中

  • `capsys` 和 `capfd funcargs` 现在具有 `readouterr()` 和 `close()` 方法(底层使用了 `py.io.StdCapture/FD` 对象,这些对象也新增了 `readouterr()` 方法,用于返回捕获的 `out/err` 快照)

  • 改进了断言重新解释功能,使其更好地处理不返回布尔值的比较(maciej fijalkowski 报告了 `numpy` 相关问题,并为此表示感谢)

  • 将每个测试的输出捕获重构到 `pytest_iocapture.py` 插件中,从而从 `config` 对象中移除了捕获代码

  • 使用 `item.repr_failure(excinfo)` 而不是 `item.repr_failure(excinfo, outerr)`

1.0.0b8 (2009-07-22)

  • `pytest_unittest` 插件现在默认启用

  • 引入了 `pytest_keyboardinterrupt` 钩子并完善了 `pytest_sessionfinish` 钩子,并添加了测试。

  • 解决了日志模块的错误交互问题(“关闭已关闭的文件”)。感谢 Sridhar Ratnakumar 触发了这个问题。

  • 如果插件使用“`py.test.importorskip`”导入依赖项,将只发出警告,而不会退出测试过程。

  • 文档多方面改进: - 完善了 `funcargs` 文档,使用术语“`factory`”而非“`provider`” - 添加了新的演讲/教程文档页面 - 更好的下载页面 - 更好的插件文档字符串 - 添加了新的插件页面和自动文档生成脚本

  • 修复了与部分失败的 `funcarg setup` 相关的 `teardown` 问题(感谢 MrTopf 报告),现在即使“`pytest_runtest_setup`”失败,也会始终调用“`pytest_runtest_teardown`”。

  • 调整了 Python 模块中 `docstring` 的 `doctest` 输出,感谢 Radomir。

1.0.0b7

  • 将 `py.test.xfail` 重命名回 `py.test.mark.xfail`,以避免两种 `xfail` 装饰方式

  • 重新添加了 `py.test.mark` 装饰器,用于在函数上设置关键词(它实际上有文档说明,所以移除它是不妥的)

  • 从 `request.addfinalizer()` 中移除 `scope` 参数,因为 `request.cached_setup` 已经有 `scope` 参数。TOOWTDI (There's Only One Way To Do It)。

  • 在报告失败之前执行 `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` 文件中定义钩子。

  • 添加了新的 `pytest_namespace(config)` 钩子,允许将辅助函数直接注入 `py.test.*` 命名空间。

  • 记录并完善了许多钩子

  • 通过 `pytest_generate_tests` 钩子添加了新风格的生成式测试,该钩子与函数参数良好集成。

1.0.0b1

  • 引入了新的“`funcarg`”设置方法,详见 `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` 对象,允许将函数执行分叉到一个子进程并获取结果。

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 生成问题,“`py.test --runbrowser`”现在应该更可靠地工作

  • 移除了之前意外添加的 `py.test.broken` 和 `py.test.notimplemented` 辅助函数。

  • 现在有一个 `py.__version__` 属性

0.9.1

这是 v0.9.1 的相当完整的列表,可作为开发人员的参考。

  • 允许 `py.path.svn` URL 中包含 `+` 号 [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` 中使用的线程数量 [合并于 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]