web-dev-qa-db-fra.com

py.test ignore la classe de test si le constructeur est défini

J'ai le code unittest suivant en cours d'exécution via py.test. La simple présence du constructeur fait sauter la classe entière lors de l'exécution de py.test -v -s

collecté 0 articles/1 ignoré

Quelqu'un peut-il m'expliquer ce comportement de py.test?

Je suis intéressé à comprendre le comportement de py.test, je sais que le constructeur n'est pas nécessaire.

Merci, Zdenek

class TestClassName(object):
    def __init__(self):
       pass

    def setup_method(self, method):
       print "setup_method called"

    def teardown_method(self, method):
       print "teardown_method called"

    def test_a(self):
       print "test_a called"
       assert 1 == 1

    def test_b(self):
       print "test_b called"
       assert 1 == 1
42
Zdenek Maxa

Comme déjà mentionné dans la réponse de Matti Lyra py.test saute délibérément les classes qui ont un constructeur. La raison en est que les classes ne sont utilisées que pour des raisons structurelles dans py.test et n'ont pas de comportement inhérent, tandis que lors de l'écriture de code, il est l'opposé et beaucoup plus rare de ne pas avoir de méthode .__init__() pour une classe. Donc, dans la pratique, sauter une classe avec un constructeur sera probablement ce qui était souhaité, généralement c'est juste une classe qui se trouve avoir un nom conflictuel.

Enfin, py.test doit instancier la classe pour exécuter les tests. Si le constructeur prend des arguments, il ne peut pas les instancier, donc encore une fois sauter est la bonne chose à faire.

37
flub

La documentation de py.test indique que py.test implémente la découverte de test standard suivante:

  • la collection démarre à partir des arguments de ligne de commande initiaux qui peuvent être des répertoires, des noms de fichiers ou des identifiants de test. recurse dans les répertoires, sauf s'ils correspondent à norecursedirs
  • testez les fichiers _ *. py ou * _test.py, importés par leur nom de package.
  • Test classes de test préfixées (sans __init__ méthode) [ <- notez celle-ci ici ]
  • test_ les fonctions ou méthodes de test préfixées sont des éléments de test

Ce n'est donc pas que le constructeur n'est pas nécessaire, py.test ignore simplement les classes qui ont un constructeur. Il y a aussi un guide pour changer la découverte de test standard.

36
Matti Lyra