Pytest:查找每个测试何时开始和结束

Pytest: Finding when each test started and ended

我有一个复杂的 Django-Pytest 测试套件,其中包含许多 运行 并行处理的测试。我想查看每个测试开始和结束的确切时间点。我怎样才能从 Pytest 中获取这些信息?

每个调用阶段的 start/stop 时间戳存储在 CallInfo 对象中。但是,访问它们以进行报告并不是很方便,因此最好将这两个时间戳都存储在报告对象中。将以下代码放入 project/test 根目录的 conftest.py 文件中:

import pytest


@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()
    report.start = call.start
    report.stop = call.stop

现在您已将每个报告增强 start/stop 次,按照您需要的方式处理它们,例如在测试执行后将它们打印在自定义部分中。通过以下方式增强您的 conftest.py 文件:

def pytest_terminal_summary(terminalreporter):
    terminalreporter.ensure_newline()
    terminalreporter.section('start/stop times', sep='-', bold=True)
    for stat in terminalreporter.stats.values():
        for report in stat:
            if report.when == 'call':
                start = datetime.fromtimestamp(report.start)
                stop = datetime.fromtimestamp(report.stop)
                terminalreporter.write_line(f'{report.nodeid:20}: {start:%Y-%m-%d %H:%M:%S} - {stop:%Y-%m-%d %H:%M:%S}')

示例测试的测试执行

def test_spam():
    time.sleep(1)


def test_eggs():
    time.sleep(2)

现在产量:

test_spam.py ..                                                         [100%]

------------------------------ start/stop times -------------------------------
test_spam.py::test_spam: 2020-04-26 13:29:05 - 2020-04-26 13:29:06
test_spam.py::test_eggs: 2020-04-26 13:29:06 - 2020-04-26 13:29:08
============================== 2 passed in 3.03s ==============================

注意上面的pytest_terminal_summary hookimpl例子,我只打印了call阶段的时间(测试函数的执行次数)。如果您想查看或包含测试 setup/teardown 阶段的时间戳,请分别使用 report.when == 'setup'/report.when == 'teardown' 按报告对象过滤 terminalreporter.stats