将py.test的输出读作对象

时间:2017-10-21 17:07:54

标签: python unit-testing pytest python-unittest

之前我在我的项目中使用了python unittest,随之而来的是unittest.TextTestRunnerunittest.defaultTestLoader.loadTestsFromTestCase。我出于以下原因使用它们,

  1. 使用包装函数控制unittest的执行,该函数调用unittests的run方法。我不想要命令行方法。

  2. 从结果对象中读取unittest的输出,并将结果上传到错误跟踪系统,这样我们就可以生成一些关于代码稳定性的复杂报告。

  3. 最近有人决定切换到py.test,如何使用py.test进行上述操作?我不想解析任何CLI / HTML来获取py.test的输出。我也不想在单元测试文件上写太多代码来执行此操作。

    有人可以帮我这个吗?

2 个答案:

答案 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)

了解详情:Writing pytest plugins

所有这一切都可以通过一个简单的可安装库制作的小插件,或者作为伪插件conftest.py轻松完成,它只是在一个测试目录中。

答案 1 :(得分:1)

看起来pytest让你launch from Python code而不是使用命令行。看起来你只是将相同的参数传递给命令行上的函数调用。

Pytest将创建resultlog format files,但该功能已弃用。文档建议使用在{Test Anything Protocol>中生成文件的pytest-tap plugin