【问题标题】:How to pause pytest timer?如何暂停pytest计时器?
【发布时间】:2021-07-09 10:27:12
【问题描述】:

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

@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) ===========

问题是其中大约 2-3 分钟是表清理。

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

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

我在谷歌上搜索了所有内容,我偶然发现最接近的是freezegun
我试过了,但无法摆脱清理时间,也许我用错了:/
据我了解,它操纵的是 datetime 对象,而不是 pytest 的计时器(机制):(

【问题讨论】:

  • 嗯,这就是总的测试持续时间 - 这是一个统计数据,你为什么要关心缩短它?
  • 为什么“表清理”需要这么长时间?我会努力把它缩短到
  • 因为我需要知道我的新代码在不计算引导步骤的情况下是提高还是降低了性能...
  • 当每行占用几兆字节并且有 1.5B 记录的 HDD 速度较慢时,删除查询可能需要一些时间...
  • 可以添加负责清理表的代码吗?

标签: python datetime pytest freezegun


【解决方案1】:

没有计时器可以停止; pytest 存储会话开始时的时间戳,并打印当前时间和会话结束时的时间戳之间的差异(如果您对代码中计算持续时间的确切位置感到好奇,那就是 here)。如果清理代码未绑定到测试套件的其余部分,您可以将其移动到 pytest_unconfigure 挂钩的自定义 impl 中。示例:

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_configure,因为我想在测试完成后查看结果。
【解决方案2】:

由于无法进行参数化测试,我只是为 pytest 创建了一个 PR - https://github.com/pytest-dev/pytest/issues/8568

让我们看看它是怎么回事:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多