Pytest: как отобразить сгенерированный отчет после пробного запуска? - PullRequest
0 голосов
/ 27 августа 2018

Я использую 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 ]

0 голосов
/ 27 августа 2018

Как подсказывает нам massimo , возможное решение состоит в использовании крюка , в частности 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)
0 голосов
/ 27 августа 2018

В вашем 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 еще раз.
0 голосов
/ 27 августа 2018

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

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

...