在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方式可以使我不知道的这项工作?
答案 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