Caching parametrisierter, verschachtelter Fixtures in PytestPython

Python-Programme
Guest
 Caching parametrisierter, verschachtelter Fixtures in Pytest

Post by Guest »

Ich versuche zu verstehen, wie und wann Rückgabewerte von Pytest-Fixtures zwischengespeichert werden. Nach meinem Verständnis besteht das Ziel von Vorrichtungen (insbesondere sitzungsbezogenen Vorrichtungen) darin, dass sie nur einmal aufgerufen werden und dass Rückgabewerte für zukünftige Aufrufe zwischengespeichert werden. Dies scheint bei verschachtelten parametrisierten Geräten nicht der Fall zu sein.
Der folgende Code zeigt das Problem:

Code: Select all

from collections import Counter

import pytest

state = Counter()

@pytest.fixture(scope="session", autouse=True)
def setup_session():
yield None
print(state)

@pytest.fixture(scope="session", params=["A1", "A2", "A3"])
def first(request):
state[request.param] += 1
return request.param

@pytest.fixture(scope="session", params=["B1", "B2"])
def second(first, request):
return first + request.param

@pytest.fixture(scope="session", params=["C1", "C2"])
def third(second, request):
return second + request.param

def test_length(third):
assert len(third) == 6
Die Ausgabe ist Counter({'A1': 3, 'A2': 2, 'A3': 1}). Daher wird zuerst dreimal für den Parameterwert A1, zweimal für A2 und einmal für A3 aufgerufen. Warum?
Ich erwarte Counter({'A1': 1, 'A2': 1, 'A3': 1}) – einen Aufruf für jeden Parameter Wert.
Falls das relevant ist, verwende ich Python 3.12.3, pytest-8.3.4
PS: Alle 12 Tests bestehen – das ist gut.
PPS: Beim Entfernen einer Verschachtelungsebene verschwindet das Problem und zuerst wird genau einmal pro Parameterwert aufgerufen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post