pytest fixture接管错误报告

时间:2014-09-08 08:50:53

标签: python pytest

我正在编写一个用于实现回归测试的小工具。被测试的函数不包含任何断言语句,但产生的输出与记录的输出进行比较,该输出被认为是正确的。

这是一个简化的片段,用于演示我正在做的事情:

@pytest.yield_fixture()
def regtest(request):

    fp = cStringIO.StringIO()

    yield fp

    reset, full_path, id_ = _setup(request)
    if reset:
        _record_output(fp.getvalue(), full_path)
    else:
        failed = _compare_output(fp.getvalue(), full_path, request, id_)
        if failed:
            pytest.fail("regression test %s failed" % id_, pytrace=False)

一般来说,我的方法有效,但我想改进错误报告,以便夹具指示测试失败而不是测试函数本身:此实现始终打印.,因为测试功能不会引发任何异常,如果在最后一行调用E,则额外pytest.fail

所以我想要的是压制被测试函数触发的.输出,让我的fixture代码输出相应的字符。

更新: 我能够提高输出,但它仍然需要很多“。”在测试运行时的输出中。它是在https://pypi.python.org/pypi/pytest-regtest上传的 您可以在https://sissource.ethz.ch/uweschmitt/pytest-regtest/tree/master

找到存储库

很抱歉发布链接,但文件现在变大了。

解决方案

我想出了一个解决方案,通过实现一个钩子来处理钩子中的regtest结果。然后(简化)代码:

@pytest.yield_fixture()
def regtest(request):
    fp = cStringIO.StringIO()
    yield fp

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_call(item):
    try:
        outcome = yield
    except Exception:
        raise
    else:
        # we only handle regtest fixture if no other other exception came up during testing:
        if outcome.excinfo is not None:
            return

        regtest = item.funcargs.get("regtest")
        if regtest is not None:
            _handle_regtest_result(regtest)

并且_handle_regtest_result可以存储记录的值或进行适当的检查。该插件现已在https://pypi.python.org/pypi/pytest-regtest

处提供

1 个答案:

答案 0 :(得分:0)

你在那里混合两件事:灯具本身(为你的测试设置条件)和预期的行为_compare_output(a,b)。你可能正在寻找一些东西:

import pytest

@pytest.fixture()
def file_fixture():
    fp = cStringIO.StringIO()
    return fp.getvalue()

@pytest.fixture()
def request_fixture(request, file_fixture):
    return _setup(request)

def test_regression(request_fixture, file_fixture):
    reset, full_path, id_ = request_fixture
    if reset:
        _record_output(file_fixture, full_path)
    else:
        failed = _compare_output(file_fixture, full_path, request, id_)
        assert failed is True, "regression test %s failed" % id_