2017-02-03 3 views
1

Mon pytest est ancien (version 2.8.3).Dans pytest, comment s'assurer que l'appareil au niveau du module est appelé avant le niveau de la classe

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") 
class TestMyClass: 
    def test_func(self): 
     pass 

Cependant, l'ordre que je suis arrivé est:

class start 
module start 
class end 
module end 

qui est pas ce que je veux. Alors, quelle est la bonne façon d'écrire un montage au niveau du module/nettoyage (et assurez-vous qu'il fait l'installation avant tout et nettoyer après tout)?

Répondre

1

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