1

我正在使用带有pytest-html模块的 pytest 来生成 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钩子。

4

1 回答 1

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")))
于 2017-10-15T10:32:46.180 回答