Python 3.x 当断言失败时,Pytest将跳过contextmanager的后期生成
我有一个自定义的contextmanager(不是夹具)用于设置和清理测试:Python 3.x 当断言失败时,Pytest将跳过contextmanager的后期生成,python-3.x,pytest,yield,fixtures,contextmanager,Python 3.x,Pytest,Yield,Fixtures,Contextmanager,我有一个自定义的contextmanager(不是夹具)用于设置和清理测试: @contextmanager def db_content(*args, **kwargs): instance = db_insert( ... ) yield instance db_delete(instance) def test_my_test(): with db_content( ... ) as instance: # ... a
@contextmanager
def db_content(*args, **kwargs):
instance = db_insert( ... )
yield instance
db_delete(instance)
def test_my_test():
with db_content( ... ) as instance:
# ...
assert result
问题是,当断言失败时,db_delete()
code——意思是post-yield语句——不会被执行
我可以看出,如果我使用夹具,这是可行的
@pytest.fixture
def db_instance():
instance = db_insert( ... )
yield instance
db_delete(instance)
def test_my_test(db_instance):
# ...
assert result
然而,固定装置非常不灵活。我希望在每个测试中向上下文传递不同的参数,而使用fixture会迫使我为每个情况定义不同的fixture。如果引发异常,contextlib不会执行post-yield语句。这是故意的。要让它发挥作用,你必须写:
@contextmanager
def db_content(*args, **kwargs):
instance = db_insert( ... )
try:
yield instance
finally:
db_delete(instance)
在我看来,这是违反直觉的,因为尝试并不在收益率本身
我采用了
contextmanager
的实现,并制作了一个安全的版本,正如我所期望的那样工作,但是它是一个完整的代码复制,如果有人有更好的解决方法,我很乐意看到它。你能给出一个实际的可运行示例吗?一个非常简单的示例:fixture可以直接参数化(通过params
arg)或间接地(通过parametrize
marker)。你缺少的装置是什么,迫使你编写自己的上下文管理器?@hoe将它们作为参数这一事实抛给函数,使得使用各种参数制作多个装置非常不可读