Pytest: как отобразить сгенерированный отчет после пробного запуска?

Я использую pytest в сочетании с плагином pytest-html, который генерирует отчет в формате HTML после запуска теста.

Я использую автоматическое фиксированное время сеанса для автоматического открытия сгенерированного отчета HTML в браузере:

@pytest.fixture(scope="session", autouse=True)
def session_wrapper(request):
    print('Session wrapper init...')
    yield

    # open report in browser on Mac or Windows, skip headless boxes
    if platform.system() in ['Darwin', 'Windows']:
        html_report_path = os.path.join(request.config.invocation_dir.strpath, request.config.option.htmlpath)
        open_url_in_browser("file://%s" %html_report_path)

Приведенный выше код работает, но не согласованно, поскольку иногда браузер пытается загрузить файл до его создания, что приводит к ошибке "файл не найден" и требует обновления браузера вручную для отображения отчета.

Я понимаю, что scope="session" является самой широкой доступной областью, и я предположил, что pytest-html должен завершить генерацию отчета до конца сеанса, но, очевидно, это не так.

Вопрос в том, как правильно подключить код автозапуска отчета браузера. Может ли быть так pytest-html также подключается к области видимости финализатора сеанса? В таком случае, как убедиться, что файл HTML открыт в браузере только после того, как файл был создан?

3 ответа

В вашем conftest.py:

import pytest

@pytest.hookimpl(trylast=True)
def pytest_configure(config):
    config._htmlfile = config._html.logfile


@pytest.hookimpl(trylast=True)
def pytest_sessionfinish(session, exitstatus):
    file = session.config._htmlfile
    # invoke the file opening in external tool
    os.system('open ' + file)

Заметки:

  • pytest-html пишет отчет в pytest_sessionfinish перехват, так что вам понадобится пользовательский перехват сессионного завершения. Отметьте это с trylast=True чтобы ваш крюк после pytest-htmlодин.
  • config.option.htmlpath это то, что передается через --html-path аргумент командной строки; config._html.logfile это что pytest-html на самом деле использует в качестве имени файла. Это доступно после pytest-htmlНастроить крючок заканчивается, поэтому я использовал trylast=True еще раз.

Как подсказал Массимо, возможное решение состоит в том, чтобы использовать крючок, особенно pytest_unconfigure которые могут быть размещены в conftest.py так что это доступно для всех тестов.

def pytest_unconfigure(config):
    if platform.system() in ['Darwin', 'Windows']:
        html_report_path = os.path.join(config.invocation_dir.strpath, config.option.htmlpath)
        open_url_in_browser("file://%s" % html_report_path)

Вместо использования светильников вы можете попробовать использовать крючки.

В прошлом я делал с ними что-то интересное, к сожалению, я не помню, звонили ли они в самом конце пробега, но, вероятно, да

Другие вопросы по тегам