7

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

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

有没有办法我可以做到这一点?

4

3 回答 3

14

你可以,用一个钩子。

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

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

test_rest_author.py我有三个函数,startupteardowntest_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 协议,包括捕获异常和调用报告钩子。它在任何测试完成时调用(例如startuporteardown或您的测试)。

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

$ 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上的文档。

于 2015-03-19T09:02:57.220 回答
1

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

于 2013-01-05T19:28:47.340 回答
0

按照建议使用pytest_runtest_protocol夹具标记解决了我的问题。reports = runtestprotocol(item, nextitem=nextitem)在我的情况下,只需在我的 pytest html 夹具中使用就足够了。因此,要最终确定item元素包含您需要的信息。

非常感谢。

于 2020-05-14T06:04:12.100 回答