我将 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 文件仅在创建文件后才能在浏览器中打开?
在你的
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
钩子中写入报告,因此您将需要一个自定义的 sessionfinish 钩子。用 trylast=True
标记它,以确保您的钩子实现在 pytest-html
之后运行。config.option.htmlpath
是通过 --html-path
命令行参数传递的内容; config._html.logfile
是 pytest-html
实际用作文件名的内容。 pytest-html
的configure hook完成后就可以访问了,所以我又使用了一次trylast=True
。正如 massimo 所暗示的那样,一个可能的解决方案是使用 hook,特别是
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)
您可以尝试使用hooks代替使用固定装置。
过去我和他们一起做了一些有趣的事情,不幸的是我不记得在运行的最后是否有电话,但可能是的
您可以链接控制台命令来运行测试并打开报告。
我不确定你会如何使用默认报告器来做到这一点,但是使用 Allure Report,bat 文件将如下所示:
set SCRIPT_DIR=%~dp0
set SCRIPT_DIR=%SCRIPT_DIR:~0,-1%
pytest --alluredir "%SCRIPT_DIR%\allure-results" && allure serve "%SCRIPT_DIR%\allure-results"
第二个命令仅在第一个命令执行后运行,因此不会出现不确定性问题。作为奖励,您将获得一份漂亮且详细的报告。
您必须安装 Allure,然后将 PyTest 集成添加到您的项目中。