2017-04-08 2 views
0

Généralement, j'ai deux classes de test qui partagent tous les cas de test, à l'exception de la classe setup_class et teardown_class. Les deux classes de test exécutent les mêmes tests d'opération client vers deux serveurs différents qui doivent être configurés différemment. Et selon où/quand le test est exécuté, il se peut que je souhaite ignorer certains tests car ce serveur pourrait ne pas être disponible. Je viens donc avec un design:Dans pytest, skipif ne fonctionne pas comme prévu si la classe de test est une sous-classe

class AllTests: 
    def test_1(self): 
     ... 
    def test_2(self): 
     ... 

@pytest.mark.skipif(condition1) 
class TestA(AllTests): 
    @classmethod 
    def setup_class(cls): 
     ... 
    @classmethod 
    def teardown_class(cls): 
     ... 

@pytest.mark.skipif(condition2) 
class TestB(AllTests): 
    @classmethod 
    def setup_class(cls): 
     ... 
    @classmethod 
    def teardown_class(cls): 
     ... 

Il fonctionne très bien si aucune classe est ignorée. Cependant, si la condition 1 est remplie et que TestA est ignorée, les fonctions de test dans AllTests ne fonctionneront pas non plus pour TestB (ce qui n'est évidemment pas ce que je veux!).

Alors, comment résoudre ce problème?

Ou existe-t-il d'autres conceptions répondant à mes besoins (classes de test qui partagent tous les cas de test excepté les classes setup_class et teardown_class et qui devraient pouvoir être ignorées)? Est-ce que "parametrize" est utilisable? J'ai essayé mais je ne peux pas trouver les bons codes :(

+0

Peut-être pouvez-vous expliquer plus pourquoi vous voulez faire cela, e.h. votre condition de saut, vos données etc. –

+0

@NilsWerner J'ai ajouté qu'en haut ~ –

Répondre

0

C'est en effet un effet secondaire de la mise en œuvre. La marque de classe est juste rempli les fonctions.

L'utilisation paramétrisation est une alternative viable. Il est particulièrement utile si votre configuration et les fonctions teardown sont similaires vous pouvez utiliser un appareil de rendement avec paramétrisation.

@pytest.fixture(scope="class", params=['a', 'b']) 
def do_setup(request): 
    # setup 
    a = open(request.param) 
    yield a # provide the fixture value 
    # teardown 
    close(a) 

Si vous ne avez pas besoin du résultat (a ici), vous pouvez utiliser autouse=True et ont l'auto de fixation

Pour plus d'informations se référer à la documentation de pytest sur les appareils: https://docs.pytest.org/en/latest/fixture.html

+0

Oui. Fixture est aussi la solution que je trouve. Merci ~ –