81 votes

Python unittest: comment faire pour exécuter une partie seulement d'un fichier de test?

J'ai un fichier de test qui contient des tests en prenant beaucoup de temps (ils envoient des calculs sur un cluster et d'attendre le résultat). Tous ces éléments sont dans certains cas de test de la classe.

Depuis qu'ils prennent le temps et en outre ne sont pas susceptibles de se briser, je veux être en mesure de choisir ce sous-ensemble de tests qui fonctionne ou ne pas exécuter (la meilleure façon serait avec un argument de ligne de commande, c'est à dire "./tests.py --offline" ou quelque chose comme ça), donc j'ai pu faire tourner la plupart des tests souvent et rapidement, et l'ensemble de temps en temps, quand j'ai le temps.

Pour l'instant, je viens d'utiliser unittest.main() pour commencer les tests.

Merci.

91voto

Amit Kotlovski Points 578

Pour exécuter un seul test spécifique, vous pouvez utiliser:

$ python -m unittest test_module.TestClass.test_method

Plus d'informations ici

53voto

S.Lott Points 207588

La valeur par défaut unittest.main() utilise le test par défaut chargeur de faire une suite de tests de module, dans lequel principale est en cours d'exécution.

Vous n'avez pas à utiliser ce comportement par défaut.

Vous pouvez, par exemple, faire trois unittest.TestSuite instances.

  1. Le "rapide" sous-ensemble.

    fast = TestSuite()
    fast.addTests( TestFastThis )
    fast.addTests( TestFastThat )
    
  2. Le "lent" sous-ensemble.

    slow = TestSuite()
    slow.addTests( TestSlowAnother )
    slow.addTests( TestSlowSomeMore )
    
  3. Le "ensemble" ensemble.

    alltests = unittest.TestSuite([fast, slow])
    

Notez que j'ai ajusté le cas de test prénoms Rapide vs Lent. Vous pouvez sous-classe unittest.TestLoader pour analyser les noms de classes et de créer plusieurs chargeurs.

Ensuite, votre programme principal peut analyser les arguments de ligne de commande avec optparse ou argparse (disponible depuis la 2.7 et 3.2) de choisir la suite que vous souhaitez exécuter, rapide, lent ou tous.

Ou, vous pouvez faire confiance qu' sys.argv[1] est l'une des trois valeurs et d'utiliser quelque chose d'aussi simple que cela

if __name__ == "__main__":
    suite = eval(sys.argv[1])  # Be careful with this line!
    unittest.TextTestRunner().run(suite)

13voto

Tzury Bar Yochay Points 3437

En fait, on peut passer les noms des cas de test en tant que sys.argv et que les décisions qui seront testés.

Par exemple, supposons que vous avez

class TestAccount(unittest.TestCase):
    ...

class TestCustomer(unittest.TestCase):
    ...

class TestShipping(unittest.TestCase):
    ...

account = TestAccount
customer = TestCustomer
shipping = TestShipping

Vous pouvez appeler

python test.py account

pour avoir seulement compte des tests, ou même

$ python test.py account customer

pour avoir les deux cas testés

11voto

Roberto Liffredo Points 15265

Vous avez essentiellement deux façons de le faire:

  1. Définir votre propre suite de tests pour la classe
  2. Créer des maquettes classes du cluster de connexion qui sera de retour de données réelles.

Je suis un fervent partisan de la deuxième approche; un test unitaire doit tester seulement une unité de code, et non pas des systèmes complexes (comme les bases de données ou clusters). Mais je comprends qu'il n'est pas toujours possible, parfois, de la création de mock-ups est tout simplement trop cher, ou le but du test est vraiment dans le système complexe.

Retour à option (1), vous pouvez procéder de cette manière:

suite = unittest.TestSuite()
suite.addTest(MyUnitTestClass('quickRunningTest'))
suite.addTest(MyUnitTestClass('otherTest'))

et puis, passant la suite pour le test runner:

unittest.TextTestRunner().run(suite)

Plus d'informations sur la documentation python: http://docs.python.org/library/unittest.html#testsuite-objects

1voto

Lennart Regebro Points 52510

Regarder dans un lanceur, comme py.test, le nez ou peut-être même de zope.les tests. Ils ont tous des options de ligne de commande pour la sélection des tests.

Regardez par exemple comme le Nez: https://pypi.python.org/pypi/nose/1.3.0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X