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.
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
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)
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.