【问题标题】:How can I set a default per test timeout in pytest?如何在 pytest 中为每个测试超时设置默认值?
【发布时间】:2017-09-21 18:40:31
【问题描述】:

我想强制 pytest 中的任何测试都不会超过 3 秒。

pytest-timeout (https://pypi.python.org/pypi/pytest-timeout) 几乎可以满足我的要求...但它似乎允许我设置全局超时(即确保测试套件花费的时间少于 10 分钟)或者设置手动为每个测试添加一个装饰器。

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

【问题讨论】:

    标签: python pytest


    【解决方案1】:

    来自pytest-timeout page

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

    [pytest]
    timeout = 300
    

    【讨论】:

      【解决方案2】:

      您可以使用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 我对您的回答的解读是,至少这就是所有需要的,“本地插件”和其他东西是为了方便起见。你能澄清一下吗?
      • 你安装了pytest-timeout吗?要为单个测试设置超时,请参阅 stackoverflow.com/questions/19527320 。这个问题/答案是关于将超时应用于所有测试,其中使用本地插件是一种选择。
      猜你喜欢
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      相关资源
      最近更新 更多