我想在运行时获取测试名称和测试结果。
我的脚本中有setup
和tearDown
方法。在setup
中,我需要获取测试名称,并且在tearDown
中我需要获取测试结果并测试执行时间。
我有办法做到这一点吗?
答案 0 :(得分:12)
你可以使用钩子。
我在测试目录中有这些文件:
./rest/
├── conftest.py
├── __init__.py
└── test_rest_author.py
在test_rest_author.py
我有三个功能,startup
,teardown
和test_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协议,包括捕获异常和调用报告钩子。任何测试结束时都会调用它(例如startup
或teardown
或您的测试)。
如果您运行脚本,您可以看到测试的结果和名称:
$ 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 hooks和conftest.py上的文档。
答案 1 :(得分:0)
unittest.TestCase.id()这将返回完整的详细信息,包括类名,方法名。 从中我们可以提取测试方法名称。 通过检查执行测试是否有任何异常,可以获得结果。 如果测试失败,那么如果sys.exc_info()返回None,则测试通过,否则测试将失败。
答案 2 :(得分:0)
根据夹具标记的建议使用pytest_runtest_protocol
解决了我的问题。就我而言,仅在我的pytest html固定装置中使用reports = runtestprotocol(item, nextitem=nextitem)
就足够了。因此,最终确定item
元素包含您需要的信息。
非常感谢。