Skip to content

Scope of parameterized fixture doesn't work #12086

Description

@gjambaisivanandham

I am fairly new to pytest and I see that scope of a parameterized fixture is not working.

Here is an example of the fixture and the test:

@pytest.fixture(scope='session')
def my_fixture(request):
       # make some API calls
       # print API call response
       return response

Tests

@pytest.mark.parametrize('my_fixture',['a','b']):
def test_scenario_1(my_fixture):
      assert response['text'] == 'abc' 

@pytest.mark.parametrize('my_fixture',['a','b']):
def test_scenario_2(my_fixture):
      assert response['image'] == 'def' 

When I run the tests I see the API responses printed 4 times(twice for a parameter and twice for b parameter). I was expecting it to be printed just twice(once for both the parameters - a and b) since both the tests use same set of parameters and the fixed is scoped session. Obviously, if I don't parameterize the fixture the api response is printed once. Pytest version is 7.4.2

Activity

  1. RonnyPfannschmidt commented on Mar 8, 2024

    @RonnyPfannschmidt
    Member

    I believe there was a fix for this in the 8 series

    We should warn better about implicit indirect parameters having different scopes

  2. gjambaisivanandham commented on Mar 8, 2024

    @gjambaisivanandham
    Author

    I believe there was a fix for this in the 8 series

    We should warn better about implicit indirect parameters having different scopes

    I just tried with the latest version 8.0.2 and the issue exists in it.

  3. added
    type: bugproblem that needs to be addressed
    topic: fixturesanything involving fixtures directly or indirectly
    on Mar 12, 2024
  4. WarrenTheRabbit commented on Mar 17, 2024

    @WarrenTheRabbit
    Contributor

    Thank you for posting, @gjambaisivanandham. I'm new to pytest as well so I am interested in exploring and understanding your issue.

    These may be silly remarks coming from my ignorance of session scope but:

    • do your examples have syntax errors? It looks to me like response isn't defined in the body of your test functions, for example.
    • aren't you overriding the session fixture by directly parametrizing the test functions?
    • to not override your session fixture, shouldn't indirect=True be used?

    Is this the fixture usage your are expecting from file.py below. Note that test_scenario_1 uses indirect=True in my example.

    import pytest
    
    @pytest.fixture(scope='session')
    def my_fixture(request):
        """I am being used."""
        pass
        
    @pytest.mark.parametrize('my_fixture', ['a','b'], indirect=True)
    def test_scenario_1(my_fixture):
        pass
    
    @pytest.mark.parametrize('my_fixture', ['a','b'])
    def test_scenario_2(my_fixture):
        pass

    Fixture usage:

    $ pytest file.py --fixtures-per-test
    -------------------------- fixtures used by test_scenario_1[a] ---------------------------
    -------------------------------------- (file.py:10) --------------------------------------
    my_fixture -- file.py:4
        I am being used.
    
    -------------------------- fixtures used by test_scenario_1[b] ---------------------------
    -------------------------------------- (file.py:10) --------------------------------------
    my_fixture -- file.py:4
        I am being used.
    
    -------------------------- fixtures used by test_scenario_2[a] ---------------------------
    -------------------------------------- (file.py:14) --------------------------------------
    my_fixture -- src/_pytest/python.py:1113
        no docstring available
    
    -------------------------- fixtures used by test_scenario_2[b] ---------------------------
    -------------------------------------- (file.py:14) --------------------------------------
    my_fixture -- src/_pytest/python.py:1113
        no docstring available
    • @RonnyPfannschmidt: are you saying the parametrize mark should implicitly do parametrization of the session fixture here rather than creating a pseudo fixture for the argument my_fixture?

    Thank you again, @gjambaisivanandham!

  5. Zac-HD commented on Jul 22, 2026

    @Zac-HD
    Member

    Closing as not reproducible: the literal repro (parametrize without indirect=True) creates a pseudo-fixture that fully overrides my_fixture, so the real fixture body never runs on 7.4.2, 8.0.2, or current main; the corrected form using indirect=True (as suggested above) already reuses the session-scoped fixture correctly on all of those versions too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    topic: fixturesanything involving fixtures directly or indirectlytype: bugproblem that needs to be addressed

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions