我想强制 pytest 中的测试时间不超过 3 秒。
pytest-timeout(https://pypi.python.org/pypi/pytest-timeout)几乎做了我想要的......但它似乎允许我设置一个全局超时(即确保测试套件花费不到 10 分钟),或者能够在每个测试上手动设置装饰器。
期望的行为: 使用单个设置配置 pytest 以使任何超过 3 秒的单独测试失败。
您可以在 py.test 配置文件中使用以下命令设置全局超时 超时选项。例如:
[pytest] timeout = 300
您可以使用本地插件。将
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
装饰器。
另一种可能性是分配给测试模块顶部某处的特殊
pytestmark
变量:
pytestmark = pytest.mark.timeout(3)
这有一个缺点,您需要将其添加到每个模块中,在我的测试中,当我尝试在该模块中的任何位置使用
@pytest.mark.timeout
装饰器时,我收到了一条错误消息。
要为每个单独的测试全局设置超时,您有两个主要选项
pytest --timeout 3 tests
[pytest]
timeout = 3
[tool.pytest.ini_options]
timeout = 3