pytest-fixture-finalizer-callback (PT021)
Derived from the flake8-pytest-style linter.
What it does
Checks for unnecessary request.addfinalizer usages in pytest fixtures.
Why is this bad?
pytest offers two ways to perform cleanup in fixture code. The first is
sequential (via the yield statement), the second callback-based (via
request.addfinalizer).
The sequential approach is more readable and should be preferred, unless the fixture uses the "factory as fixture" pattern.
Example
import pytest
@pytest.fixture()
def my_fixture(request):
resource = acquire_resource()
request.addfinalizer(resource.release)
return resource
Use instead:
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