跳转到主要内容

pytest插件,用于重新运行测试以消除不可靠的失败

项目描述

pytest-rerunfailures

pytest-rerunfailures 是一个针对 pytest 的插件,用于重新运行测试以消除间歇性失败。

License PyPI GitHub Actions

需求

要使用 pytest-rerunfailures,您需要以下先决条件

  • Python 3.8+ 或 PyPy3

  • pytest 7.2 或更高版本

此插件可以在以下可选先决条件下从硬崩溃中恢复

  • pytest-xdist 2.3.0 或更高版本

此包目前正在与最后一个 5 个次要版本的 pytest 进行测试。如果您使用的是较旧版本的 pytest,您应考虑更新或使用此包的早期版本。

安装

安装 pytest-rerunfailures

$ pip install pytest-rerunfailures

从硬崩溃中恢复

如果某个或多个测试触发硬崩溃(例如:段错误),则此插件通常无法重新运行测试。但是,如果安装了兼容版本的 pytest-xdist,并且测试在 pytest-xdist 中使用 -n 标志运行,则此插件可以重新运行崩溃的测试,假设工作器和控制器在同一局域网内(此假设对于几乎所有情况都是有效的,因为大多数情况下工作器和控制器在同一个计算机上)。如果此假设不成立,则此功能可能无法正常工作。

重新运行所有失败

要重新运行所有测试失败,请使用 --reruns 命令行选项并指定您希望测试运行的最大次数

$ pytest --reruns 5

失败的 fixture 或 setup_class 也会重新执行。

要添加重新运行之间的延迟时间,请使用 --reruns-delay 命令行选项并指定您希望在下一次测试重新运行之前等待的秒数

$ pytest --reruns 5 --reruns-delay 1

重新运行匹配特定表达式的所有失败

要仅重新运行匹配特定表达式列表的失败,请使用 --only-rerun 标志并将其传递给正则表达式。例如,以下操作将仅重新运行匹配 AssertionError 的错误

$ pytest --reruns 5 --only-rerun AssertionError

多次传递标志将累积参数,因此以下操作将仅重新运行匹配 AssertionErrorValueError 的错误

$ pytest --reruns 5 --only-rerun AssertionError --only-rerun ValueError

重新运行除匹配特定表达式之外的所有失败

要仅重新运行不匹配特定表达式列表的失败,请使用 --rerun-except 标志并将其传递给正则表达式。例如,以下操作将仅重新运行不匹配 AssertionError 的错误

$ pytest --reruns 5 --rerun-except AssertionError

多次传递标志将累积参数,因此以下操作将仅重新运行不匹配 AssertionErrorOSError 的错误

$ pytest --reruns 5 --rerun-except AssertionError --rerun-except OSError

重新运行单个失败

要将单个测试标记为 flaky,并在失败时自动重新运行,请使用 `flaky` 标记并指定测试希望运行的最大次数

@pytest.mark.flaky(reruns=5)
def test_example():
    import random
    assert random.choice([True, False])

请注意,当 tear down 失败时,将生成两个报告,一个用于测试用例,另一个用于 tear down 错误。

您还可以在标记中指定重新运行延迟时间

@pytest.mark.flaky(reruns=5, reruns_delay=2)
def test_example():
    import random
    assert random.choice([True, False])

您还可以在重新运行标记中指定一个可选的条件

@pytest.mark.flaky(reruns=5, condition=sys.platform.startswith("win32"))
def test_example():
   import random
   assert random.choice([True, False])

异常过滤可以通过指定 only_rerunrerun_except 的正则表达式来实现。它们分别覆盖了命令行参数 --only-rerun--rerun-except

参数可以是一个单独的字符串

@pytest.mark.flaky(rerun_except="AssertionError")
def test_example():
    raise AssertionError()

或者一个字符串列表

@pytest.mark.flaky(only_rerun=["AssertionError", "ValueError"])
def test_example():
    raise AssertionError()

您可以使用 @pytest.mark.flaky(condition) 类似于 @pytest.mark.skipif(condition),见 pytest-mark-skipif

@pytest.mark.flaky(reruns=2,condition="sys.platform.startswith('win32')")
def test_example():
    import random
    assert random.choice([True, False])
# totally same as the above
@pytest.mark.flaky(reruns=2,condition=sys.platform.startswith("win32"))
def test_example():
  import random
  assert random.choice([True, False])

请注意,当 condition 为真时,测试将会重新运行。

输出

以下是一个示例,展示了插件在用 --reruns 2-r aR 运行时的输出

test_report.py RRF

================================== FAILURES ==================================
__________________________________ test_fail _________________________________

    def test_fail():
>       assert False
E       assert False

test_report.py:9: AssertionError
============================ rerun test summary info =========================
RERUN test_report.py::test_fail
RERUN test_report.py::test_fail
============================ short test summary info =========================
FAIL test_report.py::test_fail
======================= 1 failed, 2 rerun in 0.02 seconds ====================

请注意,输出将显示所有重新运行的结果。在所有重新运行中失败的测试将被标记为失败。

兼容性

  • 此插件 不能 与类、模块和包级别的 fixtures 一起使用。

  • 此插件与 pytest-xdist 的 –looponfail 标志不兼容。

  • 此插件与核心 –pdb 标志不兼容。

  • 此插件与插件 flaky 不兼容,您只能有 pytest-rerunfailuresflaky,但不能同时拥有两者。

资源

开发

  • 测试执行次数可以从测试 item 对象的 execution_count 属性中检索。示例

    @hookimpl(tryfirst=True)
    def pytest_runtest_makereport(item, call):
        print(item.execution_count)

变更日志

14.0 (2024-03-13)

错误修复

  • 修复仅使用 only_rerun 或 rerun_except 查询时非函数作用域 fixtures 的缺少 teardown。(#234) 和 (#241)

破坏性更改

  • 停止支持 Python 3.7。

  • 停止支持 pytest < 7.2。

功能

  • 添加对 pytest 8.0、8.1 的支持。

13.0 (2023-11-22)

破坏性更改

  • 停止支持 pytest < 7.0。

功能

  • 添加对 Python 3.12 的支持。

错误修复

  • 修复客户端和服务器之间 crashitem 名称不匹配的问题。(#172)

  • 修复在带有 –rerun-except 标志的设置失败时的崩溃。(#230)

12.0 (2023-07-05)

破坏性更改

  • 停止支持 pytest < 6.2。

功能

  • only_rerunrerun_except 参数添加到 @pytest.mark.flaky 标记。

  • 添加对 pytest 7.3、7.4 的支持。

错误修复

  • 现在,只有当失败与至少一个 --only-rerun 模式(如果有)匹配,并且与任何 --rerun-except 模式不匹配时,才会重新运行失败。以前,使用 --only-rerun--rerun-except 一起可能会导致即使它们不匹配任何 --only-rerun 模式,也会重新运行失败,并且在使用多个 --rerun-except 模式时,除非它们匹配每个模式,否则所有失败都会重新运行。(#225)

11.1.2 (2023-03-09)

错误修复

  • 在 fixtures 的设置阶段跳过测试时执行 teardown。

11.1.1 (2023-02-17)

错误修复

  • 修复在另一个插件覆盖 runtest 协议钩子时 teardown 期间的崩溃。

  • 修复当使用 TestCase 类作为基类时 teardown 期间的崩溃。

11.1 (2023-02-09)

错误修复

  • 在重新运行测试后,只对会话、类、…作用域的 fixtures 执行一次 teardown。

功能

  • 通过 pytest.ini 文件公开 rerunsreruns_delay

11.0 (2023-01-12)

破坏性更改

  • 停止支持 Python 3.6。

  • 停止支持 pytest < 6。

错误修复

  • 修复当 pytest-xdist 已安装但禁用时崩溃的问题。(感谢 @mgorny 的 PR。)

  • 修复使用 –rerun-only 标志时与 xfail(strict=True) 标记一起使用时的崩溃。

功能

  • 添加 --rerun-except 选项,以重新运行除了提到的错误之外的所有失败的测试。

  • 添加对Python 3.11的支持。

  • 添加对pytest 7.0、7.1、7.2的支持。

10.2 (2021-09-17)

功能

  • 允许使用pytest-xdist从崩溃的测试中恢复。

  • 添加对Python 3.10的支持(截至Python 3.10.rc2)。感谢(GitHub:@hugovk)提交的Pull Request。

10.1 (2021-07-02)

功能

  • 允许使用str作为@pytest.mark.flaky(condition)的条件,它将动态评估,类似于@pytest.mark.skipif(condition)。(由@15klli提供,GitHub:#162

10.0 (2021-05-26)

向后不兼容的更改

  • 取消对Python 3.5的支持。

  • 取消对pytest < 5.3的支持。

功能

  • condition关键字参数添加到重新运行标记中。(感谢@BeyondEvil提交的Pull Request。)

  • 添加对Python 3.9的支持。(感谢@digitronik提交的Pull Request。)

  • 添加对pytest 6.3的支持。(感谢@bluetech提交的Pull Request。)

  • 添加对pytest-xdist >= 2.0的兼容性。(感谢@bluetech提交的Pull Request。)

其他更改

  • 按功能而不是按版本检查resultlog,因为pytest主分支不提供一致的版本。

9.1.1 (2020-09-29)

兼容性修复。

  • 当与pytest >= 6.1.0一起使用时,忽略--result-log命令行选项,因为它已被移除。这是一个快速修复,如果您想现在保留此功能,请使用较旧的pytest版本。(感谢@ntessore提交的Pull Request)

  • 支持到pytest 6.1.0。

9.1 (2020-08-26)

功能

  • 添加新的标志--only-rerun,允许用户仅重新运行某些错误。

其他更改

  • 取消对mock的依赖。

  • 添加对pre-commit的支持,并添加一个linting tox目标。(由@gnikonorov提交的Pull Request,GitHub:#117

9.0 (2020-03-18)

向后不兼容的更改

  • 取消对pytest版本4.4、4.5和4.6的支持。

  • 取消对Python 2.7的支持。

功能

  • 添加对pytest 5.4的支持。

  • 添加对Python 3.8的支持。

8.0 (2019-11-18)

向后不兼容的更改

  • 取消对pytest版本3.10、4.0、4.1、4.2和4.3的支持。

  • 取消对Python 3.4的支持。

功能

  • 添加对pytest版本4.4、4.5、4.6、5.0、5.1和5.2的支持。

错误修复

  • 显式依赖setuptools以确保在没有其的环境中安装。由@Eric-Arellano提交的Pull Request,GitHub:#98

7.0 (2019-03-28)

向后不兼容的更改

  • 取消对pytest版本3.8和3.9的支持。

功能

  • 添加对pytest版本4.2和4.3的支持。

错误修复

  • 修复了关于忽略pytest_runtest_logfinish钩子的问题#83。(由@KillAChicken提交的Pull Request,GitHub:#83

6.0 (2019-01-08)

向后不兼容的更改

  • 取消对pytest版本3.6和3.7的支持。

功能

  • 添加对pytest版本4.0和4.1的支持。

错误修复

  • 修复了4.2版本中引入的与测试报告上的rerun属性相关的回归问题#77。(感谢@RibeiroAna提交的Pull Request)

5.0 (2018-11-06)

  • 取消对pytest版本< 3.6的支持以减少维护负担。

  • 添加对pytest版本3.10的支持,从而支持最新的5个pytest版本。

  • 添加对Python 3.7的支持。

  • 修复了与pytest-flake8一起使用时可能出现的错误#73。

4.2 (2018-10-04)

  • 修复了与setup_classfixture在重新运行时的执行相关的#64问题。(感谢@OlegKuzovkov提交的Pull Request)

  • 根据#67问题添加了新的execution_count属性,以反映测试用例执行的次数。(感谢@OlegKuzovkov提交的PR)。

4.1 (2018-05-23)

  • 通过使用Node.get_closest_marker()支持pytest 3.6。(感谢@The-Compiler提交的PR)。

4.0 (2017-12-23)

  • 添加了在测试重新运行之间添加延迟时间的选项。(感谢@Kanguros提交的PR)。

  • 添加了对pytest >= 3.3的支持。

  • 停止支持pytest < 2.8.7。

3.1 (2017-08-29)

  • 恢复了与pytest-xdist的兼容性。(感谢@davehunt提交的PR)

3.0 (2017-08-17)

  • 添加了对Python 3.6的支持。

  • 添加了对pytest 2.9至3.2的支持。

  • 停止支持Python 2.6和3.3。

  • 停止支持pytest < 2.7。

2.2 (2017-06-23)

  • 确保在其他插件运行此插件之后,在全局设置--rerun=0的情况下。(感谢@sublee提交的PR)

2.1.0 (2016-11-01)

  • 如果调用pytest.mark.flaky()时没有参数,则添加默认值reruns=1

  • 还提供作为通用轮子的发行版。(感谢@tltx提交的PR)

2.0.1 (2016-08-10)

  • 准备pytest 3.0的CLI选项,以避免弃用警告。

  • 通过添加MANIFEST.in来解决创建源分发时缺少CHANGES.rst的错误。

2.0.0 (2016-04-06)

  • 由于支持它变得过于麻烦,停止支持Python 3.2。(原因:Virtualenv 14+ / PIP 8+不再支持Python 3.2。)

1.0.2 (2016-03-29)

  • 通过相应地解析重试来添加对--resultlog选项的支持。(#28)

1.0.1 (2016-02-02)

  • 改进包描述并包含变更日志到描述中。

1.0.0 (2016-02-02)

  • 重写以使用pytest >= 2.3.0的新API。

  • 通过仅记录最终结果来改进pytest-xdist的支持。(记录中间结果将完成测试而不是重新运行。)

项目详细信息


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解安装包的更多信息。

源分发

pytest-rerunfailures-14.0.tar.gz (21.4 kB 查看散列)

构建分发

pytest_rerunfailures-14.0-py3-none-any.whl (12.7 kB 查看散列)

上传于 Python 3

由以下提供支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误日志 StatusPageStatusPage 状态页面