【发布时间】:2018-09-12 05:23:46
【问题描述】:
我有一个自定义上下文管理器(不是固定装置)用于设置和清理测试:
@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() 代码 - 即后 yield 语句,并没有被执行。
我可以看到,如果我使用固定装置,这确实有效。
@pytest.fixture
def db_instance():
instance = db_insert( ... )
yield instance
db_delete(instance)
def test_my_test(db_instance):
# ...
assert result
但是,固定装置非常不灵活。我想在每个测试中将不同的参数传递给我的上下文,而使用固定装置会迫使我为每种情况定义不同的固定装置。
【问题讨论】:
-
你能展示一个实际可运行的例子吗?
-
一个非常简单的例子:pastebin.com/aS1j7iRV
-
fixtures 可以直接(通过
paramsarg)或间接(通过parametrize标记)进行参数化。您在强制您编写自己的上下文管理器的固定装置上缺少什么? -
@hoefling 事实上它们是函数的参数,这使得用各种参数制作多个夹具非常不可读
标签: python-3.x pytest yield fixtures contextmanager