pytest插件,用于重新运行测试以消除不可靠的失败
项目描述
pytest-rerunfailures
pytest-rerunfailures 是一个针对 pytest 的插件,用于重新运行测试以消除间歇性失败。
需求
要使用 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
多次传递标志将累积参数,因此以下操作将仅重新运行匹配 AssertionError 或 ValueError 的错误
$ pytest --reruns 5 --only-rerun AssertionError --only-rerun ValueError
重新运行除匹配特定表达式之外的所有失败
要仅重新运行不匹配特定表达式列表的失败,请使用 --rerun-except 标志并将其传递给正则表达式。例如,以下操作将仅重新运行不匹配 AssertionError 的错误
$ pytest --reruns 5 --rerun-except AssertionError
多次传递标志将累积参数,因此以下操作将仅重新运行不匹配 AssertionError 或 OSError 的错误
$ 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_rerun 和 rerun_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-rerunfailures 或 flaky,但不能同时拥有两者。
资源
开发
测试执行次数可以从测试 item 对象的 execution_count 属性中检索。示例
@hookimpl(tryfirst=True) def pytest_runtest_makereport(item, call): print(item.execution_count)
变更日志
14.0 (2024-03-13)
错误修复
破坏性更改
停止支持 Python 3.7。
停止支持 pytest < 7.2。
功能
添加对 pytest 8.0、8.1 的支持。
13.0 (2023-11-22)
破坏性更改
停止支持 pytest < 7.0。
功能
添加对 Python 3.12 的支持。
错误修复
12.0 (2023-07-05)
破坏性更改
停止支持 pytest < 6.2。
功能
将 only_rerun 和 rerun_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 文件公开 reruns 和 reruns_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)
功能
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_class和fixture在重新运行时的执行相关的#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的支持。(记录中间结果将完成测试而不是重新运行。)