如何在pytest运行时获取测试名称和测试结果

时间:2013-01-02 11:59:03

标签: pytest

我想在运行时获取测试名称和测试结果。

我的脚本中有setuptearDown方法。在setup中,我需要获取测试名称,并且在tearDown中我需要获取测试结果并测试执行时间。

我有办法做到这一点吗?

3 个答案:

答案 0 :(得分:12)

你可以使用钩子。

我在测试目录中有这些文件:

./rest/
├── conftest.py
├── __init__.py
└── test_rest_author.py

test_rest_author.py我有三个功能,startupteardowntest_tc15,但我只想显示test_tc15的结果和名称。< / p>

如果您还没有conftest.py文件,请创建该文件并添加:

import pytest
from _pytest.runner import runtestprotocol

def pytest_runtest_protocol(item, nextitem):
    reports = runtestprotocol(item, nextitem=nextitem)
    for report in reports:
        if report.when == 'call':
            print '\n%s --- %s' % (item.name, report.outcome)
    return True

钩子pytest_runtest_protocol为给定的测试项实现runtest_setup / call / teardown协议,包括捕获异常和调用报告钩子。任何测试结束时都会调用它(例如startupteardown或您的测试)。

如果您运行脚本,您可以看到测试的结果和名称:

$ py.test ./rest/test_rest_author.py
====== test session starts ======
/test_rest_author.py::TestREST::test_tc15 PASSED
test_tc15 --- passed
======== 1 passed in 1.47 seconds =======

另请参阅pytest hooksconftest.py上的文档。

答案 1 :(得分:0)

unittest.TestCase.id()这将返回完整的详细信息,包括类名,方法名。 从中我们可以提取测试方法名称。 通过检查执行测试是否有任何异常,可以获得结果。 如果测试失败,那么如果sys.exc_info()返回None,则测试通过,否则测试将失败。

答案 2 :(得分:0)

根据夹具标记的建议使用pytest_runtest_protocol解决了我的问题。就我而言,仅在我的pytest html固定装置中使用reports = runtestprotocol(item, nextitem=nextitem)就足够了。因此,最终确定item元素包含您需要的信息。

非常感谢。