【发布时间】:2017-09-21 18:40:31
【问题描述】:
我想强制 pytest 中的任何测试都不会超过 3 秒。
pytest-timeout (https://pypi.python.org/pypi/pytest-timeout) 几乎可以满足我的要求...但它似乎允许我设置全局超时(即确保测试套件花费的时间少于 10 分钟)或者设置手动为每个测试添加一个装饰器。
期望的行为: 使用单个设置配置 pytest 以使任何超过 3 秒的单个测试失败。
【问题讨论】:
我想强制 pytest 中的任何测试都不会超过 3 秒。
pytest-timeout (https://pypi.python.org/pypi/pytest-timeout) 几乎可以满足我的要求...但它似乎允许我设置全局超时(即确保测试套件花费的时间少于 10 分钟)或者设置手动为每个测试添加一个装饰器。
期望的行为: 使用单个设置配置 pytest 以使任何超过 3 秒的单个测试失败。
【问题讨论】:
您可以在 py.test 配置文件中使用 超时选项。例如:
[pytest] timeout = 300
【讨论】:
您可以使用local plugin。将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))
Pytest 在收集测试后调用pytest_collection_modifyitems 函数。此处用于将超时标记添加到所有测试中。
仅在标记不存在时添加标记 (if item.get_marker...) 可确保您仍然可以在需要不同超时的测试中使用 @pytest.mark.timeout 装饰器。
另一种可能性是分配给测试模块顶部某处的special pytestmark variable:
pytestmark = pytest.mark.timeout(3)
这有一个缺点,您需要将它添加到每个模块中,并且在我的测试中,当我尝试在该模块中的任何位置使用 @pytest.mark.timeout 装饰器时收到一条错误消息。
【讨论】:
@pytest.mark.timeout(3) def test_timeout(): while True: x = 1 我对您的回答的解读是,至少这就是所有需要的,“本地插件”和其他东西是为了方便起见。你能澄清一下吗?