Skip to content

parametrize with scope breaks fixture dependencies #13248

@Anton3

Description

@Anton3

Reproducer:

import pytest


@pytest.fixture(scope="session")
def my_fixture(request):
    return getattr(request, "param", None)


@pytest.fixture(scope="session")
def another_fixture(my_fixture):
    return my_fixture


@pytest.mark.parametrize("my_fixture", ["a"], indirect=True, scope="function")
def test_foo(another_fixture):
    pass

Produces the following error:

ScopeMismatch: You tried to access the function scoped fixture my_fixture with a session scoped request object. Requesting fixture stack:

def another_fixture(my_fixture):

Requested fixture:
my_fixture

parametrize with scope is sometimes important for test isolation:
#9287 (comment)

The bug is not reproduced consistently, it may be hidden if the fixture is already evaluated by a function-scoped fixture. For example:

import pytest


@pytest.fixture(scope="session")
def my_fixture(request):
    return getattr(request, "param", None)


@pytest.fixture(scope="session")
def another_fixture(my_fixture):
    return my_fixture


# autouse to make this fixture run first.
@pytest.fixture(scope="function", autouse=True)
def hack(my_fixture):
    pass


@pytest.mark.parametrize("my_fixture", ["a"], indirect=True, scope="function")
def test_foo(hack, another_fixture):
    pass

This does not return any errors, works as expected.

Metadata

Metadata

Assignees

No one assigned

    Labels

    topic: fixturesanything involving fixtures directly or indirectly

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions