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)
Вместо использования светильников вы можете попробовать использовать крючки.
В прошлом я делал с ними что-то интересное, к сожалению, я не помню, звонили ли они в самом конце пробега, но, вероятно, да