Désactivation nosetests Python
Question
Lors de l'utilisation nosetests pour Python, il est possible de désactiver un test unitaire en définissant l'attribut __test__
de la fonction de test à false. Je l'ai mis en œuvre en utilisant le décorateur ce qui suit:
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 pour effet secondaire de wrapper appelant comme le test unitaire. Wrapper toujours passer, mais il est inclus dans la production de nosetests. Y at-il une autre façon de structurer le décorateur afin que le test ne fonctionnera pas et ne semble pas en sortie de nosetests.
La solution
Je pense que vous aurez également besoin de renommer votre décorateur à quelque chose qui n'a pas obtenu épreuve. Le dessous échoue uniquement sur le second test pour moi et la première ne montre pas dans la suite de tests.
def unit_disabled(func):
def wrapper(func):
func.__test__ = False
return func
return wrapper
@unit_disabled
def test_my_sample_test():
assert 1 <> 1
def test2_my_sample_test():
assert 1 <> 1
Autres conseils
nez a déjà un décorateur pour cette builtin:
from nose.tools import nottest
@nottest
def test_my_sample_test()
#code here ...
Consultez également les autres goodies que le nez fournit: https: //nose.readthedocs. org / fr / latest / testing_tools.html
Vous pouvez également utiliser unittest.skip
décorateur:
import unittest
@unittest.skip("temporarily disabled")
class MyTestCase(unittest.TestCase):
...
Il y a aussi un plugin pour skiptest nosetest, ce qui entraînera l'émission de test en sortie d'essai sautée. Voici un décorateur pour que:
def skipped(func):
from nose.plugins.skip import SkipTest
def _():
raise SkipTest("Test %s is skipped" % func.__name__)
_.__name__ = func.__name__
return _
Exemple de sortie:
$ nosetests tests
..........................................................................
..................................S.............
----------------------------------------------------------------------
Ran 122 tests in 2.160s
OK (SKIP=1)
Vous pouvez commencer le nom de classe, la méthode ou la fonction avec un trait de soulignement et le nez ignorera.
@nottest
a ses utilisations mais je trouve que cela ne fonctionne pas bien quand les classes dérivent les unes des autres et des classes de base doivent être ignorés par le nez. Cela arrive souvent quand j'ai une série de vues similaires Django à tester. Ils partagent souvent des caractéristiques qui ont besoin de tests. Par exemple, ils ne sont accessibles que pour les utilisateurs avec certaines autorisations. Plutôt que d'écrire le même chèque d'autorisation pour tous, je mets ce 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à que pour dériver les classes plus tard et ne doit pas être exécuté lui-même. 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 en cours d'exécution sur elle:
$ 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 inclus dans les tests.
Je ne peux pas frapper @nottest
sur Base
car il marquera toute la hiérarchie. En effet, si vous ajoutez juste @nottest
au code ci-dessus devant class Base
, puis le nez ne fonctionne pas tous les tests.
Ce que je fais est d'ajouter un trait de soulignement en face de 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 quand exécuter _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 les tests