之前我在我的项目中使用了python unittest
,随之而来的是unittest.TextTestRunner
和unittest.defaultTestLoader.loadTestsFromTestCase
。我出于以下原因使用它们,
使用包装函数控制unittest的执行,该函数调用unittests的run方法。我不想要命令行方法。
从结果对象中读取unittest的输出,并将结果上传到错误跟踪系统,这样我们就可以生成一些关于代码稳定性的复杂报告。
最近有人决定切换到py.test
,如何使用py.test进行上述操作?我不想解析任何CLI / HTML来获取py.test的输出。我也不想在单元测试文件上写太多代码来执行此操作。
有人可以帮我这个吗?
答案 0 :(得分:3)
您可以使用pytest的钩子拦截测试结果报告:
conftest.py
:
import pytest
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_logreport(report):
yield
# Define when you want to report:
# when=setup/call/teardown,
# fields: .failed/.passed/.skipped
if report.when == 'call' and report.failed:
# Add to the database or an issue tracker or wherever you want.
print(report.longreprtext)
print(report.sections)
print(report.capstdout)
print(report.capstderr)
同样,您可以拦截其中一个钩子以在需要的阶段注入您的代码(在某些情况下,使用try-except yield
):
pytest_runtest_protocol(item, nextitem)
pytest_runtest_setup(item)
pytest_runtest_call(item)
pytest_runtest_teardown(item, nextitem)
pytest_runtest_makereport(item, call)
pytest_runtest_logreport(report)
所有这一切都可以通过一个简单的可安装库制作的小插件,或者作为伪插件conftest.py
轻松完成,它只是在一个测试目录中。
答案 1 :(得分:1)
看起来pytest让你launch from Python code而不是使用命令行。看起来你只是将相同的参数传递给命令行上的函数调用。
Pytest将创建resultlog format files,但该功能已弃用。文档建议使用在{Test Anything Protocol>中生成文件的pytest-tap plugin。