Désactiver temporairement les tests unitaires Python individuels


128

Comment les tests unitaires individuels peuvent-ils être temporairement désactivés lors de l'utilisation du unittestmodule en Python?

Réponses:


230

Les méthodes ou classes de test individuelles peuvent toutes deux être désactivées à l'aide du unittest.skipdécorateur.

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

Pour d'autres options, consultez la documentation relative à l' ignorance des tests et des échecs attendus .


9
Dans Python 3, la réponse d'Akif ci-dessous @unittest.SkipTestfonctionne et non@unittest.skip
lifebalance

7
J'utilise Python 3.6.1 et @unittest.skipfonctionne également très bien.
Pete

2
@Pete, en Python 3.4.0, @unittest.skipne fonctionne pas.
lifebalance

Comment éviter que les classes enfants ne soient sautées?
reubenjohn

L'annotation ne serait appliquée qu'à une seule méthode d'essai. Avez-vous l'intention d'avoir une classe parente avec des méthodes de test, et seules certaines classes enfants ont la méthode désactivée? J'imagine que c'est possible, même si vous devrez peut-être concevoir les classes parents / enfants de manière appropriée. Pouvez-vous expliquer le scénario que vous essayez de résoudre avec un exemple de jouet?
yoni

26

Vous pouvez utiliser des décorateurs pour désactiver le test qui peut encapsuler la fonction et empêcher le test unitaire googletest ou python d'exécuter le cas de test.

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

Production:

testFoo has been disabled

11

La dernière version (2.7 - non publiée) prend en charge le saut / la désactivation des tests comme ça . Vous pouvez simplement obtenir ce module et l'utiliser sur votre installation Python existante. Cela fonctionnera probablement.

Avant cela, je renommer les tests que je voulais ACCEDE xtest_testnamede test_testname.


Voici un script elisp rapide pour ce faire. Mon elisp est un peu rouillé, alors je m'excuse à l'avance pour les problèmes qu'il a. Non testé.

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))

+1, mais dans tout le projet sur lequel je travaille, tout le monde utilise python v2.6.2, et je ne pense pas que cela changera: /, mais c'est une solution, merci
coelhudo

Vous pourriez modifier un peu votre éditeur pour vous donner une macro pour activer / désactiver un cas de test mais je parle en tant qu'utilisateur Emacs donc ... :)
Noufal Ibrahim

Je suis aussi un utilisateur d'Emacs, avez-vous créé une macro?
coelhudo

Nan. Je les laisse simplement échouer mais ce n'est pas si difficile. J'ai mis à jour la réponse avec un quickie cependant.
Noufal Ibrahim le

Cette réponse acceptée n'est pas une réponse, juste un lien. La vraie réponse actuelle n'est pas non plus celle qui a été la plus votée. Certes, il a 4 ans. L'élisp gratuit obscurcit simplement.
jwd630

10

Il suffit de placer le @unittest.SkipTestdécorateur au-dessus du test.


Je ne sais pas qui l'a fait. Mais, je lisais la documentation et il est dit que SkipTest est une exception. Quoi qu'il en soit, il est différent de unittest.skip en ce sens que skip n'exécute jamais le test (le rendant désactivé), alors que l'objectif de SkipTest doit être déclenché si quelque chose d'inattendu se produit pendant l'exécution du test. Ai-je raison? Intéressant dur.
coelhudo

unittest.skip(sans raison) me donne une erreur en Python 2 mais pas en Python 3.
Akif

5

Je viens de renommer une méthode de cas de test avec un trait de soulignement: test_myfunc devient _test_myfunc.


3

La documentation pour 2.1 ne spécifie pas de méthode ignore ou skip.

Cependant, je bloque généralement les commentaires en cas de besoin.


1

En se concentrant sur la partie «temporairement désactivée» de la question, la meilleure réponse dépend quelque peu du cas d'utilisation. Le cas d'utilisation qui m'a amené ici est que je fais du développement piloté par les tests sur une fonction. Dans ce processus, j'écris successivement des tests et j'utilise souvent des points d'arrêt dans la fonction de débogage. Si je ne fais que lancer tous les tests à chaque fois que j'exécute le testeur, je finis par m'arrêter aux points d'arrêt pour les tests qui fonctionnent déjà. Ajouter "sauter" ou modifier le nom du test ou quelque chose comme ça n'est pas ce que je veux parce que quand j'ai fini d'écrire la fonction, je veux que tous les tests s'exécutent. Si j'utilisais "skip", je devrais revenir en arrière et "unskip".

Pour mon cas d'utilisation, la solution réside dans le lanceur de test, pas dans le code de test. J'utilise pytest . Avec pytest, il est facile de spécifier un seul test depuis la ligne de commande:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(remplacez les majuscules par vos valeurs).

Je comprends que cette question concernait python-unitest. Je n'ai pas utilisé cela depuis longtemps. Je ne serais pas surpris s'il avait quelque chose de similaire à pytest. Sinon, vous pouvez facilement passer au pytest. Vous n'avez pas besoin de modifier votre code. Installez-le simplement et modifiez votre commande de test runner.

J'utilise également PyCharm Pro. Sur la page qui affiche mon code de test, il y a une petite icône à côté de la def pour chaque test. Je peux cliquer sur cette icône et exécuter ce test individuellement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.