web-dev-qa-db-fra.com

Désactivation Python Nossetsts

Lorsque vous utilisez des nosetests pour Python Il est possible de désactiver un test d'unité en définissant la fonction de test __test__ attribut à faux. J'ai mis en œuvre cela en utilisant le décorateur suivant:

def unit_test_disabled():
    def wrapper(func):
         func.__test__ = False
         return func

    return wrapper

@unit_test_disabled
def test_my_sample_test()
    #code here ...

Cependant, cela a l'effet secondaire de l'appel de l'emballage comme test de l'unité. Wrapper passera toujours mais il est inclus dans la sortie Nossetsts. Y a-t-il une autre façon de structurer le décorateur de sorte que le test ne fonctionne pas et n'apparaît pas dans la sortie Nossetsts.

50
Richard Dorman

Le nez a déjà un décorateur de construction pour cela:

from nose.tools import nottest

@nottest
def test_my_sample_test()
    #code here ...

Découvrez également les autres goodies que le nez fournit: https://nose.readthedocs.org/en/latest/testing_tools.html

146
Christian Oudard

Il existe également un plug-in SkipTest pour NOSETEST, qui provoquera l'émission de test dans la sortie de test comme ignoré. Voici un décorateur pour cela:

def skipped(func):
    from nose.plugins.skip import SkipTest
    def _():
        raise SkipTest("Test %s is skipped" % func.__name__)
    _.__= func.__name__
    return _

Exemple de sortie:

$ nosetests tests
..........................................................................
..................................S.............
----------------------------------------------------------------------
Ran 122 tests in 2.160s

OK (SKIP=1)
31

Vous pouvez simplement démarrer la classe, la méthode ou le nom de la fonction avec un soulignement et le nez l'ignorera.

@nottest a ses utilisations, mais je trouve que cela ne fonctionne pas bien lorsque les classes dérivent les unes des autres et certaines classes de base doivent être ignorées par le nez. Cela se produit souvent lorsque j'ai une série de points similaires Django Vues à tester. Ils partagent souvent des caractéristiques qui nécessitent des tests. Par exemple, ils sont accessibles uniquement aux utilisateurs avec certaines autorisations. Plutôt que d'écrire le même Vérification de la permission pour tous, j'ai mis un tel test partagé dans une classe initiale à partir de laquelle les autres classes dérivent. Le problème est que la classe de base est là seulement pour être dérivée par les classes ultérieures et n'est pas destinée à être courue sur son posséder. Voici un exemple du problème:

from unittest import TestCase

class Base(TestCase):

    def test_something(self):
        print "Testing something in " + self.__class__.__name__

class Derived(Base):

    def test_something_else(self):
        print "Testing something else in " + self.__class__.__name__

Et la sortie du nez courant dessus:

$ nosetests test.py -s
Testing something in Base
.Testing something in Derived
.Testing something else in Derived
.
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

La classe Base est incluse dans les tests.

Je ne peux pas simplement gifler @nottest sur Base parce qu'il marquera toute la hiérarchie. En effet, si vous additionnez @nottest au code ci-dessus devant class Base, puis le nez ne fonctionnera pas de tests.

Ce que je fais, c'est ajouter un soulignement devant la classe de base:

from unittest import TestCase

class _Base(TestCase):

    def test_something(self):
        print "Testing something in " + self.__class__.__name__

class Derived(_Base):

    def test_something_else(self):
        print "Testing something else in " + self.__class__.__name__

Et lors de la course _Base est ignoré:

$ nosetests test3.py -s
Testing something in Derived
.Testing something else in Derived
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

Ce comportement n'est pas bien documenté, mais le code qui sélectionne des tests vérifie explicitement pour un soulignement au début des noms de classe .

Un test similaire est effectué par le nez sur la fonction et les noms de méthodes afin qu'il soit possible de les exclure en ajoutant un soulignement au début du nom.

7
Louis