Pytest不会在夹具生成器中抛出异常

时间:2019-07-25 10:50:55

标签: python pytest

在pytest中,可以通过将固定器添加到夹具中,方法是将固定器变成生成器,并在第一个(也是唯一的)yield之后提供固定代码。

我很惊讶地发现异常没有被扔回到生成器中。我想这很有道理,否则用户将总是必须用try ... except或类似方法包装yield

我希望的是这样的事情:

import pytest

@pytest.fixture
def some_val():
    return 42

@pytest.fixture
def a_val(some_val):
    try:
        yield some_val
    except Exception as e:
        print(f"An exception occurred: {e}")

def test_a_val(a_val):
    raise ValueError("Something bad happened..")

为此,我想添加一个例程以提供有关特定类型错误的一些其他调试信息,并且我真的不想将此代码本身放入测试中。

理想情况下,我将使用上下文管理器包装收益以捕获异常,但这显然在这里遇到了相同的问题。

有没有其他pytest方式可以使我不知道的这项工作?

1 个答案:

答案 0 :(得分:0)

对于其他想要这种行为的人,可以使用pytest的一个钩子对其进行模拟,在这种情况下,pytest_pyfunc_call会很好地工作。

conftest.py

import pytest

@pytest.hookimpl(hookwrapper=True)
def pytest_pyfunc_call(pyfuncitem):
    print("Hook executing...")

    funcargs = pyfuncitem.funcargs
    testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames}
    print(f"funcargs: {funcargs}")
    print(f"testargs: {testargs}")
    try:
        outcome = yield
        outcome.get_result()
    except Exception as e:
        print(f"Got exception: {e}")
        raise