web-dev-qa-db-fra.com

Désactiver temporairement les tests unitaires Python individuels

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

72
coelhudo

Des méthodes de test individuelles ou des classes peuvent être désactivées à l'aide de unittest.skip decorator.

@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, voir la documentation de Ignorer les tests et les échecs attendus .

147
yoni

Vous pouvez utiliser des décorateurs pour désactiver le test qui peut envelopper la fonction et empêcher le test d'unité googletest ou python d'exécuter le testcase.

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

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

testFoo()

Sortie:

testFoo has been disabled
24
GTM

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

Avant cela, je renommais les tests que je voulais passer au xtest_testname à partir de test_testname


Voici un script elisp rapide pour le faire. Mon elisp est un peu rouillé, donc je m'excuse d'avance pour tous ses problèmes. 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_"))))
11
Noufal Ibrahim

Placer simplement @unittest.SkipTest décorateur au-dessus du test suffit.

8
Akif

Je viens de renommer une méthode de test avec un soulignement:.

6
MattK

Les docs for 2.1 ne spécifient pas une méthode ignore ou skip.

Habituellement, je bloque les commentaires lorsque cela est nécessaire.

3
Finglas

En ce qui concerne la partie "temporairement désactivée" de la question, la meilleure réponse dépend un peu du cas d'utilisation. Le cas d'utilisation qui m'a amené ici est que je suis en train de développer des fonctions sur des tests. Au cours de ce processus, j’écris successivement des tests et utilise souvent des points de rupture dans la fonction de débogage. Si je me contente d'exécuter tous les tests à chaque fois que j'exécute le programme d'exécution de tests, je finis par m'arrêter aux points de rupture des tests qui fonctionnent déjà. Ajouter «ignorer» ou modifier le nom du test ou quelque chose comme ce n'est pas ce que je veux, car lorsque j'aurai fini d'écrire la fonction, je veux que tous les tests soient exécutés. Si j'utilisais "skip", je devrais revenir en arrière et "unskip".

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

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(remplacez les bouchons par vos valeurs). 

Je crois comprendre que cette question visait python-unitest. Je ne l'ai pas utilisé depuis longtemps. Je ne serais pas surpris s'il avait quelque chose de similaire à Pytest. Sinon, vous pouvez facilement passer à pytest. Vous n'avez pas besoin de modifier votre code. Installez-le et changez votre commande de test runner.

De plus, j'utilise PyCharm Pro. Sur la page qui affiche mon code de test, il existe une petite icône à côté de la définition pour chaque test. Je peux cliquer sur cette icône et exécuter ce test individuellement.

0
Chuck