跳到内容

pytest-fixture-finalizer-callback (PT021)

源自 flake8-pytest-style linter。

作用

检查 pytest fixtures 中不必要的 request.addfinalizer 用法。

为什么这不好?

pytest 提供了两种在 fixture 代码中执行清理的方法。第一种是顺序执行(通过 yield 语句),第二种是基于回调(通过 request.addfinalizer)。

顺序方法更具可读性,应优先使用,除非 fixture 使用“工厂作为 fixture”模式。

示例

import pytest


@pytest.fixture()
def my_fixture(request):
    resource = acquire_resource()
    request.addfinalizer(resource.release)
    return resource

建议改为

import pytest


@pytest.fixture()
def my_fixture():
    resource = acquire_resource()
    yield resource
    resource.release()


# "factory-as-fixture" pattern
@pytest.fixture()
def my_factory(request):
    def create_resource(arg):
        resource = acquire_resource(arg)
        request.addfinalizer(resource.release)
        return resource

    return create_resource

参考