我最近开始使用 pytest 在 Python 中进行测试,并创建了一个固定装置来使用 gRPC 管理项目集合。下面是我的装置的代码片段:
import pytest
@pytest.fixture(scope="session")
def collection():
grpc_page = GrpcPages().collections
def create_collection(collection_id=None, **kwargs):
default_params = {
"id": collection_id,
"is_active": True,
# some other params
}
try:
return grpc_page.create_collection(**{**default_params, **kwargs})
except Exception as err:
print(err)
raise err
yield create_collection
def delete_created_collection():
# Some code to hard and soft delete created data
这是我第一次尝试创建夹具,我意识到我需要一种机制来删除在夹具生命周期期间创建的数据。
在探索实现拆卸过程的选项时,我遇到了yield 和addfinalizer。据我了解,两者都可以用来定义 pytest 装置中的拆卸操作。但是,我很难找到清晰的文档和示例来解释这两种方法之间的主要区别以及何时选择其中一种方法。
以下是问题(用于快进:)):
主要区别在于,使用
addfinalizer
,您可以根据需要添加任意数量的终结器,这在复杂的拆卸场景中很有用。
如果您的设置和拆卸很简单,则无需使用
addfinalizer
:
@pytest.fixture
def resource():
resource = create_resource()
yield resource
resource.cleanup()
但是如果您需要例如多个清理步骤,
addfinalizer
允许您以更易读的方式执行此操作:
@pytest.fixture
def resource(request):
resource = create_resource()
request.addfinalizer(resource.cleanup)
request.addfinalizer(resource.log)
...
return resource
就这么简单:)