如何在 pytest 中设置每个测试超时的默认值?

use*_*346 8 python pytest

我想强制执行在 pytest 中没有测试需要超过 3 秒。

pytest-timeout ( https://pypi.python.org/pypi/pytest-timeout ) 几乎可以做我想要的......但它似乎允许我设置全局超时(即确保测试套件少于10 分钟)或者,能够在每个测试中手动设置装饰器。

期望的行为: 使用单个设置配置 pytest 以使任何超过 3 秒的单个测试失败。

The*_*ler 6

pytest-timeout 页面

您可以使用 timeout 选项在 py.test 配置文件中设置全局超时。例如:

[pytest]
timeout = 300
Run Code Online (Sandbox Code Playgroud)

  • 这个答案令人困惑,它没有提到如何设置默认的*每次测试*超时的基本困境。现在,文档实际上明确了这一点:“任何花费超过给定持续时间的单独测试都将被终止”因此,虽然答案是正确的,但它并没有明确说明为什么它与问题的这种特定形式相关。 (8认同)

Mar*_*l M 5

您可以使用本地插件。将conftest.py文件放入项目根目录或测试文件夹中,如下所示,将每个测试的默认超时设置为 3 秒;

import pytest

def pytest_collection_modifyitems(items):
    for item in items:
        if item.get_marker('timeout') is None:
            item.add_marker(pytest.mark.timeout(3))
Run Code Online (Sandbox Code Playgroud)

pytest_collection_modifyitemsPytest在收集测试后调用该函数。此处使用它来将超时标记添加到所有测试中。

仅当标记尚不存在时添加标记 ( if item.get_marker...) 可确保您仍然可以@pytest.mark.timeout在需要不同超时的测试中使用装饰器。

另一种可能性是分配给测试模块顶部某处的特殊pytestmark变量:

pytestmark = pytest.mark.timeout(3)
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是您需要将其添加到每个模块中,并且在我的测试中,当我尝试在该模块中的任何位置使用装饰器时,我收到了一条错误消息@pytest.mark.timeout