在 pytest 拆解装置中在 Yield 和 addfinalizer 之间进行选择

问题描述 投票:0回答:1

我最近开始使用 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 装置中的拆卸操作。但是,我很难找到清晰的文档和示例来解释这两种方法之间的主要区别以及何时选择其中一种方法。

以下是问题(用于快进:)):

  1. 在 pytest 装置中使用yield 和 addfinalizer 来处理拆卸的主要区别是什么?
  2. 是否存在特定场景中其中一种优于另一种?
python pytest fixtures
1个回答
0
投票

主要区别在于,使用

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

就这么简单:)

© www.soinside.com 2019 - 2024. All rights reserved.