pytest traiter les tests dans l'ordre où ils sont écrits dans un fichier de test et charger les appareils dans la séquence au fur et à mesure de leur utilisation. Voir la documentation sur fixtures.
Dans votre exemple, pytest démarre d'abord avec un test de classe et la dépendance du module est chargée par la suite.
Il y a plusieurs possibilités si vous voulez configurer le premier « module »
a) module_level est utilisé comme paramètre par class_level et donc chargé à l'avant (pytestmark n'est pas nécessaire)
import pytest
@pytest.fixture(scope='module')
def module_level(request):
print("module start")
def fin():
print("module end")
request.addfinalizer(fin)
@pytest.fixture(scope='class')
def class_level(request, module_level):
print("class start")
def fin():
print("class end")
request.addfinalizer(fin)
@pytest.mark.usefixtures("class_level")
class TestMyClass:
def test_func(self):
pass
b) en utilisant comme @pytestmark comme condition pour la classe de test et par conséquent, il est chargé en face
import pytest
pytestmark = pytest.mark.usefixtures("module_level")
@pytest.fixture(scope='module')
def module_level(request):
print("module start")
def fin():
print("module end")
request.addfinalizer(fin)
@pytest.fixture(scope='class')
def class_level(request):
print("class start")
def fin():
print("class end")
request.addfinalizer(fin)
@pytest.mark.usefixtures("class_level")
@pytestmark
class TestMyClass:
def test_func(self):
pass
c) la configuration d'une fonction test devant un test de classe, cela va exécuter module_level premier
import pytest
pytestmark = pytest.mark.usefixtures("module_level")
@pytest.fixture(scope='module')
def module_level(request):
print("module start")
def fin():
print("module end")
request.addfinalizer(fin)
@pytest.fixture(scope='class')
def class_level(request):
print("class start")
def fin():
print("class end")
request.addfinalizer(fin)
def test_case():
assert True
@pytest.mark.usefixtures("class_level")
class TestMyClass:
def test_func(self):
pass
cette charge "module" en face de "classe" dans chaque cas (pytest-2.8.7):
a)
::TestMyClass::test_func module start
class start
class end
module end
b)
::TestMyClass::test_func module start
class start
class end
module end
c)
::test_case module start
::TestMyClass::test_func class start
class end
module end