Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 当断言失败时,Pytest将跳过contextmanager的后期生成_Python 3.x_Pytest_Yield_Fixtures_Contextmanager - Fatal编程技术网

Python 3.x 当断言失败时,Pytest将跳过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(不是夹具)用于设置和清理测试:

@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将它们作为参数这一事实抛给函数,使得使用各种参数制作多个装置非常不可读