Pytest从测试中传递任意信息

时间:2017-04-12 15:03:15

标签: python html report pytest

我正在编写一个python插件,用于pytest测试结果的自定义HTML报告。我想在测试中存储一些任意测试信息(即一些python对象......),然后在编写报告时我想在报告中重用这些信息。到目前为止,我只是带来了一些黑客解决方案。

我将request对象传递给我的测试,并用我的数据填充request.node._report_sections部分。 然后将此对象传递给TestReport.sections属性,该属性可通过钩子pytest_runtest_logreport获取,最后我可以生成HTML,然后从sections属性中删除所有对象。

在pseudopythoncode中:

def test_answer(request):
    a = MyObject("Wooo")
    request.node._report_sections.append(("call","myobj",a))    
    assert False

def pytest_runtest_logreport(report):
    if report.when=="call":
        #generate html from report.sections content
        #clean report.sections list from MyObject objects
        #(Which by the way contains 2-tuples, i.e. ("myobj",a)) 

有更好的pytest方法吗?

1 个答案:

答案 0 :(得分:0)

这种方式似乎没问题。 改进我可以建议:

考虑使用fixture来创建MyObject对象。然后,您可以将request.node._report_sections.append(("call","myobj",a))置于夹具内,并使其在测试中不可见。像这样:

@pytest.fixture
def a(request):
    a_ = MyObject("Wooo")
    request.node._report_sections.append(("call","myobj",a_))
    return a_

def test_answer(a):
    ...

另一个想法,适用于您在所有测试中使用此对象的情况,是实现其中一个挂钩pytest_pycollect_makeitempytest_pyfunc_call和&# 34;植物"首先是那里的对象。