HTML-отчет Pytest: как получить имя файла отчета?

Я использую pytest с модулем pytest-html для генерации отчета о тестировании HTML.

На этапе разрыва я автоматически открываю сгенерированный отчет HTML в браузере с webbrowser.open('file:///path_to_report.html') - это работает нормально, но я запускаю тест с разными аргументами, и для каждого набора аргументов я задаю отдельный файл отчета через аргументы командной строки:

pytest -v mytest.py::TestClassName --html=report_localhost.html

Мой разрушающий код выглядит так:

@pytest.fixture(scope='class')
def config(request):
    claz = request.cls
    claz.host = request.config.getoption("--host", default=HOST_DEFAULT)
    ...

    def teardown_env():
        print('destroying test harness')
        webbrowser.open("file:///path_to_report_localhost.html")

    request.addfinalizer(teardown_env)

    return "prepare_env"

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

⚠️ Обновление

Использование осветителя класса для отображения сгенерированного HTML не является правильным подходом, потому что pytest-html подключает генерацию отчета к области финализатора сеанса, что означает, что к моменту вызова финализатора класса отчет еще не сгенерирован, и вам может потребоваться обновить страницу браузера, чтобы увидеть отчет. И если кажется, что это работает, это только потому, что открытию окна браузера может потребоваться несколько дополнительных секунд, что может позволить завершить создание отчета к моменту загрузки файла в браузер.

Правильный способ сделать это объясняется в этом ответе и сводится к использованию pytest_unconfigure крюк.

1 ответ

Решение

Вы можете установить точку останова в приборе и посмотреть на request.config.option объект - это место, где pytest помещает все ключи argparsed.

Тот, который вы ищете request.config.option.htmlpath,

@pytest.fixture(scope='class')
def config(request):
    claz = request.cls
    claz.host = request.config.getoption("--host", default=HOST_DEFAULT)

    yield 100   # a value of the fixture for the tests

    print('destroying test harness')
    webbrowser.open("file:///{}".format(request.config.option.htmlpath))

Или вы можете сделать то же самое, что и для --host ключ:

@pytest.fixture(scope='class')
def config(request):
    claz = request.cls
    claz.host = request.config.getoption("--host", default=HOST_DEFAULT)

    yield 100   # a value of the fixture for the tests

    print('destroying test harness')
    webbrowser.open("file:///{}".format(request.config.getoption("--html")))
Другие вопросы по тегам