我想在运行时获取测试名称和测试结果。
我的脚本中有setup
和tearDown
方法。在setup
中,我需要获取测试名称,在中tearDown
我需要获取测试结果和测试执行时间。
有没有办法我可以做到这一点?
我想在运行时获取测试名称和测试结果。
我的脚本中有setup
和tearDown
方法。在setup
中,我需要获取测试名称,在中tearDown
我需要获取测试结果和测试执行时间。
有没有办法我可以做到这一点?
你可以,用一个钩子。
我的测试目录中有这些文件:
./rest/
├── conftest.py
├── __init__.py
└── test_rest_author.py
在test_rest_author.py
我有三个函数,startup
和teardown
,test_tc15
但我只想显示结果和名称test_tc15
。
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
orteardown
或您的测试)。
如果您运行脚本,您可以看到测试的结果和名称:
$ 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上的文档。
unittest.TestCase.id() 这将返回完整的详细信息,包括类名、方法名。从中我们可以提取测试方法名称。可以通过检查执行测试是否有异常来获得结果。如果测试失败,那么如果 sys.exc_info() 返回 None 那么测试通过,否则测试将失败。
按照建议使用pytest_runtest_protocol
夹具标记解决了我的问题。reports = runtestprotocol(item, nextitem=nextitem)
在我的情况下,只需在我的 pytest html 夹具中使用就足够了。因此,要最终确定item
元素包含您需要的信息。
非常感谢。