Pytest: поиск времени начала и окончания каждого теста - PullRequest
6 голосов
/ 26 апреля 2020

У меня есть комплексный набор тестов Django -Pytest с большим количеством тестов, которые выполняются в параллельных процессах. Я хотел бы видеть точный момент времени, в который каждый тест начинался и заканчивался. Как я могу получить эту информацию из Pytest?

1 Ответ

4 голосов
/ 26 апреля 2020

метки времени запуска / остановки для каждой фазы вызова хранятся в объектах CallInfo. Однако доступ к ним для отчетов не очень удобен, поэтому лучше хранить обе метки времени в объектах отчета. Поместите следующий код в файл conftest.py в вашем проекте / тесте root dir:

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

Теперь, когда у вас есть каждый отчет, улучшенный со временем запуска / остановки, обработайте их так, как вам нужно, например, распечатав их в пользовательском разделе после выполнения теста. Расширьте свой 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 ==============================

Обратите внимание, что в приведенном выше * Пример 1018 * hookimpl, я печатаю только время фазы call (время выполнения тестовой функции). Если вы хотите увидеть или включить временные метки этапов настройки / завершения теста, отфильтруйте terminalreporter.stats по объектам отчета с report.when == 'setup' / report.when == 'teardown' соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...