如何暂停pytest计时器?

How to pause pytest timer?

我有一个参数化 (py) 测试,可以在 运行 逻辑之前清理数据库中的一些 table:

@pytest.mark.parametrize('limit', [1, 1000, 5000000])
def test_calc(limit):
    # clean test table in database !!!
    assert calc(limit) == None

在测试结束时我得到:

=========== 3 passed in 357.65s (0:05:57) ===========

问题是 table 清理工作大约需要 2-3 分钟。

如何在清理前暂停计时器并在清理完成后继续计时?

就像在 Golang 的测试库中一样 - T.StopTimer() & T.StartTime()

我搜索了整个 google,我偶然发现的最接近的是 freezegun
我试过了,但无法摆脱清理时间,可能是我用错了:/
据我所知,它操纵日期时间对象而不是 pytest 的计时器(机制):(

没有计时器可以停止; pytest 在会话开始时存储时间戳,并在会话结束时打印当前时间和时间戳之间的差异(如果您对代码中计算持续时间的确切位置感到好奇,它是 here). If the cleanup code is not tied to the rest of the test suite, you can move it into a custom impl of the pytest_unconfigure挂钩。示例:

import time
import pytest


@pytest.fixture(autouse=True)
def db():
    yield
    import time
    time.sleep(3)


def test_db():
    assert True

运行 测试会产生

============================== 1 passed in 3.01s ==============================

将数据库清理移至 hookimpl:

# conftest.py

import time


def pytest_unconfigure(config):
    import time
    time.sleep(3)

报告的持续时间现在是

============================== 1 passed in 0.01s ==============================

由于参数化测试无法这样做,我刚刚创建了一个 pytest PR - https://github.com/pytest-dev/pytest/issues/8568

让我们看看进展如何:)