更新日志

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

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

pytest 9.0.1 (2025-11-12)

Bug 修复

  • #13895: 恢复通过 raise unittest.SkipTest 跳过测试的支持。

  • #13896: pytest 9.0 中添加的终端进度插件在检测到 iTerm2 时现已自动禁用,它会生成桌面通知而不是所需的功能。

  • #13904: 修复了 API 参考中详细程度设置的 TOML 类型,从数字改为字符串。

  • #13910: 修复了在某些早期 Python 3.12 和 3.13 点版本上出现的 UserWarning: Do not expect file_or_dir 警告。

打包更新和下游注意事项

  • #13933: tox 配置已调整,以确保所需的版本字符串可以通过 SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST 环境变量作为发布过程的一部分传递到其 package_env 中 – 由 @webknjaz

面向贡献者的更改

  • #13891, #13942: 发布自动化的 CI/CD 部分现在能够在磁盘上没有 Git checkout 的情况下创建 GitHub Release – 由 @bluetech@webknjaz

  • #13933: tox 配置已调整,以确保所需的版本字符串可以通过 SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST 环境变量作为发布过程的一部分传递到其 package_env 中 – 由 @webknjaz

pytest 9.0.0 (2025-11-05)

新功能

  • #1367: 已添加子测试支持

    子测试 是参数化的替代方案,在参数化值并非在收集时都已知的情况下非常有用。

    示例

    def contains_docstring(p: Path) -> bool:
        """Return True if the given Python file contains a top-level docstring."""
        ...
    
    
    def test_py_files_contain_docstring(subtests: pytest.Subtests) -> None:
        for path in Path.cwd().glob("*.py"):
            with subtests.test(path=str(path)):
                assert contains_docstring(path)
    

    每个断言失败或错误都由上下文管理器捕获并单独报告,从而清晰地显示所有缺少文档字符串的文件。

    此外,现在还支持 unittest.TestCase.subTest()

    此功能最初是作为 pytest-subtests 中的一个独立插件实现的,但此后已合并到核心。

    注意

    此功能是实验性的,未来版本可能会有所发展。这意味着我们可能会更改子测试在失败时的报告方式,但功能及其使用方式是稳定的。

  • #13743: 添加了对原生 TOML 配置文件的支持。

    尽管自版本 6 以来,pytest 支持在 pyproject.toml 文件中 [tool.pytest.ini_options] 下的配置,但它是以“INI 兼容模式”进行的,其中所有配置值都被视为字符串或字符串列表。现在,pytest 支持原生 TOML 数据模型。

    pyproject.toml 中,原生 TOML 配置位于 [tool.pytest] 表下。

    # pyproject.toml
    [tool.pytest]
    minversion = "9.0"
    addopts = ["-ra", "-q"]
    testpaths = [
        "tests",
        "integration",
    ]
    

    仍支持 [tool.pytest.ini_options] 表,但不能同时使用这两个表。

    如果您更喜欢使用单独的配置文件,或者不使用 pyproject.toml,则可以使用 pytest.toml.pytest.toml

    # pytest.toml or .pytest.toml
    [pytest]
    minversion = "9.0"
    addopts = ["-ra", "-q"]
    testpaths = [
        "tests",
        "integration",
    ]
    

    文档现在(有时)以 TOML 和 INI 两种格式在选项卡式界面中显示配置代码片段。

    有关完整详细信息,请参阅 配置文件格式

  • #13823: 添加了通过 strict 配置选项启用的“严格模式”

    当设置为 true 时,strict 选项目前启用

    可以显式设置各个严格性选项以覆盖全局 strict 设置。

    以前已弃用的 --strict 命令行标志现在启用严格模式。

    如果 pytest 将来添加新的严格性选项,它们也将启用严格模式。因此,您应该仅在使用固定/锁定的 pytest 版本时,或希望主动采用新的严格性选项时启用严格模式。

    有关更多详细信息,请参阅 使用 pytest 的严格模式

  • #13737: 添加了 strict_parametrization_ids 配置选项。

    设置后,如果 pytest 检测到非唯一的参数集 ID,它将发出错误,而不是通过添加 01 等自动使 ID 唯一。这对于捕获意外重复特别有用。

  • #13072: 添加了使用 OSC 9;4; ANSI 序列在终端选项卡中显示测试会话进度的支持。当 pytest 在 ConEmu、Gnome Terminal、Ptyxis、Windows Terminal、Kitty 或 Ghostty 等支持的终端模拟器中运行时,您将在终端选项卡或窗口中看到进度,从而一目了然地监控 pytest 的进度。

    此功能在 TTY 中运行时自动启用。它作为内部插件实现。如果需要,可以通过以下方式禁用: - 在用户级别,使用命令行上的 -p no:terminalprogress 或通过环境变量 PYTEST_ADDOPTS='-p no:terminalprogress'。 - 在项目配置级别,使用 addopts = "-p no:terminalprogress"

  • #478: 当配置中 consider_namespace_packagestrue 时,支持 PEP420(隐式命名空间包)作为 --pyargs 目标。

    以前,此选项仅影响包导入,现在它也影响测试发现。

  • #13678: 添加了一个新的 faulthandler_exit_on_timeout 配置选项,默认设置为“false”,以在死锁情况下让 faulthandler 在超时后中断 pytest 进程。

    以前,faulthandler 超时只会将所有线程的追踪信息转储到 stderr,但不会中断 pytest 进程。

    – 由 @ogrisel

  • #13829: 添加了通过 Parser.addini() 中的 aliases 参数支持配置选项别名。

    插件现在可以为配置选项注册替代名称,从而在配置命名方面提供更大的灵活性,并在重命名选项时支持向后兼容性。如果配置文件中同时指定了规范名称和别名,则规范名称始终优先。

现有功能的改进

  • #13330: 将 pytest 配置分散到多个文件(例如,同时存在 pytest.ini 文件和带有 [tool.pytest.ini_options] 表的 pyproject.toml)现在将打印警告,以使用户更清楚地知道只有一个文件实际被使用。

    – 由 @sgaist

  • #13574: 单个参数 --version 不再加载整个插件基础设施,从而在仅显示 pytest 版本时更快、更可靠。

    两次传递 --version(例如,pytest --version --version)保留了原始行为,同时显示 pytest 版本和插件信息。

    注意

    由于 --version 现在被提前处理,因此它仅在通过命令行直接传递时生效。如果通过其他机制设置,例如 PYTEST_ADDOPTSaddopts,它将不起作用。

  • #13823: 添加了 strict_xfail 作为 xfail_strict 选项的别名,strict_config 作为 --strict-config 标志的别名,以及 strict_markers 作为 --strict-markers 标志的别名。这使得所有严格性选项都具有前缀为 strict_ 的配置选项,从而保持一致。

  • #13700: 当给定 --quiet 时,--junitxml 不再在 pytest 会话结束时打印 generated xml file 摘要。

  • #13732: 以前,当过滤警告时,如果过滤器引用了无法导入的类,pytest 将会失败。现在,这只会输出一条消息指示问题。

  • #13859: 澄清 pytest.raises() 当正则表达式 match 失败时的错误消息。

  • #13861: 改进了测试预期错误消息的句式结构。以前,错误消息是“预期的异常必须是 ,但得到 ”。现在,它变成了“预期 ,但得到 ”。

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

  • #12083: 修复了一个 bug,即 pytest a/ a/b 这样的调用只会运行 a/b 中的测试,而不会运行 a/ 下的其他测试。

    此修复涉及对处理此类重叠参数和重复项方式的一些重大更改

    1. pytest a/b a/pytest a/ a/b 等效于 pytest a;如果一个参数与另一个参数重叠,则只保留前缀。

    2. pytest x.py x.py 等效于 pytest x.py;以前,这样的调用被视为明确请求运行文件中的测试两次。

    如果您依赖这些行为,请考虑使用 –keep-duplicates,它保留了其现有行为(包括该 bug)。

  • #13719: 停止支持 Python 3.9,因为它已结束生命周期。

  • #13766: 以前,如果定义了环境变量 $CI$BUILD_NUMBER,pytest 就会假定它正在 CI/CD 环境中运行;现在,只有当至少一个变量被定义并设置为非空值时,CI 模式才会被激活。

  • #13779: PytestRemovedIn9Warning 弃用警告现在默认是错误。

    按照我们尽可能减少干扰地移除弃用功能的计划,所有 PytestRemovedIn9Warning 类型的警告现在默认生成错误而不是警告消息。

    受影响的功能将在 pytest 9.1 中有效移除,因此请查阅文档中的 弃用和移除 部分,以获取有关如何更新现有代码的说明。

    在 pytest 9.0.X 系列中,可以通过在 pytest.ini 文件中添加以下内容,将错误改回警告,作为权宜之计

    [pytest]
    filterwarnings =
        ignore::pytest.PytestRemovedIn9Warning
    

    但这将在 pytest 9.1 发布时停止工作。

    如果您对某个特定功能的移除有疑虑,请在 #13779 中添加评论。

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

Bug 修复

  • #13445: 使 pytest.skip() 及其相关函数的类型注解更符合规范,以使其在更多类型检查器中工作。

  • #13537: 修复了一个 bug,即在 teardown 中仅包含 Skipped 异常的 ExceptionGroup 未正确处理并显示为错误。

  • #13598: 修复了在 Windows 上涉及短路径和符号链接时可能出现的收集混乱问题。

  • #13716: 修复了一个 bug,即像 pytest x.py[a] 这样无意义的调用(文件不能被参数化)被默默地视为 pytest x.py。现在这是一个使用错误。

  • #13722: 修复了在使用 pytest.approx() 比较长度不同的映射时,令人误解的断言失败消息。

  • #13773: 修复了静态 fixture 闭包计算,以正确考虑被覆盖的 fixture 所请求的传递依赖项。

  • #13816: 修复了 pytest.approx(),它现在在比较具有不同键的映射时返回更清晰的错误消息。

  • #13849: 即使为空,隐藏的 .pytest.ini 文件现在也会被视为配置文件。这与非隐藏的 pytest.ini 不一致。

  • #13865: 修复了 --show-capture--tb=line 的问题。

  • #13522: 修复了子进程模式下的 pytester 忽略了除第一个 pytester.plugins <pytest.Pytester.plugins> 之外的所有插件。

    修复了子进程模式下的 pytester 静默忽略非字符串 pytester.plugins 的问题。现在它会报错。如果您受到此影响,请按名称指定插件,或将受影响的测试明确切换为使用 pytester.runpytest_inprocess

打包更新和下游注意事项

  • #13791: iniconfigpackaging 的最低要求分别提高到 1.0.122.0.0

面向贡献者的更改

  • #12244: 修复了当 TERM=dumb 时自测失败的问题。

  • #12474: 添加了计划的 GitHub Action 工作流,以在仓库文档中运行 Sphinx 链接检查。

  • #13621: pytest 自己的测试套件现在处理 lsof 命令挂起的情况(例如由于无法访问的网络文件系统),受影响的自测将在 10 秒后跳过。

  • #13638: 修复了 scripts/prepare-release-pr.py 中已弃用的 gh pr new 命令。该脚本现在使用与 GitHub CLI v2.0+ 兼容的 gh pr create

  • #13695: 在 Pytester.run 中刷新 stdoutstderr,以避免在 CI 上 test_faulthandler.py::test_timeout 中截断输出 – 由 @ogrisel

  • #13771: 在没有符号链接支持的 Windows 环境中跳过 test_do_not_collect_symlink_siblings,以避免假阴性。

  • #13841: 贡献 pytest 时,现在需要 tox>=4

  • #13625: 在 cacheprovider.py 中为 pytest_addoption()pytest_configure()cacheshow() 函数添加了缺失的文档字符串。

杂项内部更改

  • #13830: 配置覆盖(-o/--override-ini)现在在启动期间处理,而不是在 config.getini() 期间处理。

pytest 8.4.2 (2025-09-03)

Bug 修复

  • #13478: 修复了在使用 console_output_styletimes 且模块被跳过时发生的崩溃。

  • #13530: 修复了在使用 pytest.approx() 和设置了 decimal.FloatOperation 陷阱的 decimal.Decimal 实例时发生的崩溃。

  • #13549: 在 Python 3.14 中检查函数签名时,不再评估类型注解。

    这可以防止在模块未显式使用 from __future__ import annotations 并在 if TYPE_CHECKING: 块中导入注解类型时,在模块收集过程中发生崩溃。

  • #13559: 在 pytest.Parser.addini()type 参数的 Literal 类型注解中添加了缺失的 intfloat 变体。

  • #13563: pytest.approx() 现在仅在 NumPy 已在 sys.modules 中时才导入 numpy。这修复了 8.4.0 中引入的无条件导入行为。

改进的文档

  • #13577: 澄清 pytest_generate_tests 在测试模块/类中发现;其他 hook 必须在 conftest.py 或插件中。

面向贡献者的更改

  • #13480: 自测:修复了在运行 -Wdefault 或类似覆盖时的一些测试失败问题。

  • #13547: 自测:更正了 Python 3.14test_doctest_unexpected_exception 的预期消息。

  • #13684: 使 pytest 自己的测试套件对 CI 环境变量的存在不敏感 – 由 @ogrisel

pytest 8.4.1 (2025-06-17)

Bug 修复

  • #13461: 更正了 _pytest.terminal.TerminalReporter.isatty 以支持作为方法调用。以前它只是一个布尔值,这在使用 -o log_cli=true 时可能会破坏正确的代码)。

  • #13477: 重新引入了 pytest.PytestReturnNotNoneWarning,它在 pytest 8.4 中被意外移除。

    当测试函数返回非 None 值时,会引发此警告,这通常是初学者犯的错误。

    有关更多信息,请参阅 测试函数中返回非 None 值

  • #13497: 修复了与 Twisted 25+ 的兼容性问题。

改进的文档

  • #13492: 修复了关于 faulthandler 在 Windows 上无法工作的过时警告。

pytest 8.4.0 (2025-06-02)

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

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

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

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

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

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

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

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

新功能

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

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

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

  • #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: Fixture 现在在输出中清晰地表示为“fixture 对象”,而不是像以前那样作为普通函数,这使得初学者很容易发现错误,例如引用在同一模块中声明但未在测试函数中请求的 fixture。

    – 由 @the-compiler@glyphack

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

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

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

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

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

  • #12958: 对 不可引发的异常 进行了一些增强

    • 尽早设置不可引发的钩子,并尽可能晚地取消设置,以收集尽可能多的不可引发的异常。

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

    • 每个测试阶段收集多个不可引发的异常。

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

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

    • 如果引发了 pytest.PytestUnraisableExceptionWarning 异常,则将不可引发的异常报告为其原因。

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

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

  • #13016: 对 线程异常 进行了一些增强

    • 尽早设置异常钩子,并尽可能晚地取消设置,以收集来自线程的尽可能多的未处理异常。

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

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

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

    • 如果引发了 pytest.PytestUnhandledThreadExceptionWarning 异常,则将线程异常报告为其原因。

    • 在异常钩子中提取线程对象的 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 选项禁用)。

Bug 修复

  • #10404: 尽快应用配置/cli 中的 filterwarnings,并尽可能晚地恢复它们,以便在 pytest 运行期间以及在移除不可引发和线程异常钩子之前收集警告作为错误。

    这允许非常晚的警告和不可引发/线程异常使测试套件失败。

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

  • #11067: 现在无论测试是因 pytest.mark.xfail 还是 pytest.fail() 而 xfailed,测试报告都是一致的。

    以前,通过标记 xfailed 的测试会在消息前加上字符串 "reason: ",而通过函数 xfailed 的测试则没有。前缀已被移除。

  • #12008: 在 #11220 中,由于更改了为直接参数分配索引的方式,引入了无意的重新排序。更具体地说,在该更改之前,对 metafunc 的 callspecs 的直接参数的索引是在所有参数化发生之后分配的。现在,该更改被还原。

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

  • #12929: 正确处理测试用例、设置和拆解中的 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 中使用 indirect=True 传递 scope 可能会导致其他 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: 在文档中添加了处理抽象测试类的配方。

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

打包更新和下游注意事项

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

面向贡献者的更改

  • #12017: 混合内部改进

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

    • 在 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_collection_modifyitems 钩子实现中调用 pytest_deselected 钩子。

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

    —— 作者:@okken

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

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

    有关更多信息,请参阅 标记示例

    —— 作者:@lovetheguitar

  • #12567: 添加了 --no-fold-skipped 命令行选项。

    如果设置了此选项,则短摘要中跳过的测试不再按原因分组,而是所有测试都以其 nodeid 独立打印,与其他状态相同。

    —— 作者:@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 拆卸错误的问题。

    最初在 pytest 8.0.0 中添加,但由于 pytest-xdist 中的回归,在 8.0.2 中恢复。此回归已在 pytest-xdist 3.6.1 中修复。

  • #11797: pytest.approx() 现在正确处理 Sequence 类似对象。

  • #12204#12264: 修复了 pytest 8.0 中的回归问题,该问题导致当多个测试由于共享的高作用域 fixture 抛出异常而失败时,回溯会越来越长——作者:@bluetech

    还修复了 pytest 5.4 中类似回归,即收集器在设置期间抛出异常。

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

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

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

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

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

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

  • #12472: 修复了在 pytest_report_teststatus 钩子中使用自定义测试状态返回类别 "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 引入了垃圾回收器中的一个不稳定错误,预计不会在该版本中修复,因为 3.8 已终止支持。

    —— 作者:@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 自己的测试。这减少了不稳定测试对最终数字的影响。

    —— 作者:@webknjaz

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

    —— 作者:@webknjaz

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

pytest 8.2.2 (2024-06-04)

错误修复

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

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

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

错误修复

  • #12120: 修复了由于命令行中未选择的目录而导致的 PermissionError 崩溃。

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

  • #12300: 修复了 squashfuse_ll 下“函数未实现”错误的处理,这是表示挂载点为只读的不同方式。

  • #12308: 修复了 pytest 8.2.0 中的一个回归问题,该问题导致自动创建的 .pytest_cache 目录的权限从预期的 rwxr-xr-x 变为 rwx------

琐碎/内部更改

  • #12333: pytest 发布现在使用 GitHub 最近的 Artifact Attestation 支持进行认证,允许用户验证 pytest 的 sdist 和 wheel 制品的来源。

pytest 8.2.0 (2024-04-27)

重大更改

  • #12089: pytest 现在要求 unittest.TestCase 子类可以使用 MyTestCase('runTest') 自由实例化。

    如果该类不允许这样做,您可能会在收集过程中看到诸如 AttributeError: 'MyTestCase' object has no attribute 'runTest' 的错误。

    未覆盖 __init__ 或未在 __init__ 中使用 getattr 或类似方法访问测试方法的类不受影响。

    如果类确实这样做了,则应注意在给定 "runTest" 时不要崩溃,如 unittest.TestCase 的实现所示。或者,考虑使用 setUp 而不是 __init__

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

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

    历史说明:此更改对自定义 TestCase 实现的影响最初未被充分考虑,这就是为什么它在次要版本中完成。我们对造成的不便表示歉意。

弃用

功能

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

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

改进

错误修复

  • #12065: 修复了 pytest 8.0.0 中的一个回归问题,该问题导致包含 setup_method 和使用 @staticmethod@classmethod 的测试的测试类会因 AttributeError: 'NoneType' object has no attribute 'setup_method' 而崩溃。

    现在,使用 @staticmethod@classmethod 的测试的 request.instance 属性不再是 None,而是该类的一个新实例,就像在非静态方法中一样。以前它是 None,并且此类测试的所有 fixture 都将共享一个 self

  • #12135: 修复了 fixture 多次将其终结器添加到其请求的 fixture 会在某些情况下导致不可靠和不直观的拆卸顺序的问题。

  • #12194: 修复了 --importmode=importlib--doctest-modules 的一个 bug,该 bug 导致子模块未作为属性出现在父模块中。

  • #1489: 修复了一些高作用域 fixture 的拆卸未按其初始化顺序反向发生的情况。

琐碎/内部更改

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

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

pytest 8.1.2 (2024-04-26)

错误修复

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

pytest 8.1.1 (2024-03-08)

注意

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

功能

改进

  • #10865: pytest.warns() 现在验证 warnings.warn() 是否使用 strWarning 调用。目前在 Python 中可以使用其他类型,但这会在使用 warnings.filterwarnings() 过滤这些警告时导致异常(参见 CPython #103577 进行讨论)。虽然这可以被认为是 CPython 中的一个 bug,但我们决定在 pytest 中添加防护,因为没有此检查时生成的错误消息令人困惑。

  • #11311: 当在没有定义配置文件的情况下对调用中的路径使用 --override-ini 时,当前工作目录用作相对目录。

    以前这会引发 AssertionError

  • #11475: –import-mode=importlib 现在尝试使用标准导入机制导入模块(但仍然不更改 sys.path),仅在失败时回退到直接导入模块。

    这意味着如果可能,已安装的包将首先以其规范名称导入,例如 app.core.models,而不是始终从其路径派生模块名称(例如 .env310.lib.site_packages.app.core.models)。

  • #11801: 添加了节点上的 iter_parents() 辅助方法。它类似于 listchain,但从下到上遍历,并返回一个迭代器,而不是列表。

  • #11850: 添加了对 Python>=3.12 上死后调试的 sys.last_exc 的支持。

  • #11962: 如果没有找到其他合适的配置文件候选,即使没有 [tool.pytest.ini_options] 表,pyproject.toml 也将被视为配置文件并定义 rootdir

  • #11978: 为日志插件添加了 --log-file-mode 选项,启用日志文件追加。此选项接受 "w""a",默认为 "w"

    以前,模式是硬编码为 "w",这会在日志记录之前截断文件。

  • #12047: 当 fixture 的多个终结器引发异常时,现在所有异常都报告为异常组。以前,只报告第一个异常。

错误修复

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

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

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

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

错误修复

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

错误修复

  • #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 中的回归问题,即模块中定义的自动使用夹具会被模块中的 doctests 忽略。

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

pytest 8.0.0 (2024-01-27)

错误修复

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

  • #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 参数,其中包含 plugin 注册时使用的名称。

错误修复

  • #11706: 修复了在使用 --maxfail--stepwise 时,高范围夹具中拆卸错误的报告问题。

    注意:此更改在 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 - 我们提及这一点以防外部代码正在使用它,即使它被标记为 private

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 现在是 "";以前它是根目录名称。这与始终为 ""session.nodeid 匹配。

    现在,收集树包含直到 根目录 的目录/包,对于在根目录中找到的初始参数。对于根目录之外的文件,只收集直接目录/包 – 但请注意,不鼓励从根目录之外进行收集。

    例如,给定以下文件系统树

    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,而不管 type 是什么。

    • 如果既未提供 default 也未提供 type,则假定 type=str 并返回 "" 作为默认值(这与以前的行为一致)。

    团队决定不对这项更改引入弃用期,因为这样做在与社区沟通和实施方面都会很复杂,而且团队认为这项更改不会破坏现有插件,除非在极少数情况下。

  • #11667: pytest 的 setup.py 文件已移除。如果您依赖此文件(例如,使用 setup.py install 安装 pytest),请参阅 Why you shouldn’t invoke setup.py directly 以获取替代方案。

  • #9288: warns() 现在在上下文关闭时重新发出未匹配的警告 – 以前它会消耗所有警告,隐藏那些未被函数匹配的警告。

    虽然这是一个新功能,但我们将其作为一项重大更改发布,因为许多测试套件配置为在出现警告时出错,因此将在新重新发出的警告上失败。

  • 内部的 FixtureManager.getfixtureclosure 方法已更改。使用此方法或继承 FixtureManager 并覆盖该方法的插件需要适应此更改。

弃用

  • #10465: 返回非 None 值的测试函数现在将发出 pytest.PytestWarning 而不是 pytest.PytestRemovedIn8Warning,这意味着这将来仍将是一个警告而不是错误。

  • #3664: 对夹具函数应用标记现在会发出警告:夹具中的标记从未有任何效果,但对夹具应用标记(例如 usefixtures)并期望它工作是常见的用户错误。

    这将在 pytest 9.0 中成为一个错误。

功能与改进

改进的差异显示

这些更改改进了 pytest 在断言失败时打印的差异显示。请注意,语法高亮需要 pygments 包。

  • #11520: 现在,非常详细(-vv)的差异输出以差异的形式着色,而不是一大块红色。

    错误报告中的 Python 代码现在以 Python 语法高亮显示。

    错误报告中的部分现在更好地分离。

  • #1531: 针对每个标准库容器类型的非常详细的差异(-vv)得到了改进。缩进现在保持一致,并且标记位于各自的独立行,这应该会减少向用户显示的差异。

    以前,使用标准的 Python 漂亮打印机生成输出,它将开闭标记放在与第一个/最后一个条目相同的行上,并且没有一致的缩进。

  • #10617: 为除相等 == 之外的比较添加了更全面的集合断言重写,现在以下操作提供了更好的失败消息:!=<=>=<>

断言冗余的独立控制

  • #11387: 添加了新的 verbosity_assertions 配置选项,用于精细控制失败断言的冗余。

    如果您曾希望 pytest 始终显示完整的差异,但又不想让其他一切都变得冗长,那么这个功能就是为您准备的。

    有关更多详细信息,请参阅 精细化详细程度

    对于插件作者,config.get_verbosity 可用于检索特定冗余类型的冗余级别。

对异常组和 __notes__ 的额外支持

这些更改改进了 pytest 对异常组的支持。

自定义目录收集器

“新式”钩子包装器

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

    想要使用新式包装器的插件,如果它们要求 pytest>=8,则可以使用。

其他改进

错误修复

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

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

  • #11277: 修复了一个错误,当一个间接参数有多个夹具时,会选择范围最广的夹具的范围作为参数集,而不是范围最窄的夹具。

  • #11456: 参数化测试现在*真正*确保赋予每个输入的 ID 是唯一的——例如,a, a, a0 现在会得到 a1, a2, a0,而不是以前(有 bug 的)a0, a1, a0。这必然意味着更改以前发生冲突的节点 ID,并且为了可读性,当非唯一 ID 以数字结尾时,会添加一个下划线。

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

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

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

改进文档

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

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

琐碎/内部更改

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

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

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

  • #11315: pytester 夹具现在使用 monkeypatch 夹具来管理当前工作目录。如果您将 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 上文件顶部非字符串常量被检测为 docstring 的问题。

  • #11572: 处理了在 故障处理程序 拆卸时 sys.stderrsys.__stderr__ 可能已关闭的边缘情况。

  • #11710: 修复了收集错误中的回溯未被剪枝的问题。

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

改进文档

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

pytest 7.4.3 (2023-10-24)

错误修复

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

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

  • #11439: 处理了在 故障处理程序 拆卸时 sys.stderr 可能已关闭的边缘情况。

pytest 7.4.2 (2023-09-07)

错误修复

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

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

  • #11367: 修复了当夹具在拆卸期间失败时,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 钩子文档中的不一致问题。

  • #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 实现。很可能,您的钩子对于不想忽略的路径返回 False,这会终止处理并且不允许其他插件(包括 pytest 本身)忽略该路径。修复方法是对于您的钩子不想忽略的路径返回 None 而不是 False

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

错误修复

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

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

  • #11104: 修复了 pytest 7.3.2 中的回归问题,该问题导致 testpaths 被考虑用于加载初始 conftests,即使它未被使用(例如,当在命令行上给出明确路径时)。现在只有在使用时才考虑 testpaths

  • #1904: 修复了使用 __tracebackhide__ = True 隐藏的跟踪条目仍然显示在链式异常中(“... the above exception ...”消息之后的部分)。

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

改进文档

琐碎/内部更改

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

pytest 7.3.2 (2023-06-10)

错误修复

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

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

  • #10987: testpaths 现在被遵守以加载根 conftests

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

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

  • #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 夹具创建的目录的保留方式。

改进

  • #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: 修复了 tmp_path 夹具在 emscripten 平台上由于缺少 os.getuid() 而总是引发 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 teardown 阶段的一部分被调用的 bug。

  • #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: 修复了有时 pytest 会在 Windows 上使用文件系统根目录作为 rootdir 的 bug。

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

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

pytest 7.2.0 (2022-10-23)

弃用

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

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

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

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

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

    这包括

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

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

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

  • #7337: 如果测试函数返回 None 以外的值,现在会发出弃用警告。这可以防止初学者常见的错误,他们期望返回 bool(例如 return foo(a, b) == result)会导致测试通过或失败,而不是使用 assert。计划是未来将测试返回非 None 视为错误。

特性

  • #9897: 为 testpaths 添加了 shell 风格的通配符支持。

改进

  • #10218: @pytest.mark.parametrize()(以及类似的函数)现在接受任何 Sequence[str] 作为参数名称,而不仅仅是 list[str]tuple[str, ...]

    (请注意,str 本身是一个 Sequence[str],仍然像以前一样被视为逗号分隔的名称列表)。

  • #10381: 添加了 --no-showlocals 标志。这可以直接传递给测试以覆盖通过 addopts 声明的 --showlocals

  • #3426: NFC 和 NFD 形式的字符串断言失败,如果规范化为相同的字符串,现在会有专门的错误消息详细说明问题,并显示其 utf-8 表示。

  • #8508: 引入了通过 pytest.warns() 匹配警告的多行显示,并增强了 pytest.ExceptionInfo.match()(由 pytest.raises() 返回)的匹配比较。

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

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

    tomli 不再是 Python 3.11 的依赖项。

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

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

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

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

  • #9920: 在 CI 环境中运行时,在 short test summary info 中显示完整的崩溃消息。

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

错误修复

  • #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 钩子 - 改用 pytest_warning_recorded

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

    • -k foobar: 语法。

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

    有关更多信息,请查阅文档中的 Deprecations and Removals

  • #9437: 放弃了对 Python 3.6 的支持,该版本已于 2021-12-23 结束生命周期

改进

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

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

  • #9362: pytest 现在避免在检测到 attrsdataclasses 中默认 __eq__ 被覆盖时进行专门的断言格式化。

  • #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 TestCases 中非默认 __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.Config.inifilepytest_cmdline_main 钩子期间可用(在 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.local 是一个 os.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 参数已被弃用。有关详细信息,请参阅弃用说明

    节点构造函数的 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: 定义一个同时是 ItemCollector(例如 File)的自定义 pytest 节点类型现在会发出警告。它从未得到合理的官方支持,并会触发难以调试的错误。

    有关详细信息,请参阅弃用说明

  • #8592: pytest_cmdline_preparse 已正式弃用。它将在未来的版本中移除。请改用 pytest_load_initial_conftests

    有关详细信息,请参阅弃用说明

  • #8645: pytest.warns(None) 现在已弃用,因为许多人将其解释为“此代码不发出警告”,但它实际上具有检查代码是否至少发出一种类型警告的效果——例如 pytest.warns()pytest.warns(Warning)

  • #8948: pytest.skip(msg=...)pytest.fail(msg=...)pytest.exit(msg=...) 签名现在接受 reason 参数而不是 msg。使用 msg 仍然有效,但已弃用,并将在未来的版本中移除。

    此更改是为了与 pytest.mark.skippytest.mark.xfail 保持一致,两者都接受 reason 作为参数。

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

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

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

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

特性

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

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

  • #7132: 添加了两个环境变量 PYTEST_THEMEPYTEST_THEME_MODE,让用户可以自定义使用的 pygments 主题。

  • #7259: 添加了 cache.mkdir(),它类似于现有的 cache.makedir(),但返回 pathlib.Path 而不是旧版的 py.path.local

    parser.addini() 添加了 paths 类型,如 parser.addini("mypaths", "my paths", type="paths"),它类似于现有的 pathlist,但返回一个 pathlib.Path 列表,而不是旧版的 py.path.local

  • #7469: pytest API 中使用的对象类型现已导出,可用于类型注解。

    新导出的类型有

    直接构造它们大多数不被支持;它们仅用于类型注解。这样做会发出弃用警告,并且在 pytest 8.0 中可能会成为硬性错误。

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

  • #7856: –import-mode=importlib 现在适用于依赖于模块在 sys.modules 中的功能,例如 pickledataclasses

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

    注意

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

    这是一个由于历史原因造成的不幸遗留问题,我们随着逐步淘汰 py 依赖(请参阅 #9283 以进行更长的讨论),预计将在未来的版本中解决。

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

    注意

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

    这是一个由于历史原因造成的不幸遗留问题,我们随着逐步淘汰 py 依赖(请参阅 #9283 以进行更长的讨论),预计将在未来的版本中解决。

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

  • #8606: 使用 --fixtures-per-test--fixtures 调用 pytest 时,已增加以下内容

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

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

    • 在 fixture 名称下使用 --verbose 选项打印整个 fixture 的 docstring。

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

  • #8789: 将 TOML 解析器从 toml 切换到 tomli,以支持 pyproject.toml 中的 TOML v1.0.0。

  • #8920: 添加了 pytest.Stash,这是一个插件用于在 ConfigNode 上以类型安全且无冲突的方式存储数据的工具。详情请参阅 在钩子函数之间存储项数据

  • #8953: RunResult 方法 assert_outcomes() 现在接受一个 warnings 参数,用于断言捕获到的警告总数。

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

  • #9023: 当环境中检测到 CIBUILD_NUMBER 时,即使未使用 -v,现在也会始终显示可迭代对象相等断言的完整差异。

  • #9113: RunResult 方法 assert_outcomes() 现在接受一个 deselected 参数,用于断言未选择的测试总数。

  • #9114: 添加了 pythonpath 设置,它在测试会话期间将列出的路径添加到 sys.path。如果您目前使用 pytest-pythonpath 或 pytest-srcpaths 插件,您应该能够用内置的 pythonpath 设置替换它们。

改进

  • #7480: 计划在主版本 X(例如 pytest 7、8、9 等)中移除的弃用现在使用警告类别 PytestRemovedInXWarning,它是 PytestDeprecationWarning 的子类,而不是直接使用 PytestDeprecationWarning

    有关详细信息,请参阅 向后兼容性策略

  • #7864: 改进了解析警告过滤器时的错误消息。

    以前 pytest 会显示内部回溯,这除了难看之外,有时还会隐藏问题的原因(例如在导入特定警告类型时出现 ImportError)。

  • #8335: 改进了数字序列的 pytest.approx() 断言消息。

    断言消息现在会转储一个表格,其中包含每个差异的索引和错误。示例

    >       assert [1, 2, 3, 4] == pytest.approx([1, 3, 3, 5])
    E       assert comparison failed for 2 values:
    E         Index | Obtained | Expected
    E         1     | 2        | 3 +- 3.0e-06
    E         3     | 4        | 5 +- 5.0e-06
    
  • #8403: 默认情况下,pytest 会截断断言错误中的长字符串,以免它们过多地扰乱输出,目前默认为 240 个字符。

    然而,在某些情况下,较长的输出有助于甚至对于诊断故障至关重要。使用 -v 现在会将截断阈值增加到 2400 个字符,而 -vv 或更高则会完全禁用截断。

  • #8509: 修复了自 pytest 6.2.0 以来,当测试名称中包含 / 时,unittest.TestCase.setUpClass() 未被调用的问题。

    这指的是 pytest 节点 ID 中的路径部分,例如节点 ID tests/test_file.py::TestClass::test_it 中的 TestClass::test_it

    现在,不再假设测试名称不包含 /,而是假设测试路径不包含 ::。我们计划在未来希望使这两者都能工作。

  • #8803: 现在可以在 CLI 日志中为自定义日志级别添加颜色。

    通过在 pytest_configure 钩子中使用 add_color_level,可以添加颜色

    logging_plugin = config.pluginmanager.get_plugin('logging-plugin')
    logging_plugin.log_cli_handler.formatter.add_color_level(logging.INFO, 'cyan')
    logging_plugin.log_cli_handler.formatter.add_color_level(logging.SPAM, 'blue')
    

    有关详细信息,请参阅 自定义颜色

  • #8822: 在 --fixtures--fixtures-by-test 中显示 fixture 路径时,来自 pytest 本身的 fixture 现在显示省略路径,而不是 site-packages 目录中文件的完整路径。

  • #8898: 在生成参数化 ID 时,复数现在像浮点数和整数一样处理。

  • #9062: --stepwise-skip 现在隐式启用 --stepwise,并且可以单独使用。

  • #9205: pytest.Cache.set() 现在在保存字典时保留键的顺序。

Bug 修复

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

  • #8061: 修复了如果静态方法测试用例继承自父测试类,它们会失败的问题。

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

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

  • #8258: 修复了 pytest 的 faulthandler 支持在 pytest 启动期间(例如使用 python -X dev -m 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 的内部 fixture 使用私有名称,以便它们在默认的 --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: 重写后的 assert 语句的结束行号和结束列偏移量现在已正确设置。

  • #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 配置升级为使用具有更好 Unicode 支持的 PDF 文档的 较新 Ubuntu 版本 <https://blog.readthedocs.com/new-build-specification/>`__

  • #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 制品的命令:使用构建包而不是 setup.py。

  • #9351: 修正了 doc/en/example/special.rst 中细微的错别字。

pytest 6.2.5 (2021-08-29)

琐碎/内部更改

  • #8494: Python 3.10 现已支持。

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

pytest 6.2.4 (2021-05-04)

Bug 修复

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

pytest 6.2.3 (2021-04-03)

Bug 修复

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

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

pytest 6.2.2 (2021-01-25)

Bug 修复

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

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

pytest 6.2.1 (2020-12-15)

Bug 修复

  • #7678: 修复了在主机中编译的文件后来从 UNC 挂载路径(Windows)加载时引发 ImportPathMismatchError 的错误。

  • #8132: 修复了 approx 中的回归:在 6.2.0 中,approx 在处理非数字类型时不再引发 TypeError,而是回退到正常比较。在 6.2.0 之前,tf.DeviceArray 等数组类型会落入标量情况,并且如果它们只有一个元素,则恰好与标量正确比较。在 6.2.0 之后,这些类型开始失败,因为它们既没有继承自标准 Python 数字层次结构,也没有继承自 numpy.ndarray

    approx 现在会将参数转换为 numpy.ndarray,如果它们公开数组协议且不是标量。这会将类似数组的对象视为 numpy 数组,无论大小如何。

pytest 6.2.0 (2020-12-12)

重大变更

  • #7808: pytest 现在仅支持 python3.6+。

弃用

  • #7469: 直接构造/调用以下类/函数现已弃用

    • _pytest.cacheprovider.Cache

    • _pytest.cacheprovider.Cache.for_config()

    • _pytest.cacheprovider.Cache.clear_cache()

    • _pytest.cacheprovider.Cache.cache_dir_from_config()

    • _pytest.capture.CaptureFixture

    • _pytest.fixtures.FixtureRequest

    • _pytest.fixtures.SubRequest

    • _pytest.logging.LogCaptureFixture

    • _pytest.pytester.Pytester

    • _pytest.pytester.Testdir

    • _pytest.recwarn.WarningsRecorder

    • _pytest.recwarn.WarningsChecker

    • _pytest.tmpdir.TempPathFactory

    • _pytest.tmpdir.TempdirFactory

    这些一直被认为是私有的,但现在会发出弃用警告,这在 pytest 8.0.0 中可能会成为硬错误。

  • #7530: --strict 命令行选项已弃用,请改用 --strict-markers

    我们计划未来重新引入 --strict 并使其成为所有严格性相关选项(目前是 --strict-markers--strict-config,未来可能会引入更多)的综合标志。

  • #7988: @pytest.yield_fixture 装饰器/函数现已弃用。请改用 pytest.fixture()

    yield_fixture 长期以来一直是 fixture 的别名,因此可以安全地搜索/替换。

特性

  • #5299: pytest 现在会警告在 Python>=3.8 的测试中发生的不可引发异常和未处理的线程异常。有关更多信息,请参阅 关于不可引发异常和未处理线程异常的警告

  • #7425: 新增 pytester fixture,它与 testdir 相同,但其方法在适当的时候返回 pathlib.Path 而不是 py.path.local

    这是内部使用 pathlib.Path 对象的一部分,以便将来移除对 py 的依赖。

    在内部,旧的 pytest.Testdir 现在是 Pytester 的一个薄包装器,保留了旧的接口。

  • #7695: 添加了一个新的钩子 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: 为从 pytester.run_pytest().stdout 等返回的 LineMatcher 类添加了 __str__ 实现。它返回整个输出,就像现有的 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 中引入)现在被适当地调用。

Bug 修复

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

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

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

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

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

  • #7981: 修复了在收集过程中未跟随符号链接目录的问题。该问题在 pytest 6.1.0 中回归。

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

改进的文档

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

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

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

  • #7878: 在 pull request 部分,要求在编辑变更日志和作者文件后提交。

琐碎/内部更改

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

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

pytest 6.1.2 (2020-10-28)

Bug 修复

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

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

改进的文档

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

pytest 6.1.1 (2020-10-03)

Bug 修复

  • #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 的特殊语法 -k '-expr' 已弃用。请改用 -k 'not expr'

    -k 的特殊语法 -k 'expr:' 已弃用。如果您使用此功能并需要替代品,请提出一个问题。

  • #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: pylint 不再应该抱怨从 File 继承时未实现抽象方法。

  • #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: 将空 help 值传递给 Parser.add_option 现在被接受,而不是在运行 pytest --help 时崩溃。传递 None 会引发更具信息性的 TypeError

  • #7558: 修复了 pylint 在 pytest.mark.parametrize() 和其他内置标记(skipskipifxfailusefixturesfilterwarnings)上出现的 not-callable lint 问题。

  • #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 标记何时可以将 fixture 应用于测试。

  • #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 中引入的用于当前目录和收集期间解析符号链接是一个错误修复,但它实际上是一个新功能,在 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 至少 10 年没有触发此钩子。

  • #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 的特殊语法 -k '-expr' 已弃用。请改用 -k 'not expr'

    -k 的特殊语法 -k 'expr:' 已弃用。如果您使用此功能并需要替代品,请提出一个问题。

  • #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 命令现在会抑制当 pytest 的输出被管道传输且管道被接收程序关闭时(常见的例子是 lesshead)打印到 stderr 的 BrokenPipeError 错误消息。

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

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

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

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

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

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

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

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

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

  • #7091: 当通过 --capture=fdcapfdcapfdbinary fixtures 使用 fd 捕获,并且文件描述符(0、1、2)无法复制时,FD 捕获仍会执行。以前,在这种情况下,直接写入文件描述符会失败或丢失。

  • #7119: 如果 --basetemp 参数为空、是当前工作目录或其父目录之一,则以错误退出。这样做是为了防止意外数据丢失,因为传递给此参数的任何目录都将被清除。

  • #7128: pytest --version 现在只显示 pytest 版本,而 pytest --version --version 则显示更详细的信息,包括插件。这与其他工具显示 --version 的方式更加一致。

  • #7133: caplog.set_level() 现在将覆盖通过 CLI 或配置文件设置的任何 log_level

  • #7159: caplog.set_level()caplog.at_level() 不再影响“捕获的日志报告”部分中显示的日志级别。

  • #7348: 改进了数据类/属性上的比较断言的递归差异报告。

  • #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: 防止在调用 eval() 的标记表达式 (-m) 引发任何异常时崩溃,并提供用户友好的错误。

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

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

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

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

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

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

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

    最初更改的目的是消除预期为非预期/令人惊讶的行为,但事实证明许多人依赖它,因此该限制已被恢复。

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

  • #6924: 确保 unittest.IsolatedAsyncioTestCase 确实被等待。

  • #6925: 修复 TerminalRepr 实例,使其再次可哈希。

  • #6947: 修复了使用 unittest.TestCase.addCleanup() 注册的函数在测试失败时未被调用的回归问题。

  • #6951: 允许用户仍设置已弃用的 TerminalReporter.writer 属性。

  • #6956: 防止 pytest 将 ConftestImportFailure 追溯打印到标准输出。

  • #6991: 修复了 pytest 5.4 以来 --lf 过滤过多导致的回归问题。

  • #6992: 撤销“tmpdir: clean up indirection via config for factories”#6767,因为它会破坏 pytest-xdist。

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

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

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

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

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

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

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

  • #7180: 修复了与 locale 编码不同的文件的 _is_setup_py

  • #7215: 修复了当使用 --pdb 运行时,对于跳过的测试会调用 unittest.TestCase.tearDown() 的回归问题。

  • #7253: 当直接在函数上使用 pytest.fixture 时,例如 pytest.fixture(func),如果同时传递了 autouseparams 参数,函数不再被忽略,而是被标记为 fixture。

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

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

改进的文档

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

  • #7233: 添加关于 --strict--strict-markers 以及更倾向于后者的一条注释。

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

琐碎/内部更改

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

  • #7264: 已移除对 wcwidth 包的依赖。

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

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

  • #7356: 移除旧版 pytest-xdist 中弃用的“slave”一词的最后内部用法。

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

pytest 5.4.3 (2020-06-02)

Bug 修复

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

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

  • #6956: 防止 pytest 将 ConftestImportFailure 追溯打印到标准输出。

  • #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: 修复了与 locale 编码不同的文件的 _is_setup_py

pytest 5.4.1 (2020-03-13)

Bug 修复

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

    最初更改的目的是消除预期为非预期/令人惊讶的行为,但事实证明许多人依赖它,因此该限制已被恢复。

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

pytest 5.4.0 (2020-03-12)

重大更改

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

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

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

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

    此钩子已被标记为弃用,并且 pytest 已经超过 10 年没有调用过它。

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

  • #6737: FixtureDefcached_result 属性现在在结果不可用时设置为 None,而不是被删除。

    如果您的插件执行诸如 hasattr(fixturedef, 'cached_result') 之类的检查,例如在 pytest_fixture_post_finalizer 钩子实现中,请将其替换为 fixturedef.cached_result is not None。如果您 del 属性,请将其设置为 None

弃用

  • #3238: 选项 --no-print-logs 已弃用,并将在未来版本中移除。如果您使用 --no-print-logs,请尝试 --show-capture 并提供反馈。

    --show-capture 命令行选项在 pytest 3.5.0 中添加,允许指定在测试失败时如何显示捕获的输出:nostdoutstderrlogall(默认)。

  • #571: 弃用未使用/损坏的 pytest_collect_directory 钩子。自 2010 年移除 Directory 收集器以来,它一直不一致,并且一旦收集与测试执行分离,就变得不正确/不可用。

  • #5975: 弃用直接使用 Nodes 构造函数。

    相反,它们现在通过 Node.from_parent 构造。

    这种过渡机制使我们能够通过强制执行更受控制的创建/配置模式来解开非常紧密缠绕的 Node 关系。

    作为此更改的一部分,会话/配置参数已被禁止,并且随着我们深入研究细节,我们可能还需要禁止更多参数。

    如果子类打算扩展 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 现在适用于单元测试。

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

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

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

  • #5991: 修复了 --pdb 和单元测试的交互:不使用 unittest 的 TestCase.debug()

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

    大写变体从未被记录,首选形式应为小写。

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

  • #6454: --disable-warnings 适用于 -ra-rA

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

    构造 if key == cached_key: 可能会失败,原因要么是明确禁止 ==,要么是(例如 NumPy 数组)a == b 的结果通常无法转换为 bool。已实现的修复将 == 替换为 is

  • #6557: 使捕获的输出流 .write() 方法返回与原始流相同的返回值。

  • #6566: 修复 EncodedFile.writelines 以调用底层缓冲区的 writelines 方法。

  • #6575: 修复了当 faulthandler 启动时已初始化(例如设置了 PYTHONFAULTHANDLER=1 环境变量)并且配置文件中定义了 faulthandler_timeout 时发生的内部崩溃。

  • #6597: 修复包含参数化空字符串变量的节点 ID。

  • #6646: 为当前项目(重新)存储断言重写钩子,这修复了它们在例如 pytester 的 testdir.runpytest 等之后仍被使用的问题。

  • #6660: pytest.exit() 在从 pytest_sessionfinish 钩子发出时得到处理。这包括从调试器中退出。

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

  • #6801: 在 doctests 中对于意外异常的追溯之间不显示空行。

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

改进的文档

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

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

琐碎/内部更改

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

pytest 5.3.5 (2020-01-29)

Bug 修复

  • #6517: 修复了 pytest 5.3.4 中由于断言错误导致的 INTERNALERROR 回归问题。

pytest 5.3.4 (2020-01-20)

Bug 修复

  • #6496: 恢复 #6436:不幸的是,此更改在许多套件中导致了多项回归,因此团队决定恢复此更改并发布新版本,同时继续寻找解决方案。

pytest 5.3.3 (2020-01-16)

Bug 修复

  • #2780: 使用 -rP 时显示 teardown 期间捕获的输出。

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

  • #6436: FixtureDef 对象现在会正确地向在其之前执行的 fixture 栈中的 autouse 和参数化 fixture 注册其终结器,以便它们在正确的时间和顺序被销毁。

  • #6532: 修复了使用 testdir 结果解析包含多个错误的输出(5.3.0 中的回归)。

琐碎/内部更改

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

pytest 5.3.2 (2019-12-13)

改进

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

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

Bug 修复

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

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

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

pytest 5.3.1 (2019-11-25)

改进

Bug 修复

pytest 5.3.0 (2019-11-19)

弃用

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

    为了平滑过渡,如果命令行中给出了 --junitxml 选项但在 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: ExceptionInfo 对象的 repr 已改进,以遵守底层异常的 __repr__ 方法。

  • #5936: 使用 -vv 显示未截断的断言消息。

  • #5990: 修复了测试摘要中的单复数不匹配问题(例如,显示“1 error”而不是“1 errors”)。

  • #6008: Config.InvocationParams.args 现在始终是一个 tuple,以更好地传达它应该不可变并避免意外修改。

  • #6023: pytest.main 现在返回一个 pytest.ExitCode 实例,除非使用了自定义退出代码(在这种情况下它仍然返回 int)。

  • #6026: 对齐 pytester 的 LineMatcher 输出中的前缀。

  • #6059: 收集错误在终端的简短测试摘要中报告为错误(而不是像以前那样报告为失败)。

  • #6069: pytester.spawn 不再无条件地跳过/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 的鲁棒性和性能。

Bug 修复

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

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

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

    这在与 pytesterrunpytest_inprocess 一起使用时非常重要。

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

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

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

琐碎/内部更改

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

pytest 5.2.4 (2019-11-15)

错误修复

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

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

pytest 5.2.3 (2019-11-14)

错误修复

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

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

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

pytest 5.2.2 (2019-10-24)

错误修复

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

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

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

  • #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 参数现在可以是一个可调用对象,它接收 fixture 名称和 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: 修复了在插件类中定义的函数范围 fixture 中的 self 引用:以前 self 会引用一个 测试 类,而不是 插件 类。

  • #570: 修复了长期存在的问题,即在参数化期间使用间接 fixture 时未遵守 fixture 范围。

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

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

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

pytest 5.1.1 (2019-08-20)

错误修复

  • #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 现在是 fixture 的保留名称。

    有关更多信息,请查阅文档中的 弃用和移除 部分。

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

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

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

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

  • #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 不会删除包含只读文件的目录的问题,这可能导致 pytest 在第二次使用 --basetemp 选项执行时崩溃。

  • #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 自己的测试套件根据模式进行验证,以避免未来的回归。

  • #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 认为它明确时,但这可能由于插件选项的延迟解析而导致不正确。例如,请参见问题 #1149#3413#4009

  • #5402: PytestDeprecationWarning 现在默认是错误。

    根据我们以尽可能少的干扰移除弃用功能的计划,所有 PytestDeprecationWarning 类型的警告现在都会生成错误而不是警告消息。

    受影响的功能将在 pytest 5.1 中有效移除,因此请参阅文档中的弃用和移除部分,了解如何更新现有代码。

    在 pytest 5.0.X 系列中,可以通过在 pytest.ini 文件中添加以下内容,将错误改回警告作为权宜之计。

    [pytest]
    filterwarnings =
        ignore::pytest.PytestDeprecationWarning
    

    但这将在 pytest 5.1 发布时停止工作。

    如果您对某个特定功能的移除有顾虑,请在 #5402 中添加评论。

  • #5412: ExceptionInfo 对象(由 pytest.raises 返回)现在具有与 repr 相同的 str 表示形式,这避免了用户使用 print(e) 检查对象时的一些困惑。

    这意味着如下代码

    with pytest.raises(SomeException) as e:
        ...
    assert "some message" in str(e)
    

    需要更改为

    with pytest.raises(SomeException) as e:
        ...
    assert "some message" in str(e.value)
    

弃用

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

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

功能

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

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

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

    此功能是通过将外部 pytest-faulthandler 插件集成到核心中提供的,因此用户如果使用了该插件,应将其从其要求中移除。

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

  • #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: 修复 #5063importlib_metadata.PathDistribution 的回归,其 files 属性为 None

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

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

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

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

  • #5444: 修复了当命令行上提供的第一个文件无法收集时 --stepwise 模式的问题。

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

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

改进的文档

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

  • #5416: 修复了运行/跳过示例中的 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 块分支。

    修复方法是在 if 块级联之前设置 letter 的初始值,以便它始终具有一个值。

pytest 4.6.10 (2020-05-08)

功能

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

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

琐碎/内部更改

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

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 版本仍然可以接收 colorama 更新。

pytest 4.6.7 (2019-12-05)

错误修复

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

  • #6044: 正确忽略尝试删除旧临时目录时可能出现的 FileNotFoundError (OSError.errno == NOENT 在 Python 2 中) 异常,例如当多个进程尝试删除同一目录时(例如 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 不会删除包含只读文件的目录的问题,这可能导致 pytest 在第二次使用 --basetemp 选项执行时崩溃。

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

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

pytest 4.6.4 (2019-06-28)

错误修复

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

  • #5444: 修复了当命令行上提供的第一个文件无法收集时 --stepwise 模式的问题。

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

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

pytest 4.6.3 (2019-06-11)

错误修复

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

  • #5389: 修复 #5063importlib_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 选项的输出已得到改进。

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

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

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

错误修复

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

  • #4908: pytest_enter_pdb 钩子会使用事后调试(--pdb)调用。

  • #5036: 修复了依赖于其他参数化 fixture 的 fixture 会被错误地参数化的问题。

  • #5256: 处理由于单个替代 Unicode 字符在 Jython 中无法表示而导致的内部错误。

  • #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 (run-last-failure) 的报告。

  • #5035: --cache-show 选项/操作接受可选的 glob 以仅显示匹配的缓存条目。

  • #5059: 标准输入(stdin)可以传递给 pytester 的 Testdir.run()Testdir.popen()

  • #5068: -r 选项现在支持 A,以在简短测试摘要中显示所有报告(包括通过的报告)。

  • #5108: 简短测试摘要在通过输出(-rP)后显示。

  • #5172: --last-failed (--lf) 选项变得更智能,现在如果测试文件的所有测试在以前的运行中都已通过,它将跳过整个文件,大大加快了收集速度。

  • #5177: 引入新的特定警告 PytestWarning 子类,以便更容易根据类而不是消息过滤警告。新的子类是

    • PytestAssertRewriteWarning

    • PytestCacheWarning

    • PytestCollectionWarning

    • PytestConfigWarning

    • PytestUnhandledCoroutineWarning

    • PytestUnknownMarkWarning

  • #5202: 新增 record_testsuite_property 会话范围 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 现在也显示函数范围以外的 fixture 范围。

错误修复

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

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

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

改进的文档

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

琐碎/内部更改

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

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

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

  • #5069: 终端中的简短测试摘要代码已移至终端插件。

  • #5082: 改进了 pytester 插件中各种方法的 kwargs 验证。

  • #5202: record_property 现在在使用 junit_family=xunit2 时发出 PytestWarning:该 fixture 生成的 property 标签作为 testcase 的子标签,根据最新的 schema 是不允许的。

  • #5239: 将 pluggy 限制为 < 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 选项现在通过模块属性处理类(例如 pdb:pdb.Pdbpdbpp),并且其验证得到了改进。

  • #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: 仅通过 fixture (capsys, capfs) 与 pdb.set_trace() 进行捕获时,输出捕获得到正确处理。

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

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

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

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

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

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

错误修复

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

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

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

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

  • #4957: -p no:plugin 现在可以正确处理默认(内部)插件,例如 -p no:capture

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

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

  • #4975: 修复了 -qq 选项的解释,之前它被视为 -v

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

  • #4988: 在会话结束时显式关闭日志记录的文件处理器。

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

改进的文档

  • #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 的替代品来序列化和自定义报告。

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

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

  • #4987: Collector.repr_failure 遵守 --tb 选项,但现在仅默认为 short (与 auto 一起)。

pytest 4.3.1 (2019-03-11)

错误修复

  • #4810: pytest_runtest_logreport() 中的日志消息现在已正确捕获并显示。

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

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

琐碎/内部更改

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

pytest 4.3.0 (2019-02-16)

弃用

  • #4724: pytest.warns() 现在在接收到未知关键字参数时发出警告。

    这将来会更改为错误。

功能

  • #2753: argparse 的使用错误被映射到 pytest 的 UsageError

  • #3711: 添加 --ignore-glob 参数以使用 Unix shell 风格的通配符排除测试模块。为 conftest.py 添加 collect_ignore_glob 以使用 Unix shell 风格的通配符排除测试模块。

  • #4698: 关于 pytest 5.0 不再支持 Python 2.7 和 3.4 的警告已移除。

    最终认为它弊大于利,并且这些 Python 版本的用户不应遇到问题,因为 pip 不会在这些解释器上安装 pytest 5.0。

  • #4707: 借助新的 set_log_path() 方法,现在可以通过钩子设置 log_file 路径。

错误修复

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

  • #4782: 修复了收集包含包的损坏符号链接时出现的 AssertionError

pytest 4.2.1 (2019-02-12)

错误修复

  • #2895: pytest_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标志时,也会显示*selected*测试的数量。

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

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

Bug修复

  • #3547: --junitxml可以发出与Jenkins xUnit兼容的XML。junit_familyINI选项接受legacy|xunit1,它生成旧式输出,以及xunit2,它更严格地遵循https://github.com/jenkinsci/xunit-plugin/blob/xunit-2.3.2/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd

  • #4280: 改进从pdb退出,特别是使用--trace时。

    pdb.set_trace()后使用q[quit]也将退出pytest。

  • #4402: 警告摘要现在按消息而不是按测试ID分组。

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

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

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

  • #4653: tmp_path fixture和其他相关fixture提供已解析的路径(又称真实路径)。

  • #4667: pytest_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.asscalarnumpy 1.16.中已被弃用

  • #4657: 从pylib复制saferepr

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

pytest 4.1.1 (2019-01-12)

Bug修复

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

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

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

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

改进的文档

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

琐碎/内部更改

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

pytest 4.1.0 (2019-01-05)

移除

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

  • #3078: 移除旧版内部警告系统:config.warn, Node.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的部分一直以来都是冲突和错误的来源。

    请注意,对于pytest.initox.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

特性

  • #3191: 现在当对None进行断言时会发出警告。

    这是新用户常见的困惑来源,他们会写

    assert mocked_object.assert_called_with(3, 4, 5, key="value")
    

    当他们应该写

    mocked_object.assert_called_with(3, 4, 5, key="value")
    

    因为mock对象的assert_called_with方法已经执行了断言。

    当明确检查None时,此警告不会发出。像

    assert variable is None
    

    这样的断言不会发出警告。

  • #3632: 对于使用attrsdataclasses(Python 3.7+,已回溯到 3.6)创建的对象,在AssertionError上进行更丰富的相等比较内省。

  • #4278: CACHEDIR.TAG文件现在在缓存目录中创建。

    这些文件是缓存目录标签标准的一部分,备份或同步程序可以使用它们来识别pytest的缓存目录。

  • #4292: pytest.outcomes.Exit派生自SystemExit而不是KeyboardInterrupt。这使我们能够更好地处理pdb退出。

  • #4371: 更新了--collect-only选项,以便在使用--verbose运行时显示测试描述。

  • #4386: 重构了ExceptionInfo对象的构建,并确保不完整的实例具有repr/str

  • #4416: pdb: 增加了对带关键字参数的pdb.set_trace的支持。

    它处理header与Python 3.7类似,并将任何其他关键字参数转发给Pdb构造函数。

    这允许__import__("pdb").set_trace(skip=["foo.*"])

  • #4483: 添加了ini参数junit_duration_report,用于可选地报告测试调用持续时间,不包括设置和拆卸时间。

    JUnit XML规范和pytest默认行为是包含设置和拆卸时间在测试持续时间报告中。您可以通过将此添加到pytest.ini文件来仅包含调用持续时间(不包括设置和拆卸)。

    [pytest]
    junit_duration_report = call
    
  • #4532: -ra现在将最后显示错误和失败,而不是作为摘要中的第一项。

    这使得获取错误和失败列表以有选择地运行测试变得更容易。

  • #4599: pytest.importorskip现在支持reason参数,当请求的模块无法导入时会显示该参数。

Bug修复

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

  • #4327: approx再次适用于更通用的容器,更精确地说是IterableSized的实例,而不是更严格的Sequence

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

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

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

改进的文档

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

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

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

琐碎/内部更改

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

    已决定在下一次主要修订中移除此功能。

pytest 4.0.2 (2018-12-13)

Bug修复

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

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

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

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

改进的文档

  • #1495: 记录常见的doctest fixture目录树结构陷阱

pytest 4.0.1 (2018-11-23)

Bug修复

  • #3952: 再次在“简短测试摘要信息”之前显示警告,但最终仍然显示后来的警告。

  • #4386: 处理repr/str中未初始化的异常信息。

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

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

  • #4405: 修复使用--pyargs时testpaths的收集问题。

  • #4412: 修复涉及Starred + 副作用的断言重写问题。

  • #4425: 确保当给定的--basetemp是相对路径时,我们解析绝对路径。

琐碎/内部更改

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

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

pytest 4.0.0 (2018-11-13)

移除

  • #3737: RemovedInPytest4Warnings现在默认为错误。

    按照我们尽可能减少干扰地移除已弃用功能的计划,所有类型为RemovedInPytest4Warnings的警告现在都会生成错误而不是警告消息。

    受影响的功能将在pytest 4.1中正式移除,因此请查阅文档中的弃用和移除部分,了解如何更新现有代码。

    在pytest 4.0.X系列中,可以通过在pytest.ini文件中添加以下内容,将错误改回警告,作为权宜之计:

    [pytest]
    filterwarnings =
        ignore::pytest.RemovedInPytest4Warning
    

    但这将在pytest 4.1发布时停止工作。

    如果您对移除特定功能有疑虑,请在#4348中添加评论。

  • #4358: 移除::()表示法,该表示法用于在节点ID中表示测试类实例。

    以前,包含测试实例的节点ID会使用::()来表示实例,如下所示

    test_foo.py::Test::()::test_bar
    

    额外的::()让大多数用户感到困惑,因此已被移除,现在测试ID变为

    test_foo.py::Test::test_bar
    

    这项更改无法像用户面向功能更改时通常那样伴随弃用期,因为它实际上无法检测功能何时被明确使用。

    额外的::()可能已经在内部某些地方被移除,这导致在预期它的地方(例如--deselect (#4127))造成困惑。

    测试类实例也不再与--collect-only一起列出。

特性

  • #4270: cache_dir选项使用$TOX_ENV_DIR作为前缀(如果在环境中设置)。

    默认情况下,这将为每个tox环境使用不同的缓存。

Bug修复

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

pytest 3.10.1 (2018-11-11)

Bug修复

  • #4287: 修复调试插件(pdb)的嵌套使用,例如与pytester的testdir.runpytest一起使用。

  • #4304: 如果cacheprovider也被阻塞,则阻塞stepwise插件,因为一个依赖于另一个。

  • #4306: 将minversion解析为实际版本,而不是点分隔的字符串。

  • #4310: 修复由于多个参数匹配同一包而导致的重复收集问题。

  • #4321: 修复具有解析符号链接的item.nodeid

  • #4325: 修复直接符号链接文件的收集问题,其中目标不匹配python_files

  • #4329: 修复_collect_report_last_write导致的report_collect中的TypeError。

琐碎/内部更改

  • #4305: 在test_capture中用Python级别语法替换字节/unicode助手。

pytest 3.10.0 (2018-11-03)

特性

  • #2619: 在__import__("pdb").set_trace()中使用continue后恢复输出捕获。

    这还添加了一个新的pytest_leave_pdb钩子,并将pdb传递给现有的pytest_enter_pdb钩子。

  • #4147: 添加--sw, --stepwise作为--lf -x的替代方案,用于在第一次失败时停止,但在该测试之后开始下一次测试调用。更多信息请参见文档

  • #4188: 当未在详细模式下运行时,使--color发出彩色点。之前,它只在同时传递--verbose时才对逐个测试的输出进行着色。

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

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

Bug修复

  • #2701: 修复虚假的RemovedInPytest4Warning: usage of Session... is deprecated, please use pytest警告。

  • #4046: 修复在包__init__.py文件中运行测试的问题。

  • #4260: 在匿名编译源代码期间抑制警告。

  • #4262: 修复删除由tmpdir / tmp_path创建的过时目录时的访问被拒绝错误。

  • #611: 将fixture命名为request现在将引发警告:requestfixture是内部的,不应被覆盖,因为它会导致内部错误。

  • #4266: 处理(忽略)在收集过程中引发的异常,例如与Django的LazySettings代理类一起使用时。

改进的文档

  • #4255: 添加了关于传递给filter warnings的模块名称未进行正则表达式转义的缺失文档。

琐碎/内部更改

  • #4272: 在非详细模式下,如果非默认,也显示cachedir。

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

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

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

pytest 3.9.3 (2018-10-27)

Bug修复

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

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

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

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

改进的文档

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

琐碎/内部更改

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

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

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

pytest 3.9.2 (2018-10-22)

Bug修复

  • #2909: 改进检测到fixture之间递归依赖时的错误消息。

  • #3340: 修复在钩子pytest_sessionstart()pytest_sessionfinish()中不显示日志消息的问题。

  • #3533: 修复JUnit报告中跳过测试的未转义XML原始对象

  • #3691: Python 2: 安全地格式化关于将unicode字符串传递给warnings.warn的警告消息,这可能会在猴子补丁warnings.warn本身时导致意外的MemoryError异常。

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

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

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

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

pytest 3.9.1 (2018-10-16)

特性

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

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

弃用

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

    • 通过Node实例访问ModuleFunctionClassInstanceFileItem。现在用户会看到此警告

      usage of Function.Module is deprecated, please use pytest.Module instead
      

      用户应该只需 import pytest 并使用 pytest 模块访问这些对象。

    • request.cached_setup,这是为fixture提供的设置/拆卸机制的前身。您可以查阅文档中的funcarg比较部分

    • 使用名为"Class"的对象作为自定义在Collector子类中收集的节点类型的方式已被弃用。用户应改用pytest_collect_make_item在收集期间自定义节点类型。

      此问题应仅影响创建新收集类型的高级插件,因此如果您看到此警告消息,请联系作者以便他们更改代码。

    • 生成以下消息的警告已更改为RemovedInPytest4Warning

      getfuncargvalue is deprecated, use getfixturevalue
      
  • #3988: 为pytest.ensuretemp添加弃用警告,因为它已弃用一段时间了。

特性

  • #2293: 改进使用错误消息,通过隐藏可能分散注意力和冗余的内部细节。

    这带来的副作用是,以前引发通用错误(例如未注册标记的ValueError)的一些错误条件现在引发Failed异常。

  • #3332: 改进导入conftest.py文件失败时显示的错误信息。

    为了实现这一点,在ExceptionInfo.getrepr中添加了一个新的chain参数,用于在Python 3中显示或隐藏链式回溯(默认为True)。

  • #3849: 添加empty_parameter_set_mark=fail_at_collectini选项,用于在参数化收集空集时引发异常。

  • #3964: 在收集阶段生成的日志消息在启用实时日志记录和/或记录到文件时显示。

  • #3985: 引入tmp_path作为一个提供Path对象的fixture。同时引入tmp_path_factory作为一个会话范围的fixture,用于从任何其他fixture或测试创建任意临时目录。

  • #4013: 即使您自己自定义了警告过滤器,现在也会显示弃用警告。在以前的版本中,任何自定义都会覆盖pytest的过滤器,弃用警告将默认隐藏。

  • #4073: 允许为Testdir.runpytest_subprocess()Testdir.run()指定超时。

  • #4098: 为pytest.exit()添加returncode参数,以特定的返回码退出pytest。

  • #4102: 使用pytest.warns重新实现了pytest.deprecated_call,使其支持match='...'关键字参数。

    这带来的副作用是pytest.deprecated_call现在引发pytest.fail.Exception而不是AssertionError

  • #4149: 要求setuptools>=30.3并将大部分元数据移至setup.cfg

Bug修复

  • #2535: 改进了unittest.TestCase子类的测试函数使用参数化fixture时的错误消息。

  • #3057: request.fixturenames现在正确返回由request.getfixturevalue()创建的fixture的名称。

  • #3946: 使用-W作为命令行选项传递的警告过滤器现在优先于ini配置文件中定义的过滤器。

  • #4066: 通过直接使用textwrap.dedent修复源重新缩进的问题。

  • #4102: 在Python 2中,pytest.warn将捕获之前已警告的警告。以前它们从未被引发过。

  • #4108: 解析参数的符号链接。

    这修复了运行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: 将tempir测试示例添加到CONTRIBUTING.rst指南

琐碎/内部更改

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

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

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

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

pytest 3.8.2 (2018-10-02)

弃用和移除

  • #4036: pytest_warning_captured钩子的item参数现在被标记为已弃用。我们意识到在3.8发布之后,这个参数与pytest-xdist不兼容。

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

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

Bug修复

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

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

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

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

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

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

    在Python 2中,向os.environ添加unicode键会导致subprocess(以及可能其他模块)出现问题,这使得这是一个特别容易与from __future__ import unicode_literals一起使用的微妙错误。

改进的文档

  • #3928: 在文档中添加了fixture作用域的可能值。

pytest 3.8.1 (2018-09-22)

Bug修复

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

  • #3749: 修复了包内测试收集期间出现的以下错误

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

  • #3973: 修复了如果测试更改了当前工作目录而未恢复它,断言重写器会崩溃的错误。

  • #3998: 修复了当使用--pdb进入调试器时,某些caplog属性(例如record_tuples)不可用的问题。

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

改进的文档

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

琐碎/内部更改

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

  • #3975: 删除了围绕im_func的旧代码,因为那只是python2专用。

pytest 3.8.0 (2018-09-05)

弃用和移除

  • #2452: Config.warnNode.warn已被弃用,请参阅Config.warn和Node.warn了解原理和示例。

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

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

特性

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

    有关详细信息,请参阅文档

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

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

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

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

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

错误修复

  • #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 特定的代码在 doctests 中使用 capturemanager 插件的问题。

改进文档

  • #3902: 修复 pytest.org 链接

pytest 3.7.3 (2018-08-26)

错误修复

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

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

  • #3796: 修复连续子包的夹具拆卸在外部包结束时执行一次的问题。

  • #3816: 修复 --show-capture=no 选项仍然显示在夹具拆卸期间打印的日志的错误。

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

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

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

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

改进文档

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

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

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

琐碎/内部更改

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

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

pytest 3.7.2 (2018-08-16)

错误修复

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

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

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

  • #3774: 修复装饰过的夹具会丢失功能(例如 @mock.patch)的错误。

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

  • #3788: 修复 TestCase 子类在 __init__ 期间引发异常时在拆卸期间出现的 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: 修复了插件与夹具函数直接调用时发出的警告代码之间的兼容性问题。

  • #3748: 修复了 numpy<1.13pytest.approx 数组的无限递归问题。

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

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

pytest 3.7.0 (2018-07-30)

弃用和移除

  • #2639: pytest_namespace 已被弃用

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

功能

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

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

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

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

  • #3623: 引入 pytester.copy_example 作为对项目示例进行验收测试的辅助工具。

错误修复

  • #2220: 修复了一个错误,即被直接参数(例如参数化)覆盖的夹具即使未被测试使用也会被实例化。

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

错误修复

  • 使用 -mpytest 调用 pytest,这样 sys.path 不会被 site-packages 中安装的包污染。 (#742)

改进文档

  • 在夹具文档中使用 smtp_connection 而不是 smtp,以避免可能的混淆。 (#3592)

琐碎/内部更改

  • 移除废弃的 __future__ 导入。 (#2319)

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

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

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

pytest 3.6.3 (2018-07-04)

错误修复

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

  • 修复 pytest.approx 处理 0 维 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)

错误修复

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

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

  • 当前面范围的终结器引发异常时,继续调用堆栈中的终结器。 (#3569)

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

改进文档

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

琐碎/内部更改

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

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

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

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

pytest 3.6.1 (2018-06-05)

错误修复

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

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

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

改进文档

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

琐碎/内部更改

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

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

  • 修复测试中的 if 语句以支持 3.7.0b5,其中 AST 中的文档字符串处理被恢复。 (#3530)

  • 移除一些 Python 2.5 兼容代码。 (#3529)

pytest 3.6.0 (2018-05-23)

功能

  • 重构 pytest.mark 内部实现,采用正确的每个节点处理方式,修复了旧设计导致的许多长期存在的错误。这引入了新的 Node.iter_markers(name)Node.get_closest_marker(name) API。强烈建议用户阅读文档中关于重构原因,或者直接了解更新现有代码以使用新 API 的详细信息。 (#3317)

  • 现在,当 @pytest.fixture 多次应用于同一函数时,会引发 ValueError。这种有缺陷的行为会导致意想不到的问题,如果某个测试套件能正常工作,那大多是偶然的。 (#2334)

  • 支持 Python 3.7 的内置 breakpoint() 方法,有关详细信息,请参阅使用内置断点函数。 (#3180)

  • monkeypatch 现在支持 context() 函数,它充当上下文管理器,撤销 with 块内进行的所有打补丁操作。 (#3290)

  • --pdb 选项现在使 KeyboardInterrupt 进入调试器,而不是停止测试会话。在 python 2.7 上,再次按下 CTRL+C 退出调试器。在 python 3.2 及更高版本上,使用 CTRL+D。 (#3299)

  • log-level 参数的数值大于根记录器级别的值时,pytest 不再更改根记录器的日志级别,这使得它与用户代码中的自定义日志配置更好地配合。 (#3307)

错误修复

  • 希望已经解决了 Windows 上可能导致 .pyc 文件损坏的罕见竞态条件。 (#3008)

  • 在从 cli 发现标记表达式的标记时也使用 iter_marker,以避免旧式标记存储中的错误数据。 (#3441)

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

改进文档

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

琐碎/内部更改

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

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

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

  • _pytest.compat 导入 MappingSequence,而不是直接从 collections 导入到 python_api.py::approx 中。将 Mapping 添加到 _pytest.compat,在 python 2 上从 collections 导入,但在 Python 3.7 或更高版本上从 collections.abc 导入,以避免在 Python 3.7 或更高版本上出现 DeprecationWarning。 (#3497)

pytest 3.5.1 (2018-04-23)

错误修复

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

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

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

改进文档

  • 修复 caplog 夹具文档中的拼写错误,该文档错误地将某些属性识别为方法。 (#3406)

琐碎/内部更改

  • 当参数化函数接受默认值时,添加了更具指示性的错误消息。 (#3221)

  • 移除内部 _pytest.terminal.flatten 函数,转而使用 more_itertools.collapse。 (#3330)

  • collections.abc 而不是 collections 导入一些模块,因为前者在 Python 3.7 中会触发 DeprecationWarning。 (#3339)

  • record_property 不再是实验性的,忘记移除警告了。 (#3360)

  • 在文档和 CLI 帮助中提及,只有在添加 -v 选项时,pytest --fixtures 才会打印以 _ 开头的夹具。 (#3398)

pytest 3.5.0 (2018-03-21)

弃用和移除

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

  • 在非顶层 conftest.py 文件中定义 pytest_plugins 现已弃用,因为它们会“泄漏”到整个目录树。有关此决定的理由,请参阅文档 (#3084)

功能

  • 新的 --show-capture 命令行选项,允许指定在测试失败时如何显示捕获的输出:nostdoutstderrlogall(默认)。 (#1478)

  • 新的 --rootdir 命令行选项,用于覆盖发现根目录的规则。有关详细信息,请参阅文档中的自定义。 (#1642)

  • 夹具现在根据其作用域进行实例化,作用域更高的夹具(例如 session)会比作用域较低的夹具(例如 function)更早实例化。相同作用域的夹具的相对顺序保持不变,基于它们的声明顺序和依赖关系。 (#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 命令行选项,使 doctests 能够显示每个代码片段的多个失败,而不是在第一次失败时停止。 (#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)

错误修复

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

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

  • 在测试收集期间,当不允许读取 stdin 时,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 中调用夹具时的 python 示例 (#3308)

pytest 3.4.2 (2018-03-04)

错误修复

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

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

  • 修复与 Decimal 值一起使用 approx 时出现的 TypeError 问题。 (#3247)

  • 修复使用 request 夹具时产生的引用循环。 (#3249)

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

改进文档

  • 将日志插件添加到插件列表。 (#3209)

琐碎/内部更改

  • 修复 fixture.rst 中的一个小拼写错误 (#3259)

pytest 3.4.1 (2018-02-20)

错误修复

  • doctest.UnexpectedException 的导入移至顶层,以避免在使用 --pdb 时可能出现的错误。 (#1810)

  • 添加了在进入 pdb 之前打印捕获的 stdout/stderr 的功能,并改进了一个给出关于输出捕获的假阴性的测试。 (#3052)

  • 修复了使用参数化夹具的测试排序问题,这可能导致夹具创建次数超出必要。 (#3161)

  • 修复了在“测试运行”钩子之外的钩子中发生的日志记录会导致内部错误的错误。 (#3184)

  • 当安装并导入 pypi mock.patch 时,正确检测由 unittest.mock.patch 装饰器注入的参数。 (#3206)

  • pytest.raises()match= 失败时显示的错误现在更清晰地说明了发生了什么:当没有引发异常时,“matching ‘…’”部分被删除,因为它错误地暗示引发了异常但它不匹配。当引发了错误的异常时,它现在被抛出(就像没有 match=pytest.raised() 会做的那样),而不是抱怨不匹配的文本。 (#3222)

  • 修复了 macOS 上 doctests 中的输出捕获处理问题。 (#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)

  • 改进使用多个夹具收集测试时的性能。 (#3107)

  • 新的 caplog.get_records(when) 方法,提供对“setup”、“call”和“teardown”测试阶段捕获记录的访问。 (#3117)

  • 新的夹具 record_xml_attribute,允许在 JUnit 报告中修改和插入 <testcase> xml 节点上的属性。 (#3130)

  • 默认缓存目录已从 .cache 重命名为 .pytest_cache,此前社区反馈称 .cache 名称未能明确其由 pytest 使用。 (#3138)

  • 在实时日志输出中为级别名称列着色。 (#3142)

错误修复

  • 修复 macOS 上 pexpect 测试挂起的问题,通过使用 flush() 而不是 wait()。 (#2022)

  • 修复在使用 pytester 插件进行进程内 pytest 运行后恢复 Python 状态的问题;如果后续运行依赖于早期运行泄漏的全局解释器更改,这可能会破坏使用多个进程内 pytest 运行的测试。 (#3016)

  • 修复在插件设置钩子之前测试中止时跳过插件报告钩子的问题。 (#3074)

  • 修复在拆卸过程中测试失败时报告的进度百分比。 (#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 的夹具函数时可能出现的混淆。 (#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 替换为 stdlib 导入。 (#3067)

  • 在日志文档中将“you”更正为“your”。 (#3129)

pytest 3.3.2 (2017-12-25)

错误修复

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

  • 修复了垃圾回收器从未销毁夹具返回的对象的 内存泄漏 问题。 (#2981)

  • 修复 Python 2 上将 pyargs 转换为文件名时不对符号链接进行转换的问题。 (#2985)

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

改进文档

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

琐碎/内部更改

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

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

pytest 3.3.1 (2017-12-05)

错误修复

  • 修复 -p no:<plugin> 无效的问题。 (#2920)

  • 修复 Python 2 中包含非字符串参数的警告的回归问题。 (#2956)

  • 设置 PYTEST_CURRENT_TEST 时,始终转义空字节。 (#2957)

  • 修复当没有收集到测试时,使用 testmon 插件时出现的 ZeroDivisionError。 (#2971)

  • 恢复 TerminalReporter.writer 作为 TerminalReporter._tw 的别名。此别名在 3.3.0 版本中被意外删除。 (#2984)

  • 现在 pytest-capturelog 插件也被列入黑名单,避免在仍然安装它的情况下运行 pytest 时出现错误。 (#3004)

改进文档

  • 修复插件 pytest-localserver 的链接损坏。 (#2963)

琐碎/内部更改

  • 更新 CONTRIBUTING.rst 中的 github“bugs”链接 (#2949)

pytest 3.3.0 (2017-11-23)

弃用和移除

  • pytest 不再支持 Python 2.63.3。这些 Python 版本已经 EOL 一段时间,给 pytest 核心团队带来了维护和兼容性成本,在与社区其他成员协商后,我们决定从这个版本开始不再支持它们。仍然需要这些版本的用户应将 pytest 固定到 <3.3。 (#2812)

  • 删除内部 _preloadplugins() 函数。此删除是 pytest_namespace() 钩子弃用的一部分。 (#2636)

  • 内部将 CallSpec2 更改为具有标记列表而不是损坏的关键字映射。这移除了内部 CallSpec2 类的关键字属性。 (#2672)

  • 删除 ParameterSet.deprecated_arg_dict - 它不是公共 API,缺少下划线是命名错误。 (#2675)

  • 移除内部多类型属性 Node._evalskip,并将其替换为布尔值 Node._skipped_by_mark。 (#2767)

  • 传递给 pytest.fixtureparams 列表现在在调用 pytest.fixture 时被认为是不可变的和冻结的。以前,该列表可以在夹具首次调用之前更改,从而允许某种形式的动态参数化(例如,从命令行选项更新),但这是一种不必要的实现细节,它使内部复杂化并阻止了一些内部清理。有关详细信息和建议的解决方法,请参阅问题 #2959

功能

  • pytest_fixture_post_finalizer 钩子现在可以接收 request 参数。(#2124

  • 用 Python 3 上的 inspect.signature 和 Python 2 上的 funcsigs.signature 替换 compat.py 中用于确定 fixtures 可用参数的旧内省代码。这应该尊重函数上的 __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 kwarg,支持跳过整个模块。(#2808

  • 允许在 PYTEST_ADDOPTS 中设置 file_or_dir-c-o。(#2824

  • 将 stdout/stderr 捕获结果作为 namedtuple 返回,以便可以通过属性访问 outerr。(#2879

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

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

  • 实现跳过 setup.py 文件在运行时带 --doctest-modules 的功能。(#502

错误修复

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

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

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

  • capsyscapfd 现在可以被其他 fixtures 使用。(#2709

  • 内部 pytester 插件正确地将 bytes 参数编码为 utf-8。(#2738

  • testdir 现在使用与 tmpdir 相同的方法来创建其临时目录。这会略微改变 testdir 目录的最终结构,但通常情况下不会影响使用,并避免了许多潜在问题。(#2751

  • pytest 不再抱怨带有 Unicode 消息的警告不是 ASCII 兼容的,即使是 ASCII 兼容的消息。因此,带有 Unicode 消息的警告首先转换为 ASCII 表示以确保安全。(#2809

  • 当达到 --maxfail 时,将 pytest 命令的返回值从 2(中断)更改为 1(失败)。(#2845

  • 修复断言重写中的问题,该问题可能导致其重写不应重写的模块。(#2939

  • 处理 pytest.ini 中没有描述的标记。(#2942

琐碎/内部更改

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

  • 重构了内部 Python 2/3 兼容性代码,以使用 six。(#2642

  • 停止 vendoring 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)

错误修复

  • pytest 中删除 py<1.5 限制,因为这可能导致某些安装中出现版本冲突。(#2926

pytest 3.2.4 (2017-11-13)

错误修复

  • 修复了当从不同的根目录运行 --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

  • 澄清 fixtures 参数提案的措辞(#2893

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

  • 澄清可用 fixture 作用域的文档。(#538

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

pytest 3.2.3 (2017-10-03)

错误修复

  • 修复未给出前缀时 tab 补全崩溃的问题。(#2748

  • MarkDecorator 的相等性检查函数 (__eq__) 在一个对象不是 MarkDecorator 实例时返回 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)

错误修复

  • 调用已弃用的 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)

错误修复

  • 修复了收集单个测试项时的小型终端故障。(#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

错误修复

  • pytester.py.Testdir.popen() 中,将 stdin 设置为已关闭的 PIPE,以避免不必要的交互式 pdb#2023

  • 在使用 capsys 捕获模式时,为 sys.std* 流添加缺失的 encoding 属性。(#2375

  • 修复在 Windows 上,如果 coloramaconftest.py 文件中导入,则终端颜色变为黑色的问题。(#2510

  • 修复了报告跳过测试摘要时行号不正确的问题。(#2548

  • 捕获:确保 EncodedFile.name 是一个字符串。(#2555

  • 选项 --fixtures--fixtures-per-test 现在将保留文档字符串中的缩进。(#2574

  • doctests 行号现在已正确报告,修复了 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)

错误修复

  • 修复 Python 2 中文档字符串中 doctest 的解码错误。(#2434

  • 现在,由 finalizers 在 teardown 期间引发的异常将被抑制,直到所有 finalizers 都被调用,然后重新引发初始异常。(#2440

  • 修复了在命令行上指定测试时“已收集项”报告不正确的问题。(#2464

  • 上下文管理器形式的 deprecated_call 现在可以捕获弃用警告,即使相同的警告之前已经引发过。此外,deprecated_call 将始终生成相同的错误消息(以前在上下文管理器模式和函数调用模式下会生成不同的消息)。(#2469

  • 修复了 pytest 收集的路径可能带有三重前导 / 字符的问题。(#2475

  • 修复了尝试检测递归回溯开始时发生的内部错误。(#2486

改进文档

  • 明确说明哪些钩子在第一个非 None 结果后停止调用。(#2493

琐碎/内部更改

  • 创建用于更新 vendored 包的 invoke 任务。(#2474

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

pytest 3.1.2 (2017-06-08)

错误修复

  • 通过 pytest_addoption 添加的必需选项将不再阻止在不传递它们的情况下使用 –help。(#1999)

  • 在断言重写中遵守 python_files。(#2121)

  • 修复了回溯中包含无法比较的对象(如 numpy 数组)时可能导致递归错误检测的问题。(#2459)

  • UnicodeWarning 仅在消息包含非 ASCII Unicode 时由内部 pytest 警告插件发出(仅限 Python 2)。(#2463)

  • 添加了一个针对 Python 3.6 WindowsConsoleIO 因 Pytest 的 FDCapture 而中断的变通方案。其他使用控制台句柄的代码可能仍受相同问题的影响,可能需要进一步的变通方案/修复,例如 colorama。(#2467)

改进文档

  • 修复内部 API 链接到 pluggy 对象的问题。(#2331)

  • 明确指出 pytest.xfail 会在调用点停止测试执行,并改进 skipping 文档的整体流程。(#810)

pytest 3.1.1 (2017-05-30)

错误修复

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

  • pytest 现在在可调用 ID 在参数化测试中引发时发出警告。感谢 @fogo 提供的 PR。

  • 现在可以通过将 __test__ 属性设置为类体中的 False 来跳过测试类不被收集(#2007)。感谢 @syre 报告和 @lwm 提供的 PR。

  • 更改 junitxml.py 以生成符合 Junitxml 架构的报告。如果相同的测试在调用中失败,然后在 teardown 中出错,我们将测试用例元素拆分为两个,一个包含错误,另一个包含失败。(#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。

错误修复

  • 修复在 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 报告中每个测试用例元素出现两次 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)

  • 未正确将 option=value 传递给 -o/--override-ini 时添加警告(#2105)。同时改进了帮助文档。感谢 @mbukatov 报告和 @lwm 提供的 PR。

  • 现在 --confcutdir--junit-xml 分别作为目录和文件名进行正确验证(#2089#2078)。感谢 @lwm 提供的 PR。

  • 在错误消息中添加提示,指出可能缺少 __init__.py#478)。感谢 @DuncanBetts

  • 更准确地描述文档中 fixture 终结的发生时间(#687)。感谢 @DuncanBetts

  • recwarn.rst 提供 :ref: 目标,以便我们可以使用 intersphinx 引用。感谢 @dupuy 报告和 @lwm 提供的 PR。

  • 在 Python 2 中,在 pytest.approx 的字符串表示中使用简单的 +- ASCII 字符串(例如 "4 +- 4.0e-06"),因为在 pytest 内部不同上下文和表示中处理它很脆弱,可能导致 #2111 等错误。在 Python 3 中,表示仍使用 ±(例如 4 ± 4.0e-06)。感谢 @kerrick-lyft 报告和 @nicoddemus 提供的 PR。

  • 使用 item.Functionitem.Module 等现在会发出弃用警告,请改用 pytest.Functionpytest.Module 等(#2034)。感谢 @nmundar 提供的 PR。

  • 修复了使用 approx 与复数时的错误消息(#2082)。感谢 @adler-j 报告和 @nicoddemus 提供的 PR。

  • 修复了断言重写钩子对被 pytest_plugins 机制多次导入的模块产生误报警告的问题。感谢 @nicoddemus 提供的 PR。

  • 移除了一个内部缓存,该缓存可能导致子目录中的 conftest.py 文件的钩子在其他目录中被错误调用(#2016)。感谢 @d-b-w 报告和 @nicoddemus 提供的 PR。

  • 删除了旨在支持早期 Python 3 版本的内部代码,该代码产生了将 None 留在 sys.modules 中的副作用,当表达式被 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)

  • 改进将非字符串 ID 传递给 pytest.mark.parametrize 时的错误消息(#1857)。感谢 @okken 报告和 @nicoddemus 提供的 PR。

  • 向 stdin 存根类 pytest.capture.DontReadFromInput 添加 buffer 属性。感谢 @joguSD 提供的 PR。

  • 修复了字符串比较与 Unicode 失败时发生的 UnicodeEncodeError。(#1864)感谢 @AiOO 提供的 PR。

  • 如果 pytest_plugins 被定义为字符串(而不是字符串序列),当模块被考虑进行断言重写时,现在可以正确处理。由于此错误,如果测试套件使用 pytest_plugins 加载内部插件,则比必要重写的模块要多得多(#1888)。感谢 @jaraco 报告和 @nicoddemus 提供的 PR(#1891)。

  • 在使用 --pdb 运行 unittest.TestCase 子类的测试时,不要调用 tearDown 和清理。这允许对所有在 tearDown 机制中具有重要逻辑的应用程序进行适当的死后调试(#1890)。感谢 @mbyt 提供的 PR。

  • 修复了内部 doctest 插件中已弃用的 getfuncargvalue 方法的使用。感谢 @ViviCoder 报告(#1898)。

3.0.1 (2016-08-23)

  • 修复了在模块级别使用 importorskip 时的回归问题(#1822)。感谢 @jaraco@The-Compiler 报告,以及 @nicoddemus 提供的 PR。

  • 修复了在同一调用中将会话 fixture 与普通参数结合使用时参数化范围的问题(#1832)。感谢 @The-Compiler 报告,@Kingdread@nicoddemus 提供的 PR。

  • 修复了使用空 ids 参数参数化测试或 fixture 时发生的内部错误(#1849)。感谢 @OPpuolitaival 报告和 @nicoddemus 提供的 PR。

  • 修复了在 zipfile 中嵌入 pytest 时出现的加载器错误。感谢 @mbachry 提供的 PR。

3.0.0 (2016-08-18)

不兼容的更改

此版本进行了一些不兼容的更改,旨在删除长期弃用的功能或更改现有行为,以使其不那么令人意外/更有用。

  • 重新解释模式现已删除。只剩下纯模式和重写模式,因此 --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* 入口点。带版本号和后缀的入口点从未被文档化,是 pre-virtualenv 时代的遗留物。这些入口点还在 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 报告错误,@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 选项,用于在运行(失败的)文档测试时更改差异的输出格式(实现了 #1749)。感谢 @hartym 的 PR。

  • pytest.fixture 装饰器新增了 name 参数,允许为 fixture 指定自定义名称(以解决 funcarg 遮蔽 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 strings。如果与 -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:pytest 现在忽略命令行中给定的重复路径。要保留以前的行为,即通过在命令行中多次指定同一测试来运行多次,请传递 --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

  • 对测试为元组字面量的断言发出警告。此类断言永远不会失败,因为元组始终为真,通常是错误(参见 #1562)。感谢 @kvas-it 的 PR。

  • 允许传递自定义调试器类(例如 --pdbcls=IPython.core.debugger:Pdb)。感谢 @anntzer 的 PR。

更改

  • 插件现在受益于断言重写。感谢 @sober7@nicoddemus@flub 的 PR。

  • xpassed 测试的 report.outcome 在非严格模式下更改为 "passed",在严格模式下更改为 "failed"。感谢 @hackebrot 的 PR (#1795) 和 @gprasad84 的报告 (#1546)。

  • 使用 xfail(strict=False)(默认)标记的测试现在在 JUnitXML 报告中显示为通过测试而不是跳过测试。感谢 @hackebrot 的 PR (#1795)。

  • 在错误报告中突出显示文件路径,以便于复制/粘贴。感谢 @suzaku 的 PR (#1778)。

  • 使用 @pytest.fixture 标记的 fixture 现在可以像使用 @pytest.yield_fixture 装饰器标记的 fixture 一样使用 yield 语句。此更改使 @pytest.yield_fixture 被弃用,并使带有 yield 语句的 @pytest.fixture 成为编写 teardown 代码的首选方式(#1461)。感谢 @csaftoiu 提出此问题,以及 @nicoddemus 的 PR。

  • 显式传递的 parametrize ids 不会被转义为 ASCII(#1351)。感谢 @ceridwen 的 PR。

  • 在测试函数中声明未知 fixture 时,错误消息中显示的 fixture 现在已排序。感谢 @nicoddemus 的 PR。

  • pytest_terminal_summary 钩子现在接收测试会话的 exitstatus 作为参数。感谢 @blueyed 的 PR (#1809)。

  • Parametrize ids 可以接受 None 作为特定的测试 ID,在这种情况下将使用该参数自动生成的 ID。感谢 @palaviv 的完整 PR (#1468)。

  • xunit 风格的 setup/teardown 方法(setup_methodsetup_module 等)的参数现在是可选的,可以省略。感谢 @okken 提出此问题,以及 @nicoddemus 的 PR。

  • 在 parametrize 中出现重复 ID 时,改进了自动 ID 生成的选择。感谢 @palaviv 的完整 PR (#1474)。

  • 现在默认显示 pytest 警告摘要。新增了一个标志 --disable-pytest-warnings 以显式禁用警告摘要(#1668)。

  • 通过提醒用户检查测试模块/包的名称,使收集期间的 ImportError 更明确(#1426)。感谢 @omarkohl 的完整 PR (#1520)。

  • build/dist/ 添加到默认的 --norecursedirs 列表。感谢 @mikofski 的报告和 @tomviner 的 PR (#1544)。

  • 上下文管理器形式的 pytest.raises 接受自定义 message,用于在未发生异常时引发。感谢 @palaviv 的完整 PR (#1616)。

  • conftest.py 文件现在受益于断言重写;以前只适用于测试模块。感谢 @flub@sober7@nicoddemus 的 PR (#1619)。

  • 不包含任何文档测试的文本文件不再显示为“跳过”。感谢 @graingert 的报告和完整的 PR (#1580)。

  • 确保当在命令行中与 --pyargs 选项一起指定时,可以找到命名空间包中的模块。感谢 @taschini 的 PR (#1597)。

  • 在断言重写期间始终包含完整的断言解释。以前的行为是隐藏恰好为 False 的子表达式,假设这是冗余信息。感谢 @bagerard 的报告 (#1503)。感谢 @davehunt@tomviner 的 PR。

  • OptionGroup.addoption() 现在检查选项名称是否已添加,以便更容易追踪 #1618 等问题。在此之前,您只能稍后从 argparse 库收到异常,无法了解实际的重复添加选项的原因。

  • 基于 yield 的测试被认为是已弃用的,并将在 pytest-4.0 中移除。感谢 @nicoddemus 的 PR。

  • setup.cfg 文件中的 [pytest] 部分现在应命名为 [tool:pytest],以避免与其他 distutils 命令冲突(参见 #567)。pytest.initox.ini 文件中的 [pytest] 部分受支持且保持不变。感谢 @nicoddemus 的 PR。

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

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

  • getfuncargvalue 重命名为 getfixturevaluegetfuncargvalue 仍然存在,但现在被认为是已弃用的。感谢 @RedBeardCode@tomviner 的 PR (#1626)。

  • optparse 类型的使用现在会触发 DeprecationWarnings(#1740)。

  • optparse 向后兼容性支持 float/complex 类型(#457)。

  • 完善了 rootdir 的确定逻辑,仅考虑有效路径,从而修复了一些问题:#1594#1435#1471。根据当前行为更新了文档。感谢 @blueyed@davehunt@matthiasha 的 PR。

  • 始终包含完整的断言解释。以前的行为是隐藏恰好为 False 的子表达式,假设这是冗余信息。感谢 @bagerard 的报告 (#1503)。感谢 @davehunt@tomviner 的 PR。

  • 在未使用参数化变量的情况下提供更好的消息(参见 #1539)。感谢 @tramwaj29 的 PR。

  • 更新了文档字符串,使其风格更统一。

  • 在启动时为 pytest.exit(msg) 添加 stderr 写入。以前消息从未显示。感谢 @BeyondEvil 报告 #1210。感谢 @jgsonesen 和 @tomviner 的 PR。

  • 不再显示不正确的测试取消选择原因(#1372)。感谢 @ronnypfannschmidt 的 PR。

  • --resultlog 命令行选项已弃用:它很少使用,并且有更现代更好的替代方案(参见 #830)。感谢 @nicoddemus 的 PR。

  • 改进了 fixture 查找错误时的错误消息:在第一行添加“E”,在其余行添加“>”。修复了 #717。感谢 @blueyed 的报告和 PR,@eolo999 的初始 PR 以及 @tomviner 在 EuroPython2016 sprint 期间的指导。

Bug 修复

  • Parametrize 现在正确处理重复的测试 ID。

  • 修复了 teardown_method() 缺少 method 参数时发生的内部错误(#1605)。

  • 修复了在测试期间当前工作目录 (CWD) 被删除时异常可视化的问题 (#1235)。感谢 @bukzor 的报告。PR 由 @marscher 提供。

  • 改进了带有括号的逻辑表达式的测试输出(#925)。感谢 @DRMacIver 的报告和 @RedBeardCode 的 PR。

  • 为以换行符结尾的字符串创建正确的 diff(#1553)。感谢 @Vogtinator 的报告以及 @RedBeardCode@tomviner 的 PR。

  • ConftestImportFailure 现在显示回溯,使得识别 conftest.py 文件中的错误变得更容易(#1516)。感谢 @txomon 的 PR。

  • 不包含任何文档测试的文本文件不再显示为“跳过”。感谢 @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 在使用 condition 关键字参数时不工作的问题。感谢 @astraw38 报告此问题 (#1496),以及 @tomviner 的 PR (#1524)。

  • 修复 win32 路径问题:当在 pytest.main("-c your_absolute_path") 中放置带有绝对路径的自定义配置文件时。

  • 修复当引发的错误类不支持 unicode/编码字节时,最大递归深度检测的问题。感谢 @prusse-martin 的 PR (#1506)。

  • 修复在严格模式下使用 pytest.mark.skip 标记的问题。感谢 @pquentin 的 PR 以及 @RonnyPfannschmidt 演示如何修复此错误。

  • 对文档进行了小幅改进和修复。感谢 @omarkohl 的 PR。

  • 修复 --fixtures 以显示所有 fixture 定义,而不是每个 fixture 名称只显示一个。感谢 @hackebrot 的 PR。

2.9.1 (2016-03-17)

Bug 修复

  • 改进插件加载失败时的错误消息。感谢 @nicoddemus 的 PR。

  • 修复 (#1178):pytest.fail 带有非 ASCII 字符时会引发内部 pytest 错误。感谢 @nicoddemus 的 PR。

  • 修复 (#469):当参数 ID 包含 :: 时,junit 错误解析 report.nodeid。感谢 @tomviner 的 PR (#1431)。

  • 修复 (#578):在失败点包含非 ASCII 行的 SyntaxError 错误会生成内部 py.test 错误。感谢 @asottile 的报告和 @nicoddemus 的 PR。

  • 修复 (#1437):当向 parameterize 传入字节字符串正则表达式模式时,尝试将其解码为 utf-8,忽略错误。

  • 修复 (#649):不能在命令行上指定运行参数化测试节点。

  • 修复 (#138):改进 Python 3.3+ 链式异常的报告

2.9.0 (2016-02-29)

新功能

  • 新增了 pytest.mark.skip 标记,无条件跳过标记的测试。感谢 @MichaelAquilina 的完整 PR (#1040)。

  • --doctest-glob 现在可以在命令行中多次传递。感谢 @jab@nicoddemus 的 PR。

  • 新的 -rp-rP 报告选项分别提供通过测试的摘要和完整输出。感谢 @codewarrior0 的 PR。

  • pytest.mark.xfail 现在有一个 strict 选项,它会使 XPASS 测试导致测试套件失败(默认为 False)。还有一个 xfail_strict ini 选项可用于项目范围配置。感谢 @rabbbit 的请求和 @nicoddemus 的 PR (#1355)。

  • Parser.addini 现在支持 bool 类型的选项。感谢 @nicoddemus 的 PR。

  • 新增 ALLOW_BYTES 文档测试选项。这会从文档测试输出的字节字符串中去除 b 前缀(类似于 ALLOW_UNICODE)。感谢 @jaraco 的请求和 @nicoddemus 的 PR (#1287)。

  • KeyboardInterrupt 时提示使用 --fulltrace 选项显示错误。修复了 #1366。感谢 @hpk42 的报告和 @RonnyPfannschmidt 的 PR。

  • 获取异常源位置时捕获 IndexError 异常。修复了动态生成代码(fixture 和测试)中 pytest 内部错误,其中源行有意是假的。

更改

  • 重要提示py.code 已合并到 pytest 仓库中,作为 pytest._code。做出此决定是因为 py.codepytest 之外的使用很少,并且它位于不同的仓库中使得及时修复其代码中的错误变得困难。团队希望通过此举能够更好地重构和改进该代码。此更改不应影响用户,但如果他们遇到任何奇怪的行为,让用户知晓会很有用。

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

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

  • pytest_enter_pdb 现在可选地接收 pytest 配置对象。感谢 @nicoddemus 的 PR。

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

  • 即使未使用 -vv,当在环境中找到 CIBUILD_NUMBER 时,比较现在始终完整显示。感谢 @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 中的双节点 ID,这是一个回归,导致 pytest-pep8 + pytest-flakes 等插件组合失败

  • 解决了在启用标准 I/O 捕获的情况下使用 --pdb 时 pyreadline 中发生的异常。感谢 Erik M. Bray 的 PR。

  • 修复 #900:如果 monkeypatch 调用的目标引发 ImportError,则提供更好的错误消息。

  • 修复 #1292:monkeypatch 调用(setattr、setenv 等)现在是 O(1)。感谢 David R. MacIver 的报告和 Bruno Oliveira 的 PR。

  • 修复 #1223:现在,当使用 --pdb 时,捕获的 stdout 和 stderr 会在进入 pdb 之前正确显示,而不是被丢弃。感谢 Cal Leeming 的 PR。

  • 修复 #1305:在 pytest_terminal_summary 期间发出的 pytest 警告现在已正确显示。感谢 Ionel Maries Cristian 的报告和 Bruno Oliveira 的 PR。

  • 修复 #628:解决了文档测试包含 unicode 时内部 UnicodeDecodeError 错误。感谢 Jason R. Coombs 的报告和 Bruno Oliveira 的 PR。

  • 修复 #1334:在 setup 错误时将捕获的 stdout 添加到 jUnit XML 报告中。感谢 Georgy Dyuldin 的 PR。

2.8.5 (2015-12-11)

  • 修复 #1243:修复了在收集过程中注入的类属性可能破坏 pytest 的问题。Alexei Kozlenok 提供了 PR,感谢 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 函数已在同一模块中的另一个测试中调用时,deprecated_call() 现在可以正常工作。感谢 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 中的测试用例添加 __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:当字符串比较失败且差异过大无法在不传递 -vv 的情况下显示时,仍然显示几行差异。感谢 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 现在还为枚举、正则表达式和类对象(而不是类实例)生成有意义的测试 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 错误。感谢 Sergey Chipiga 的报告和 Jan Bednarik 的 PR。

  • 修复 issue82:默认情况下避免从 setup.cfg/pytest.ini/tox.ini 文件及更高级别加载 conftest 文件(--confcutdir 仍可设置以覆盖此行为)。感谢 Bruno Oliveira 的 PR。

  • 修复 issue768:在 Python 模块中找到的 docstrings 没有设置会话 fixture。感谢 Jason R. Coombs 的报告和 Bruno Oliveira 的 PR。

  • 添加了 tmpdir_factory,这是一个会话范围的 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:在根本没有运行测试的情况下(例如命令行中给定的目录不包含任何测试,或者命令行选项过滤掉所有测试,例如 -k),pytest 现在以状态码 5 退出。感谢 Eric Siegerman (issue812) 和 Bruno Oliveira 的 PR。

  • 摘要栏在警告情况下现在显示为黄色,例如:所有测试都被跳过或 xpass/xfailed,或者根本没有运行任何测试(与 issue500 相关)。感谢 Eric Siegerman。

  • 新增 testpaths ini 选项:在从根目录执行 pytest 时搜索测试的目录列表。当项目有明确指定的测试目录时,这可以用于加快测试收集,通常比为所有不包含测试的目录配置 norecursedirs 更实用。感谢 Adrian 的想法 (#694) 和 Bruno Oliveira 的 PR。

  • 修复 issue713:文档测试失败的 JUnit XML 报告。感谢 Punyashloka Biswal。

  • 修复 issue970:内部 pytest 警告现在在终端中显示为“pytest-warnings”而不是“warnings”,因此用户清楚这些警告来自 pytest 而不是内置的“warnings”模块。感谢 Bruno Oliveira。

  • 在 junitxml 测试持续时间中包含 setup 和 teardown。感谢 Janne Vanhala。

  • 修复 issue735:Python 3.4+ 调试版本中的断言失败

  • 新增选项 --import-mode,允许将测试模块导入行为更改为追加到 sys.path 而不是预置。这更好地允许针对已安装的包版本运行测试模块,即使被测试的包具有相同的导入根。在此示例中

    testing/__init__.py
    testing/test_pkg_under_test.py
    pkg_under_test/
    

    当使用 --import-mode=append 时,测试将针对已安装的 pkg_under_test 版本运行,而默认情况下它们总是会选择本地版本。感谢 Holger Krekel。

  • pytester:添加方法 TmpTestdir.delete_loaded_modules(),并从 inline_run() 调用它,以允许重新加载临时模块。感谢 Eduardo Schettino。

  • 内部重构 pluginmanager API 和代码,以便 pytest-agnostic 的简单 pluginmanager 和 PytestPluginManager 之间有明确的区别,后者添加了许多行为,其中包括处理本地 conftest 文件。就文档方法而言,这是一个向后兼容的更改,但它仍然可能破坏依赖于特定细节(尤其是 pluginmanager.add_shutdown() API)的第三方插件。感谢 Holger Krekel。

  • 插件管理:引入 pytest.hookimplpytest.hookspec 装饰器,用于设置实现/规范特定参数。这取代了之前已弃用的 pytest.mark 的使用,后者旨在仅包含测试函数的标记。

  • 编写/完善了“编写插件”的文档,现在它们有自己的页面,并与“使用/安装插件”页面分开。

  • 修复 issue732:正确地从任何钩子调用站点取消注册插件,允许在测试执行期间拥有临时插件。

  • 弃用并警告钩子实现中的 __multicall__ 参数。请改用 pytest-2.7 中已引入的 hookwrapper 机制。

  • 通过默认使用进程内测试,大大加快了 pytest 自身测试套件的调用速度(测试运行可以通过 --runpytest=subprocess 修改,以便在许多地方创建子进程)。在测试中运行 pytest 的主要 API 是“runpytest()”或“runpytest_subprocess”和“runpytest_inprocess”(如果您需要特定的测试运行方式)。在所有情况下,您都会得到一个 RunResult,但进程内测试还会有一个带有记录事件/报告的“reprec”属性。

  • 修复 monkeypatch.setattr(“x.y”, raising=False) 以在“y”不是预先存在的属性时实际不引发异常。感谢 Florian Bruhin。

  • 修复 issue741:使 testdir.run 的运行输出可复制/粘贴。感谢 Bruno Oliveira。

  • 新增 --noconftest 参数,该参数会忽略所有 conftest.py 文件。

  • 为 JUnit-XML 输出添加 fileline 属性。

  • 修复 issue890:将所有文档文件的扩展名从 txt 更改为 rst。感谢 Abhijeet 的 PR。

  • 修复 issue714:添加了对特定 argnames 应用 indirect=True 参数的功能。感谢 Elizaveta239。

  • 修复 issue890:将所有文档文件的扩展名从 txt 更改为 rst。感谢 Abhijeet 的 PR。

  • 修复 issue957:“# doctest: SKIP” 选项现在会将文档测试注册为 SKIPPED 而不是 PASSED。感谢 Thomas Grainger 的报告和 Bruno Oliveira 的 PR。

  • issue951:添加新的 record_xml_property fixture,支持在 xml 输出中记录额外信息。感谢 David Diaz 的 PR。

  • issue949:普通选项(例如 -s-v 等)之后的路径现在被正确用于发现 rootdirini 文件。感谢 Peter Lauri 的报告和 Bruno Oliveira 的 PR。

2.7.3 (2015-09-15)

  • 允许 importorskip 中使用“dev”、“rc”或其他非整数版本字符串。感谢 Eric Hunsberger 的 PR。

  • 修复 issue856:在所有输出中(例如 --fixtures)考虑 --color 参数。感谢 Barney Gale 的报告和 Bruno Oliveira 的 PR。

  • 修复 issue855:将字符串对象作为 plugins 参数传递给 pytest.main 现在被解释为要导入并注册为插件的模块名称,而不是静默地不起作用。感谢 xmo-odoo 的报告和 Bruno Oliveira 的 PR。

  • 修复 issue744:修复 Python 3.5+ 中 ast.Call 更改的问题。感谢 Guido van Rossum、Matthias Bussonnier、Stefan Zimmermann 和 Thomas Kluyver。

  • 修复 issue842:在类中应用标记不再将这些标记传播到也具有标记的超类。感谢 xmo-odoo 的报告和 Bruno Oliveira 的 PR。

  • 在调用 pytest.deprecated_call 后保留警告函数。感谢 Pieter Mulder 的 PR。

  • 修复 issue854:在 unittest.TestCase 子类中定义为类成员的 autouse yield_fixtures 现在按预期工作。感谢 xmo-odoo 的报告和 Bruno Oliveira 的 PR。

  • 修复 issue833:--fixtures 现在显示所有已收集测试文件的 fixture,而不是仅显示第一个文件的 fixture。感谢 Florian Bruhin 的报告和 Bruno Oliveira 的 PR。

  • 修复 issue863:当使用多个标记时,如果满足跳过/xfail 条件,则跳过的测试现在报告正确的原因。感谢 Raphael Pierzina 的报告和 Bruno Oliveira 的 PR。

  • 优化了 tmpdir fixture 初始化,这应该会使测试会话更快(特别是在使用 pytest-xdist 时)。唯一可见的影响是现在 pytest 使用 $TEMP 目录中的一个子目录来存放此 fixture 创建的所有目录(默认为 $TEMP/pytest-$USER)。感谢 Bruno Oliveira 的 PR。

2.7.2 (2015-06-23)

  • 修复 issue767:pytest.raises value 属性在 Python 2.6 上不包含异常实例。感谢 Eric Siegerman 提供了测试用例,以及 Bruno Oliveira 的 PR。

  • 自动为 junitxml 和结果日志创建目录。感谢 Aron Curzon。

  • 修复 issue713:文档测试失败的 JUnit XML 报告。感谢 Punyashloka Biswal。

  • 修复 issue735:Python 3.4+ 调试版本中的断言失败。感谢 Benjamin Peterson。

  • 修复 issue114:skipif 标记向内部跳过插件报告;感谢 Floris Bruynooghe 的报告和 Bruno Oliveira 的 PR。

  • 修复 issue748:unittest.SkipTest 报告给内部 pytest unittest 插件。感谢 Thomas De Schampheleire 的报告和 Bruno Oliveira 的 PR。

  • 修复 issue718:在 Python 2 中,无法创建包含不可排序元素的集合的表示。感谢 Edison Gustavo Muenz。

  • 修复 issue756,修复 issue752(以及类似问题):依赖于 py-1.4.29,它具有更精细的回溯生成算法。

2.7.1 (2015-05-19)

  • 修复 issue731:在折叠 False 解释时,不要被对象 repr 中可能存在的不平衡括号所迷惑。感谢 Carl Meyer 的报告和测试用例。

  • 修复 issue553:正确处理 FixtureLookupError 中 inspect.getsourcelines 失败,这可能导致内部错误,从而模糊原始问题。感谢 talljosh 的初步诊断/补丁和 Bruno Oliveira 的最终补丁。

  • 修复 issue660:正确报告作用域不匹配访问错误,独立于 fixture 参数的顺序。同时避免 pytest 内部回溯,因为它不向用户提供信息。感谢 Holger Krekel。

  • 简化并记录了发布过程。此外,所有版本(在 setup.py 和文档生成中)现在都从 _pytest/__init__.py 中读取。感谢 Holger Krekel。

  • 修复了文档,删除了 yield-fixtures 是实验性的概念。它们将长期存在 :) 感谢 Bruno Oliveira。

  • 通过使用环境标记来满足要求,支持构建 wheel。感谢 Ionel Maries Cristian。

  • 修复了 2.6.4 的回归问题,例如在测试引发 SystemExit 时丢失了 stdout 捕获打印。感谢 Holger Krekel。

  • 重新引入了 pytester 插件的 _pytest fixture,pytest-xdist 等至少使用它。

2.7.0 (2015-03-26)

  • 修复 issue435:当断言重写处于活动状态时,使 reload() 工作。感谢 Daniel Hahler。

  • 修复 issue616:conftest.py 文件及其包含的 fixture 现在被正确地考虑可见性,独立于确切的当前工作目录和使用的测试参数。非常感谢 Eric Siegerman 及其 PR235,其中包含针对 conftest 可见性的系统测试,现在已通过。此更改还引入了 rootdir 的概念,它作为新的 pytest 标头打印并记录在 pytest 自定义网页中。

  • 更改了“转移”测试的报告,即在一个文件中收集但实际来自另一个文件的测试(例如,当测试类中的测试来自不同文件中的基类时)。我们现在显示节点 ID 并通过后缀指示另一个文件。

  • 添加了通过环境变量 PYTEST_ADDOPTS 设置命令行选项的功能。

  • 添加了 bitbucket 和 github 上新的 pytest-dev 团队的文档。请参阅 https://pytest.cn/en/stable/contributing.html。感谢 Anatoly 的推动和初步工作。

  • 修复 issue650:新选项 --doctest-ignore-import-errors,它会将文档测试中的导入错误转换为跳过。感谢 Charles Cloud 的完整 PR。

  • 修复 issue655:解决导致 python2/3 将 sys.exc_info 泄露到 fixture/测试中,从而导致第三方代码失败的不同方式

  • 修复 issue615:断言重写在格式化布尔运算时没有正确转义 % 符号,这在布尔值与模运算符混合时导致错误。感谢 Tom Viner 的报告、分类和修复。

  • 实现了 issue351:增加了将 parametrize id 指定为可调用对象以生成自定义测试 id 的功能。感谢 Brianna Laugher 的想法和实现。

  • 引入并记录了新的 hookwrapper 机制,对于希望为其目的封装某些钩子执行的插件很有用。这取代了 pytest 本身和一些外部插件使用的未文档化的 __multicall__ 协议。请注意,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)。

  • 失败时,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 支持。

  • 修复 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 时的无限递归错误,感谢 Uwe Schmitt。

  • 修复 issue589:修复了与 numpy 等在显示异常时的不良交互。检查精确的“超出最大递归深度”异常,而不是假定任何 RuntimeError 都是该异常(在 py dep 中实现)。感谢 Charles Cloud 对问题的分析。

  • 修复 conftest 相关的 fixture 可见性问题:当在测试包之外的 CWD 中运行时,pytest 会错误地发现 fixture。感谢 Wolfgang Schnerring 找出了可重现的示例。

  • 引入 pytest_enter_pdb 钩子(例如 pytest_timeout 在交互式进入 pdb 时取消超时需要)。感谢 Wolfgang Schnerring。

  • 检查 xfail/skip 也适用于非 Python 函数测试项。感谢 Floris Bruynooghe。

2.6.2 (2014-09-05)

  • 添加了函数 pytest.freeze_includes(),它使得使用 cx_freeze 等工具轻松地将 pytest 嵌入到可执行文件中。请参阅文档以获取示例和原理。感谢 Bruno Oliveira。

  • 改进断言重写缓存失效的精度。

  • 修复 issue561:调整 autouse fixture 示例以适应 python3。

  • 修复 issue453:__repr__ 包含“n{”、“n}”和“n~”时的断言重写问题。

  • 修复 issue560:如果“else:”或“finally:”后面跟有同一行上的语句,则正确显示代码。

  • 修复 monkeypatch 文档中的示例,感谢 t-8ch。

  • 修复 issue572:更正 python3 的 tmpdir 文档示例。

  • 不要标记为通用 wheel,因为 Python 2.6 由于额外的 argparse 依赖项而与其他构建不同。修复 issue566。感谢 sontek。

  • 实现 issue549:用户提供的断言消息现在不再替换 py.test 自省消息,而是额外显示。

2.6.1 (2014-08-07)

  • 不再在 –verbose 输出中显示行号,输出现在纯粹是节点 ID。行号仍在失败报告中显示。感谢 Floris Bruynooghe。

  • 修复 issue437,其中断言重写可能导致 pytest-xdist worker 节点收集不同的测试。感谢 Bruno Oliveira。

  • 修复 issue555:为 capture-streams 添加“errors”属性,以满足一些 distutils 和可能其他代码访问 sys.stdout.errors 的需求。

  • 修复 issue547 capsys/capfd 在禁用输出捕获(“-s”)时也有效。

  • 解决 issue170:允许 pytest.mark.xfail(…) 通过可选的“raises=EXC”参数指定预期异常,其中 EXC 可以是单个异常或异常类元组。感谢 David Mohr 提供的完整 PR。

  • 修复 pytest 与 unittest.mock.patch 装饰器(当它使用“new”参数时)的集成。感谢 Nicolas Delaby 提供的测试和 PR。

  • 修复当参数包含“::”节点 ID 规范(从“-v”输出复制粘贴)时检测 conftest 文件的问题。

  • 修复 issue544,只删除“::”分隔部分末尾的“@NUM”,并且如果该部分具有“.py”扩展名。

  • 不使用 py.std 导入助手,而是直接导入。感谢 Bruno Oliveira。

2.6

  • 根据作用域缓存 fixtures 中的异常(issue 467)。

  • 修复 issue537:默认情况下避免导入旧的断言重解释代码。

  • 修复 issue364:默认情况下缩短和增强回溯表示。新的“–tb=auto”选项(默认)将仅显示第一个和最后一个条目的长回溯。您可以使用“–tb=long”获取打印所有条目为长条目的旧行为。此外,默认情况下短条目现在与“–tb=native”的打印方式非常相似。

  • 修复 issue514:让断言重解释了解私有类属性。

  • 更改 -v 输出以包含测试的完整节点 ID。用户可以从测试运行中复制节点 ID,包括行号,并将其用作位置参数以仅运行单个测试。

  • 修复 issue 475:如果使用错误的异常类型调用 pytest.raises,则提前且易于理解地失败。

  • 修复 issue516:在入门指南中告知当前依赖项。

  • 稍微清理 setup.py 并指定支持的版本。感谢 Jurko Gospodnetic 提供的 PR。

  • 当使用 -v 运行测试时,将 XPASS 颜色更改为黄色而不是红色。

  • 修复 issue473:解决 mock 在双重打补丁时将未绑定方法放入类字典的问题。

  • 修复 issue498:如果 fixture finalizer 失败,确保 fixture 仍然失效。

  • 修复 issue453:pytest_assertrepr_compare 钩子的结果现在会将其换行符转义,以免 format_exception 崩溃。

  • 内部新的警告系统:当 pytest 在测试收集或执行中检测到异常时,现在会生成警告。警告最终会发送到一个新的 pytest_logwarning 钩子,目前仅由终端插件实现,该插件在摘要行中显示警告,并在指定 -rw(报告警告)时显示更多详细信息。

  • 对于具有 __init__ 的测试类和测试模块中看起来像测试但不是函数的 callable,将跳过转换为警告。

  • 修复 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:改进了与 mock.patch 装饰器在测试中的集成。

  • 修复 issue412:现在可以捕获对 stdout/stderr FD 级别流的干扰而不会崩溃。

  • 修复 issue483:trial/py33 现在可以正常工作。感谢 Daniel Grana 提供的 PR。

  • 改进 pytest 与“python setup.py test”集成的示例,现在它有一个通用的“-a”或“–pytest-args”选项,您可以在其中传递附加选项作为带引号的字符串。感谢 Trevor Bekolay。

  • 简化了内部捕获机制,使其对更改 FD1/FD2 的测试或设置更具鲁棒性,现在还与单个测试中的 pytest.pdb() 更好地集成。

  • 改进了 pytest 自身的测试套件泄漏检测,由 Marc Abramowitz 提供的 PR。

  • 修复 issue492:避免 test_writeorg 中的泄漏。感谢 Marc Abramowitz。

  • 修复 issue493:不要在 doc 目录中运行测试 python setup.py test(为此使用 tox -e doctesting)。

  • 修复 issue486:改进了早期 conftest 加载失败的报告和处理。

  • 内部 conftest 处理的一些清理和简化。

  • 在捕获异常时更努力地打破引用循环。感谢 Jurko Gospodnetic。

  • 修复 issue443:修复跳过示例以使用正确的比较。感谢 Alex Groenholm。

  • 支持模块、类和函数上的 nose 样式 __test__ 属性,包括 unittest 样式的类。如果设置为 False,则不会收集测试。

  • 修复 issue512:为 monkeypatch 插件中可能未设置的参数显示“<notset>”。改进了文档中的输出。

2.5.2 (2014-01-29)

  • 修复 issue409 – 更好地与 cx_freeze 互操作,不尝试从 collections.abc 导入,这会导致 py27/cx_freeze 的问题。感谢 Wolfgang L. 报告并追踪问题。

  • 修复文档和代码,几乎所有地方都使用“pytest”而不是“py.test”。感谢 Jurko Gospodnetic 提供的完整 PR。

  • 修复 issue425:在“py.test -h”末尾提及 –markers 和 –fixtures 根据指定的测试路径(或当前目录)工作。

  • 修复 issue413:带 unicode 属性的异常现在在 python2 和 pytest-xdist 运行中也能正确打印。(修复需要 py-1.4.20)

  • 从 pylib 1.4.20.dev2 (rev 13d9af95547e) 复制、清理并集成 py.io capture。

  • 解决 issue416:澄清有关 conftest.py 加载语义的文档。

  • 修复 issue429:断言表达式中比较带有非 ascii 字符的字节字符串现在工作得更好。感谢 Floris Bruynooghe。

  • 将 capfd/capsys.capture 设为私有,它未使用且不应公开。

2.5.1 (2013-12-17)

  • 合并 Tobias Bieniek 的新文档样式 PR。

  • 修复 issue403:允许在收集节点中参数化多个同名函数。感谢 Andreas Kloeckner 和 Alex Gaynor 的报告和分析。

  • 允许参数化 fixtures 通过向 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 自身的自动化发布测试中移除了 python2.5,这意味着它可能很快就会失效(但我们相信此版本仍然有效)。

  • 简化并修复了在涉及参数化 fixture 或函数参数时调用 finalizer 的实现。现在在设置时惰性地执行最终化,而不是在“拆卸阶段”。虽然这起初听起来很奇怪,但它有助于确保即使在复杂代码中也能正确处理设置/拆卸。用户级代码不应受到影响,除非它正在实现 pytest_runtest_teardown 钩子并期望在其中拆卸某些 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 修复 finalizer 顺序,使其在依赖于高于函数作用域的参数化 fixture 的独立 fixture 上采用 LIFO 顺序。(这需要相当大的努力,所以请忍受这个句子的复杂性 :) 感谢 Ralph Schmitt 提供的精确失败示例。

  • 通过为参数实现特殊索引,仅对参数化测试 ID 使用索引,修复 issue244。

  • 通过运行所有 finalizer,但保存第一个失败 finalizer 的异常并重新抛出它,从而使 teardown 仍然失败,修复 issue287。我们重新抛出第一个失败的异常,因为它可能是其他 finalizer 失败的原因。

  • 修复当 mock.patch 或其他标准装饰器封装与测试方法一起使用时的排序问题。这修复了 issue346,并应有助于解决随机“xdist”收集失败。感谢 Ronny Pfannschmidt 和 Donald Stufft 帮助隔离它。

  • 修复 issue357 - “-k”表达式的特殊情况,允许使用不是有效 python 表达式的简单字符串进行过滤。示例:“-k 1.3”匹配所有参数化为 1.3 的测试。“-k None”过滤所有名称中包含“None”的测试,反之亦然,“-k ‘not None’”。以前这些示例会引发语法错误。

  • 通过删除 trial 支持代码修复 issue384,因为 unittest 兼容性增强允许 trial 自行处理它。

  • 当导入插件产生 ImportError 时,不要隐藏它。修复 issue375。

  • 修复 issue275 - 允许 usefixtures 和 autouse fixtures 用于运行 doctest 文本文件。

  • 修复 issue380,使 –resultlog 仅依赖于 longrepr 而不是有时才存在的“reprcrash”属性。

  • 解决 issue122:允许 @pytest.fixture(params=iterator) 通过尽早展开为列表。

  • 修复 pytest 自身测试的 pexpect-3.0 兼容性。(修复 issue386)

  • 允许嵌套的 parametrize-value 标记,感谢 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 提出这一点。

  • 在 pypy 上 xfail 一个检查错误编码/ascii 的测试(pypy 不会报错)。修复 issue385。

  • 内部使 varnames() 处理类的 __init__,尽管 pytest 本身目前不需要它。也修复了缓存。修复 issue376。

  • 修复 issue221 - 正确处理没有 __init__.py 的命名空间包的导入。

  • 重构内部 FixtureRequest 处理以避免猴子补丁。其中一个积极的用户可见效果是,“request”对象现在可以在闭包中使用。

  • 修复 pytest.importskip(modname, minverstring) 中的版本比较。

  • 修复 issue377,在 nose-compat 文档中澄清 pytest 不会将 unittest-API 复制到“plain”命名空间中。

  • 修复 @mock’d 测试函数的详细报告。

2.4.2 (2013-10-04)

  • 在 Windows 上需要 colorama 和较新的 py 库,以便 py.io.TerminalWriter() 现在使用 colorama 而不是其自己的 ctypes 技巧。(修复 issue365)感谢 Paul Moore 提出。

  • 修复“-k”匹配测试的问题,其中“repr”和“attr”以及其他名称会由于内部实现怪癖(别问)而导致错误的匹配,现在已正确实现。修复 issue345。

  • 避免 tmpdir fixture 创建过长的文件名,尤其是在使用参数化时(issue354)。

  • 修复 pytest-pep8 和 pytest-flakes / pytest 交互(mark 插件中的集合名称假设 item 总是有一个函数,而对于这些插件来说这不是真的等等)。感谢 Andi Zeidler。

  • 引入 node.get_marker/node.add_marker API,供 pytest-pep8 和 pytest-flakes 等插件使用,以避免 node.keywords 伪字典的混乱细节。修改了文档。

  • 移除在启动时尝试“复制”stdout 的做法,因为它很麻烦。正常的捕获应该足以捕获测试搞乱标准 FD 的可能性。

  • 添加 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

已知不兼容性

  • 如果从 python2.7 或更高版本调用 –genscript,您只能获得一个在 python2.7 或更高版本上运行的独立脚本。使用 Python2.6 还可以获得一个 python2.5 兼容版本。

  • 如果相应的 setup 方法失败,所有 xunit 样式的 teardown 方法(nose 样式、pytest 样式、unittest 样式)将不会被调用,请参阅下面的 issue322。

  • pytest_plugin_unregister 钩子从未被正确调用,并且没有已知的该钩子实现 - 因此它被移除。

  • pytest.fixture 装饰的函数不能再是生成器(即使用 yield)。如果这导致不可预见的实际问题,此更改可能会在 2.4.1 中撤销。但是,您总是可以编写并返回一个内部函数/生成器,并更改 fixture 消费者以迭代返回的生成器。此更改是代替新的 pytest.yield_fixture 装饰器而进行的,请参见下文。

新功能

  • 实验性地引入了一个新的 pytest.yield_fixture 装饰器,它接受与 pytest.fixture 完全相同的参数,但要求 fixture 函数使用 yield 语句而不是 return statement。这允许与 fixture 函数中的“with-style”上下文管理器直接集成,并且通常避免注册最终化回调,而是将“yield 之后”视为 teardown 代码。感谢 Andreas Pelme、Vladimir Keleshev、Floris Bruynooghe、Ronny Pfannschmidt 等人的讨论。

  • 如果也指定了“reason”,则允许直接使用 skipif/xfail 的布尔表达式。重新编写跳过文档以推荐“条件作为布尔值”,因为这可以防止在模块之间导入标记时出现意外。将条件指定为字符串将继续得到完全支持。

  • 报告:根据失败/错误是否发生或所有都通过,将最后一行着色为红色或绿色。感谢 Christian Theunert。

  • 使“import pdb ; pdb.set_trace()”在捕获方面原生工作(不再需要“-s”),使 pytest.set_trace() 仅仅是一个快捷方式。

  • 修复 issue181:–pdb 现在也适用于收集错误(和内部错误)。这是通过轻微的内部重构和引入新的钩子 pytest_exception_interact 钩子(参见下一项)来实现的。

  • 修复 issue341:引入新的实验性钩子,供 IDE/终端拦截调试:pytest_exception_interact(node, call, report)

  • 新的 monkeypatch.setattr() 变体,用于提供更短的调用来修补模块中的类/函数。

    monkeypatch.setattr(“requests.get”, myfunc)

    将用 myfunc 替换“requests”模块的“get”函数。

  • 修复 issue322:如果 setUpClass 失败,tearDownClass 不会运行。感谢 Mathieu Agopian 的初步修复。同时使所有 pytest/nose finalizer 模仿相同的通用行为:如果 setupX 存在并失败,则不运行 teardownX。这在内部引入了一个新方法“node.addfinalizer()”助手,该助手只能在节点的设置阶段调用。

  • 简化 pytest.mark.parametrize() 签名:允许传递逗号分隔的字符串来指定 argnames。例如:pytest.mark.parametrize("input,expected",  [(1,2), (2,3)]) 与以前的:pytest.mark.parametrize(("input", "expected"), ...) 一样有效。

  • 添加对 setUpModule/tearDownModule 检测的支持,感谢 Brian Okken。

  • 通过使用“argcomplete”集成选项的制表符补全。感谢 Anthon van der Neut 提供的 PR。

  • 将选项名称更改为连字符分隔的长选项,但保持旧的拼写向后兼容。py.test -h 将只显示连字符版本,例如“–collect-only”,但“–collectonly”也将保持有效(出于向后兼容性原因)。非常感谢 Anthon van der Neut 的实现和 Hynek Schlawack 的推动。

  • 修复 issue 308 - 允许在参数化时标记/xfail/跳过单个参数集。感谢 Brianna Laugher。

  • 调用新的实验性 pytest_load_initial_conftests 钩子,允许第三方插件在加载 conftest 之前做一些事情。

Bug 修复

  • 修复 issue358 - 捕获选项现在通过使用新的 parser.parse_known_args 方法解析得更正确。

  • pytest 现在使用 argparse 而不是 optparse(感谢 Anthon),这意味着如果安装到 python2.6 或更低版本环境中,“argparse”将作为依赖项添加。

  • 修复 issue333:修复一个不好的 unittest/pytest 钩子交互案例。

  • PR27:在收集期间正确处理 nose.SkipTest。感谢 Antonio Cuni,Ronny Pfannschmidt。

  • 修复 issue355:junitxml 将 name=”pytest” 属性添加到 testsuite 标签。

  • 修复 issue336:插件中的自动使用 fixture 应该再次工作。

  • 修复 issue279:改进标准数据类型断言失败时的对象比较并识别 collections.abc。感谢 Brianna Laugher 和 Mathieu Agopian。

  • 修复 issue317:断言重写器支持 is_package 方法。

  • 修复 issue335:记录从 pytest.raises() 返回的 py.code.ExceptionInfo() 对象,感谢 Mathieu Agopian。

  • 从 setup.py 中移除隐式 distribute_setup 支持。

  • 修复 issue305:忽略写入 pyc 文件时的任何问题。

  • SO-17664702:即使 fixture 函数部分失败,也会调用 fixture finalizer(以前 finalizer 不总是被调用)。

  • 修复 issue320 - 修复 fixture 的类作用域与模块级函数混合使用时的问题。感谢 Anatoly Bubenkoff。

  • 您可以指定“-q”或“-qq”以获得不同级别的“更安静”报告(感谢 Katarzyna Jachim)。

  • 修复 issue300 - 修复在子目录中启动 py.test 时 conftest 加载顺序的问题。

  • 修复 issue323 - 许多模块作用域参数化参数的排序。

  • 使 sessionfinish 钩子以与会话开始时相同的 cwd 上下文执行(有助于修复使用相对路径写入输出文件的插件行为,例如 pytest-cov)。

  • 修复 issue316 - 正确引用文档中的收集钩子。

  • 修复 issue 306 - 清理 -k/-m 选项以分别仅匹配标记/测试名称/关键字。感谢 Wouter van Ackooy。

  • 改进了 python 模块中 doctests 的 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) 钩子现在可以使用“.section(title)”和“.line(msg)”方法在测试运行结束时打印额外信息。

2.3.5 (2013-04-30)

  • 修复 issue169:也尊重 setup/teardown 错误的 –tb=style。

  • 从不将 fixture 函数用于测试函数收集。

  • 允许重新运行测试项 / 有助于修复 pytest-reruntests 插件,也有助于保持更少的 fixture/资源引用。

  • 将捕获的 stdout/stderr 放入 junitxml 输出,即使对于通过的测试也是如此(感谢 Adam Goucher)。

  • Issue 265 - 将 nose setup/teardown 与 setupstate 集成,这样如果它没有 setup 就不会尝试 teardown。

  • issue 271 - 不要在 worker 节点上写入 junitxml。

  • Issue 274 - 当 doctest 不知道示例位置时,不要尝试显示完整的 doctest 示例。

  • issue 280 - 在有 bug 的 CPython 2.6.0 上禁用断言重写。

  • 注入“getfixture()”助手以从 doctests 检索 fixture,感谢 Andreas Zeidler。

  • issue 259 - 当断言重写时,与 Python 2 上默认的 ASCII 源编码保持一致。

  • issue 251 - 报告跳过而不是忽略带有 init 的类。

  • issue250 unicode/str 在参数化名称和值中混合现在可以工作。

  • issue257,断言触发的以注释行结尾的源代码编译在 python2.5 中不会崩溃(通过 py>=1.4.13.dev6 修复)。

  • 修复 –genscript 选项以生成也适用于 python3.3 的独立脚本(导入器排序)。

  • issue171 - 在断言重写中,显示一些全局变量的 repr。

  • 修复“-k”的选项帮助。

  • 将分发包的长描述移至 README.rst。

  • 改进 metafunc.parametrize() 的 docstring。

  • 修复在测试函数中使用 capsys 与 pytest.set_trace() 时查看 capsys.readouterr() 会中断的 bug。

  • 允许在自定义 python_functions 测试发现时指定以“_”开头的 Prefixes。(感谢 Graham Horler)

  • 通过将额外数据放在新行并增加缩进来改进 PYTEST_DEBUG 跟踪输出。

  • 确保跳过/失败等 OutcomeExceptions 已初始化异常属性。

  • issue 260 - 不在普通的 unittest 用例上使用 nose 特殊设置。

  • 修复 issue134 - 打印阻止运行指定测试项的收集错误。

  • 修复 issue266 - 接受 MarkEvaluator 表达式中的 unicode。

2.3.4 (2012-11-20)

  • 生成的测试函数现在将激活自动使用 fixture,但不能接受 fixture 作为 funcargs - 无论如何,建议使用 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 拆卸的 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 的 request 对象,该对象在没有活动请求时会因 getattr 访问而崩溃。感谢 Thomas Waldmann。

  • 修复 issue213 - 允许使用不支持 __eq__ 运算符的值(如 numpy 数组)进行参数化。

  • 修复 issue215 - 将 test_python.org 拆分为多个文件。

  • 修复 issue148 - @unittest.skip on classes 现在被识别并避免调用 setUpClass/tearDownClass,感谢 Pavel Repin。

  • 修复 issue209 - 通过依赖于重新引入了 pre-AST 解释器语句查找的新 pylib 版本,重新引入 python2.4 支持。

  • nose 支持:仅当 setup 是 callable 时才调用,感谢 Andrew Taumoefolau。

  • 修复 issue219 - 将 py2.4-3.3 分类器添加到 TROVE 列表。

  • 在回溯中,*,** 参数值现在与普通参数一起显示(感谢 Manuel Jacob)。

  • 修复 issue217 - 支持 mock.patch 与 pytest 的 fixture - 请注意,您需要 mock-1.0.1 或 python3.3 内置的 unittest.mock。

  • 修复 issue127 - 改进 pytest_addoption() 的文档,并添加一个 config.getoption(name) 助手函数以保持一致性。

2.3.2 (2012-10-25)

  • 修复 issue208 和 issue29 使用新的 py 版本,以避免在长模块中打印回溯时长时间暂停。

  • 修复 issue205 - 子目录中自定义 pytest_pycollect_makemodule 和 pytest_pycollect_makeitem 的 conftest 现在可以正常工作。

  • 修复参数化设置的拆卸顺序。

  • 修复 issue127 - 更好地记录 pytest_addoption 和相关对象。

  • 修复 unittest 行为:仅当定义了测试方法时才调用 TestCase.runtest。

  • 改进 trial 支持:不收集其空的 unittest.TestCase.runTest() 方法。

  • “python setup.py test”现在可以使用 pytest 本身。

  • 修复/改进内部/打包相关部分。

    • test_nose.py 的异常消息检查现在在 python33 上也通过了。

    • issue206 - 修复 test_assertrewrite.py,使其在存在全局 PYTHONDONTWRITEBYTECODE=1 时也能工作。

    • 将 tox.ini 添加到 pytest 分发包中,以便为运行 pytest 自身测试的维护者正确分发 ignore-dirs 和其他配置位。

2.3.1 (2012-10-20)

  • 修复 issue202 - 修复回归:从 fixture 函数中使用“self”现在按预期工作(它是使用 fixture 的测试方法所看到的相同的“self”实例)。

  • 由于 pexpect 不支持(挂起),在 freebsd* 系统上跳过使用 pexpect 的测试(主要是 test_pdb.py)。

  • 从 –markers 输出链接到网页,为 pytest.mark.* 的使用提供帮助。

2.3.0 (2012-10-19)

  • 修复 issue202 - 更好地为参数化测试函数自动命名。

  • 修复 issue139 - 引入 @pytest.fixture,它允许直接作用域和参数化 funcarg 工厂。

  • 修复 issue198 - 在某些情况下,由于路径操作问题,带有嵌套目录结构的 windows32 无法找到 conftest fixture。

  • 修复 issue193 跳过参数化为空参数集的测试函数。

  • 修复 python3.3 兼容性,主要是之前依赖于字典顺序的报告部分。

  • 引入按资源和参数化设置重新排序测试,这优先于通常的文件排序。

  • 修复 issue185 monkeypatching time.time 不会导致 pytest 失败。

  • 修复 issue172 pytest.fixture 装饰的 setup_module 函数重复调用。

  • 修复 junitxml=path 构造,以便如果测试更改了当前工作目录且路径是相对路径,它能从原始当前工作目录正确构造。

  • 修复“python setup.py test”示例以导致正确的“errno”返回。

  • 修复 issue165 - 修复损坏的文档链接并提及 Stack Overflow 中的常见问题解答。

  • 捕获将失败表示写入终端时的 unicode 问题,以防止整个会话崩溃。

  • 修复 xfail/skip 混淆:skip-mark 或命令式 pytest.skip 现在优先于 xfail-markers,因为在跳过的情况下我们无法确定 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__ 对象的魔术全局 callable(例如 mock.call)而失败。

  • 修复 issue 182:testdir.inprocess_run 现在考虑传入的插件。

  • 修复 issue 188:确保 sys.exc_info 在 python2 上是清晰的。

    在调用测试之前。

  • 修复 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:正确匹配所有无效的 xml 字符以进行 junitxml 二进制转义。

  • 修复 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 钩子现在都提供了“nextitem”,它为 None 表示测试运行结束。

  • 修复由于未知来源收集项导致的收集崩溃,感谢 Ralf Schmitt(通过依赖更近期的 pylib 修复)。

2.2.0 (2011-11-18)

  • 修复 issue90:引入测试项的急切拆卸,以便更早地调用拆卸函数。

  • 添加一个功能强大的 metafunc.parametrize 函数,它允许分多步参数化测试函数参数,因此可以从独立的插件和位置进行参数化。

  • 添加 @pytest.mark.parametrize 助手,它允许使用不同的参数值轻松调用测试函数。

  • 在“参数化”示例页面中添加示例,包括测试场景的快速移植以及新的参数化函数和装饰器。

  • 通过 ini 文件或插件钩子引入“pytest.mark.*”助手的注册。还引入了“–strict”选项,它将未注册的标记视为错误,从而避免拼写错误并为您的测试套件维护一组描述良好的标记。请参阅 https://pytest.cn/en/stable/how-to/mark.html 及其链接中的示例。

  • issue50:引入“-m marker”选项,根据标记选择测试(这是“-k”更严格和更可预测的版本,因为“-m”只匹配完整的标记,并且具有更明显的 and/or 语义规则)。

  • 新功能,有助于优化测试速度:–durations=N 选项用于显示 N 个最慢的测试调用和 setup/teardown 方法。

  • 修复 issue87:–pastebin 现在可以在 python3 上使用。

  • 修复 issue89:–pdb 在 doctest 中出现意外异常时更合理地工作。

  • 修复并清理 pytest 自身的测试套件,使其不泄漏 FD。

  • 修复 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 钩子应用于测试子集。

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 钩子中工作。

  • 修复 issue60 / 修复涉及创建 __pycache__ 的错误条件。

  • 修复 issue63 / 涉及包含“%”字符串的插入的断言重写。

  • 修复带有 ** 参数的调用上的断言重写。

  • 如果禁用字节码生成,则不缓存重写模块。

  • 修复只读目录中的断言重写。

  • 修复 issue59:为 junitxml 输出提供 system-out/err 标签。

  • 修复 issue61:3 个或更多操作数的布尔运算上的断言重写。

  • 您现在可以使用“cd doc ; make man”构建手册页。

2.1.0 (2011-07-09)

  • 修复 issue53 以正确的顺序调用 nosestyle setup 函数。

  • 修复 issue58 和 issue59:新的断言代码修复。

  • 合并 Benjamin 的断言重写分支:现在 Python 2.6 及更高版本上的测试模块的断言是通过重写 AST 并在导入测试模块之前保存 pyc 文件来完成的。有关详细信息,请参阅 doc/assert.txt。

  • 修复 issue43:改进 doctests,在出现意外异常时提供更好的回溯报告。

  • 修复 issue47:junitxml 中测试用例的计时输出现在正确。

  • 修复 issue48:MarkInfo repr 中的拼写错误导致异常。

  • 修复 issue49:避免在初始化部分失败时出现令人困惑的错误。

  • 修复 issue44:junitxml 文件路径的环境/用户名扩展。

  • 在 pypy 的测试运行中显示 releaselevel 信息。

  • 重构文档页面以实现更好的导航和 PDF 生成。

  • 即使在会话启动期间中断,也报告 KeyboardInterrupt。

  • 修复 issue 35 - 提供 PDF 文档版本和索引页面的下载链接。

2.0.3 (2011-05-11)

  • 修复 issue38:对钩子调用(特别是早期的 configure/sessionstart 钩子)进行更友好的回溯。

  • 修复 junitxml 文件中缺失的跳过原因/元信息,通过 http://lists.idyll.org/pipermail/testing-in-python/2011-March/003928.html 报告。

  • 修复 issue34:避免带有“test”前缀的派生自对象的类导致收集失败。

  • 在实际未使用 –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 钩子生成的测试函数调用。

  • 修复 issue27 - collectonly 和关键字选择 (-k) 现在可以协同工作。此外,如果您执行“py.test –collectonly -q”,您现在会得到一个扁平的测试 ID 列表,您可以将其粘贴到 py.test 命令行以执行特定测试。

  • 修复 issue25 避免报告 –pdb 和 python3.2/编码输出的问题。

  • 修复 issue23 - tmpdir 参数现在在 Python3.2 和 WindowsXP 上可用。从 Python3.2 开始,os.symlink 可能受支持。通过要求较新的 py lib 版本,py.path.local() 实现会承认这一点。

  • 修复了文档中的拼写错误(感谢 Victor Garcia,Brianna Laugher),特别感谢 Laura Creighton 也审查了部分文档。

  • 修复 verbose 进度报告中类输出的轻微错误(感谢 Amaury)。

  • 更精确地(避免)node.Class|Function 访问的弃用警告。

  • 避免回溯中的标准 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 兼容性测试与 python3 兼容(现在 nose-1.0 支持 python3)。

  • 移除有些令人惊讶的“相同-conftest”检测,因为它在多个子目录中出现 conftest.py 时会忽略它们。

  • 改进断言(“not in”),感谢 Floris Bruynooghe。

  • 改进在“python -OO”上运行时(断言和文档字符串被关闭,可能导致假阳性)的行为/警告。

  • 引入 pytest_cmdline_processargs(args) 钩子,允许命令行参数的动态计算。这修复了回归,因为 py.test 在 2.0 之前允许从 conftest.py 文件设置命令行选项,而 pytest-2.0 至今只允许从 ini 文件设置。

  • 修复 issue7:doctest 模块中的断言失败。doctests 中意外的失败通常会显示得更清晰,即在 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 插件。

  • 修复由于 collection-before-running 语义导致的已生成的测试的回归,这些测试未像 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 - 标记现在也适用于 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”创建,现在将创建与测试名称更好地关联的 basename(感谢 Ronny)。

  • “xpass”(意外通过)测试不会导致 exitcode!=0。

  • 修复 issue131 / issue60 - 在用作命名空间包的 __init__ 文件中导入 doctests。

  • 修复 bug:导入 conftest.py 时捕获 stdout/stderr。

  • 修复 bug:unittest 收集的函数现在也可以在类/模块级别应用“pytestmark”。

  • 添加对 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 作为上下文管理器,示例。

    with py.test.raises(ZeroDivisionError):
        x = 0
        1 / x
    
    with py.test.raises(RuntimeError) as excinfo:
        call_something()
    
    # you may do extra checks on excinfo.value|type|traceback here
    

    (感谢 Ronny Pfannschmidt)

  • Funcarg 工厂现在可以动态地对测试调用应用标记。例如,如果工厂为测试提供预期会失败的参数,这会很有用。

    def pytest_funcarg__arg(request):
        request.applymarker(py.test.mark.xfail(reason="flaky config"))
        ...
    
    def test_function(arg):
        ...
    
  • 改进了收集和导入错误报告。这利用了一个更通用的机制,即对于自定义测试项/收集节点,现在统一调用 node.repr_failure(excinfo),这样您可以覆盖它以返回您选择的字符串错误表示,该表示将作为(红色)字符串报告。

  • 引入“–junitprefix=STR”选项,用于在 junitxml 文件中所有报告前添加前缀。

Bug 修复

  • 使测试以及 pytest_recwarn 插件特别是完全兼容 Python2.7(如果您使用 recwarn funcarg,警告将被启用,以便您可以跨 Python 正确检查它们的存在)。

  • 完善 –pdb:忽略 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-plugin 中执行分布式测试相关报告,而不是在通用 py.test 分发包中包含与分布式相关的代码。

  • 修复 Windows 上的 homedir 检测。

  • 发布 distribute_setup.py 版本 0.6.13。

1.3.1 (2010-05-25)

新功能

  • issue91:引入新的 py.test.xfail(reason) 助手,用于命令式地将测试标记为预期失败。可以在 setup 和测试函数中使用。这对于参数化测试特别有用,当某些配置预期失败时。在这种情况下,不能使用带有 @py.test.mark.xfail 的声明式方法,因为它会标记所有配置为 xfail。

  • issue102:引入新的 –maxfail=NUM 选项,在 NUM 次失败后停止测试运行。这是‘-x’或‘–exitfirst’选项的推广,现在它等同于‘–maxfail=1’。‘-x’和‘–maxfail’现在都会在末尾打印一行指示中断。

  • issue89:允许 py.test.mark 装饰器用于类(类装饰器是在 python2.6 中引入的),并且还允许通过指定列表在类/模块级别应用多个标记。

  • 改进和完善进度条中的字母报告:. 通过 f 失败的测试 s 跳过的测试(提醒:仅用于依赖/平台不匹配)x 预期失败的测试(预期失败但失败的测试)X 预期失败但通过的测试(预期失败但通过的测试)

    您可以将“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”字符任意组合组成的字符串参数。它们与你在点状进度打印期间看到的单个字符相关,并会在测试运行结束时为每个测试打印一行额外信息。这额外的一行指示了你可以直接粘贴到 py.test 命令行以重新运行特定测试的确切位置或测试 ID。

  • 允许外部插件通过新的 pytest_addhooks(pluginmanager) 钩子注册新的钩子。新发布的用于分布式和循环失败测试的 pytest-xdist 插件需要此功能。

  • 添加新的 pytest_ignore_collect(path, config) 钩子,允许项目和插件为其目录结构定义排除行为 - 例如,您可以在 conftest.py 中定义此方法。

    def pytest_ignore_collect(path):
        return path.check(link=1)
    

    以防止甚至在符号链接目录中尝试收集任何测试。

  • 新的 pytest_pycollect_makemodule(path, parent) 钩子,允许自定义匹配测试模块的 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 组合,但请注意:jython2.5.1/win32 不提供命令行启动器,请参见 https://bugs.jython.org/issue1491。有关如何解决此问题,请参阅 pylib 安装文档。

  • 修复 unicode 异常值和不可打印对象的处理

  • (issue87) 修复 assertionold 代码中的 unboundlocal 错误

  • (issue86) 改进 looponfailing 的文档

  • 完善 IO 捕获:stdin-redirect 伪文件现在具有 NOP close() 方法

  • 发布 distribute_setup.py 版本 0.6.10

  • 添加了指向新的 capturelog 和 coverage 插件的链接

1.2.0 (2010-01-18)

  • 完善了“py.cleanup”的用法和选项

    py.cleanup     # remove "*.pyc" and "*$py.class" (jython) files
    py.cleanup -e .swp -e .cache # also remove files with these extensions
    py.cleanup -s  # remove "build" and "dist" directory next to setup.py files
    py.cleanup -d  # also remove empty directories
    py.cleanup -a  # synonym for "-s -d -e 'pip-log.txt'"
    py.cleanup -n  # dry run, only show what would be removed
    
  • 添加了一个新选项“py.test –funcargs”,它显示给定测试路径可用的 funcargs 及其帮助字符串(其各自工厂函数上的 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”钩子可以返回要在测试运行标题中显示的其他行。

  • (实验性) 允许“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 收集钩子。

  • 特定于收集/项节点的 runtest/collect 钩子仅在完全匹配的 conftest.py 文件上调用,即位于项文件系统路径正下方的文件

  • 更改:第一个返回内容的 pytest_collect_directory 钩子现在将阻止进一步的钩子被调用。

  • 更改:figleaf 插件现在需要 –figleaf 才能运行。还将其长命令行选项缩短了一些(参见 py.test -h)。

  • 更改:pytest doctest 插件现在默认启用,并有一个新选项 –doctest-glob 用于设置文件匹配模式。

  • 更改:删除内部 py._* 助手变量,只保留 py._pydir

  • 增强捕获功能,使其在自定义 pytest_runtest_setup 代码失败并阻止捕获设置代码运行的情况下也能正常工作。

  • 使默认插件提供的 py.test.* 助手在早期可见——对于 pydoc 和交互式会话都透明地工作,例如,它们会定期看到 py.test.mark 和 py.test.importorskip。

  • 简化内部插件管理器机制

  • 通过引入 RootCollector 节点简化内部收集树

  • 修复断言重新解释,该断言会看到包含“keyword=…”的调用

  • 修复 issue66:在分布式测试期间,在工作节点上调用 pytest_sessionstart 和 pytest_sessionfinish 钩子,正确报告模块/会话拆卸钩子。

  • 修复 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 路径:修复了 svn 路径 path.check(versioned=True) 的错误,允许 svn 路径中包含“%”,使 svnwc.update() 默认为交互模式,如 1.0.x 中,并添加 svnwc.update(interactive=False) 以禁用交互。

  • 完善分布式 tarball 以包含测试和无 pyc 文件

  • 更努力地使 py.compat.* 访问的弃用警告报告正确的位置

1.0.3

  • 调整和改进文档

  • 移除 py.rest 工具和内部命名空间 - 它从未真正宣传过,如果需要,仍可与旧版本一起使用。如果有兴趣,我想它可以复活为自己的工具。

  • 修复 issue48 和 issue59:如果导入测试文件中的模块似乎不是来自文件路径,则引发错误 - 避免了反复报告的“同名”混淆

  • 合并了 Ronny 的 nose 兼容性 hack:现在支持 nose 风格的 setup_module() 和 setup() 函数

  • 引入通用化的 py.test.mark 函数标记

  • 重组/完善命令行分组

  • 弃用 parser.addgroup,转而使用创建选项组的 getgroup

  • 添加 –report 命令行选项,允许控制跳过/xfail 部分的显示

  • 通用化跳过:一种基于平台或 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 在这方面的帮助。

  • 整合内置实现以兼容 >=2.3,添加助手以方便保持 2 和 3k 兼容代码

  • 弃用 py.compat.doctest|subprocess|textwrap|optparse

  • 弃用 py.magic.autopath,移除 py/magic 目录

  • 将 pytest 断言处理移至 py/code 和 pytest_assertion 插件,添加“–no-assert”选项,弃用 py.magic 命名空间,转而使用(更少的)py.code 命名空间。

  • 整合并清理 py/code 类和文件

  • 清理 py/misc,将测试移至 bin-for-dist

  • 在 py.test 的 monkeypatch funcarg 中引入 delattr/delitem/delenv 方法

  • 整合 py.log 实现,移除旧方法。

  • 引入 py.io.TextIO 和 py.io.BytesIO 用于区分文本/unicode 和字节流(如果可用,使用底层标准库 io.*)

  • 提供 py.unittest_convert 助手脚本,该脚本将“unittest.py”风格的文件转换为更简单的 assert/direct-test-classes py.test/nosetests 风格。该脚本由 Laura Creighton 编写。

  • 简化内部 localpath 实现

1.0.2 (2009-08-27)

  • 修复打包问题,由 fedora redhat 打包触发,还在 tarball 中添加了 doc、examples 和 contrib 目录。

  • 添加了指向新的 django 插件的文档链接。

1.0.1 (2009-08-19)

  • 添加了一个“pytest_nose”插件,该插件处理 nose.SkipTest、nose 风格的函数/方法/生成器 setup/teardown,并尝试正确报告函数。

  • 对 sys.stdout/err 的 unicode 写入或编码字符串的捕获效果更好,终端写入也进行了调整,并在 Windows 和 Linux 之间统一了。

  • 大大改进了文档布局和内容

  • 添加了“–help-config”选项以显示所有 longopt 命令行选项的 conftest.py / ENV-var 名称,以及一些特殊的 conftest.py 变量。相应地将“conf_capture”conftest 设置重命名为“option_capture”。

  • 修复 issue #27:更好地报告命令行上给定的不可收集项(例如 pyc 文件)

  • 修复 issue #33:添加 –version 标志(感谢 Benjamin Peterson)

  • 修复 issue #32:为 wcpath.status() 添加了对“不完整”路径的支持

  • 如果“Test”前缀的类有 __init__ 方法,则默认不再收集它们

  • monkeypatch setenv() 现在接受“prepend”参数

  • 改进了收集错误追溯的报告

  • 简化了 multicall 机制和插件架构,重命名了一些内部方法和参数名

1.0.0 (2009-08-04)

  • 更简洁的报告,尝试显示文件系统路径相对于当前目录

  • 稍微改善 xfail 输出

1.0.0b9 (2009-07-31)

  • 干净地处理和报告测试设置的最终拆卸

  • 修复 svn-1.6 与 py.path.svnwc().versioned() 的兼容性问题(感谢 Wouter Vanden Hove)

  • 设置/拆卸或收集问题现在显示为 ERROR 或进度行中的大“E”。它们被单独报告和计数。

  • 分布式测试:正确处理在本地收集但在远程无法收集的测试项——通常是由于平台/依赖关系原因

  • 简化的 py.test.mark API - 请参阅关键字插件文档

  • 更好地与日志记录集成:捕获现在默认将测试函数及其直接的 setup/teardown 捕获到一个流中

  • capsys 和 capfd funcargs 现在有一个 readouterr() 和一个 close() 方法(底层使用了 py.io.StdCapture/FD 对象,它们也增加了一个 readouterr() 方法来返回捕获的 out/err 快照)

  • 使断言重新解释更好地处理不返回布尔值的比较(来自 numpy,感谢 maciej fijalkowski 报告)

  • 将每个测试的输出捕获重构到 pytest_iocapture.py 插件中,从而从配置对象中删除了捕获代码

  • 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” - 添加了一个新的讲座/教程文档页面 - 更好的下载页面 - 更好的插件 docstrings - 添加了新的插件页面和自动文档生成脚本

  • 修复了与部分失败的 funcarg 设置相关的拆卸问题(感谢 MrTopf 报告),现在即使“pytest_runtest_setup”失败,“pytest_runtest_teardown”也总是被调用。

  • 调整了 py 模块中 docstrings 的 doctest 输出,感谢 Radomir。

1.0.0b7

  • 将 py.test.xfail 重命名回 py.test.mark.xfail,以避免两种装饰 xfail 的方式

  • 重新添加了 py.test.mark 装饰器用于在函数上设置关键字(它实际上有文档,所以移除它不太好)

  • 从 request.addfinalizer() 中移除 scope 参数,因为 request.cached_setup 有 scope 参数。TOOWTDI。

  • 在报告失败之前执行设置最终化

  • 应用 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 对象,允许将函数的执行 fork 到子进程并获取结果。

XXX 此处缺少很多内容 XXX

0.9.2

  • 完善了安装和元数据,创建了新的 setup.py,现在基于 setuptools/ez_setup(感谢 Ralf Schmitt 的支持)。

  • 改进了在 Windows 环境中提供 py.* 脚本的方式,它们现在以“.cmd”文件的形式添加到 Scripts 目录中。

  • py.path.svnwc.status() 现在更完整,如果可用,使用“svn”命令的 xml 输出 (Guido Wesdorp)

  • 修复 py.path.svn* 以与 svn 1.5 兼容 (Chris Lamb)

  • 修复 Windows 上 path.relto(otherpath) 方法,使用 normcase 检查路径是否相对。

  • py.test 的追溯信息更容易从编辑器解析(遵循 filenames:LINENO: MSG 约定)(感谢 Osmo Salomaa)

  • 修复 javascript-generation,“py.test –runbrowser”现在应该更可靠地工作

  • 移除了先前意外添加的 py.test.broken 和 py.test.notimplemented 助手。

  • 现在有一个 py.__version__ 属性

0.9.1

这是 v0.9.1 的一个相当完整的列表,可以作为开发人员的参考。

  • 允许在 py.path.svn 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 中对非版本化文件的 wcpath 调用 .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 中调用 atexit (py.execnet) [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]