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.

Était-ce utile?

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

scroll top