Caching parametrisierter, verschachtelter Fixtures in Pytest
Posted: 20 Jan 2025, 15:22
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:
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.
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
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.