python - 是否调用 pytest_runtest_teardown 来跳过测试,而 pytest_runtest_setup 不是?
问题描述
我有一个实现以下钩子的插件:
def pytest_runtest_setup(item):
item.config.bla = Bla()
def pytest_runtest_teardown(item):
item.config.bla.do_bla()
item.config.bla = None
一切正常,直到一些测试开始抛出AttributeError: 'NoneType' object has no attribute 'do_bla'
,事实上,item.config.bla
是None
这发生在我标记为的测试中
@pytest.mark.skip(reason='bla bla')
def test_bla():
pass
我尝试ipdb
了设置挂钩 - 但它没有被调用,而拆解是。在拆解时不调用设置进行跳过测试是否有意义?
我可以用我的拆解包装,try, except
但我想验证根本原因......
解决方案
问题似乎是pytest_runtest_setup
钩子是由 pytest 本身的几个组件实现的,一个是skipping
模块(_pytest/skipping.py
)。
实现是这样的:
@hookimpl(tryfirst=True)
def pytest_runtest_setup(item):
...
for skip_info in item.iter_markers(name="skip"):
item._store[skipped_by_mark_key] = True
if "reason" in skip_info.kwargs:
skip(skip_info.kwargs["reason"])
elif skip_info.args:
skip(skip_info.args[0])
else:
skip("unconditional skip")
例如,如果它找到一个skip
标记,它就会引发Skipped()
(基本上就是skip
这样),只有在执行任何预测试和测试钩子之后才会捕获它。
我不知道这是否是故意的,但您显然必须期待这种行为(在您的情况下,您可以通过捕获AttributeError
,正如您所写的那样轻松做到这一点)。
推荐阅读
- powerbi - dcast / 融化 / 重塑一个表格,该表格在 Power BI 中使用 DAX 计算列
- django - 外键的自定义下拉菜单
- three.js - 对称分割场景
- linq - 我使用 StartsWith 但它不能通过 linq 在 azure cosmosDB 文档中工作
- json.net - CamelCaseNamingStrategy vs CamelCasePropertyNamesContractResolver
- algorithm - 具有优先图和不同执行时间的 M 机器上的 N 个作业
- python - 在其他列为 NaN 的情况下填写相同数量的字符
- mysql - 为什么我不能对此形成外键?
- regex - 从多行语句中删除数字和特殊字符
- react-native - 如何在 React 本机应用程序中集成 unity3d AR 应用程序