web-dev-qa-db-fra.com

Python unittest et découverte

J'ai des répertoires qui contiennent des fichiers nommés comme: test_foo.py

Chaque fichier est un cas de test.

J'aimerais

1) Exécutez tous les tests dans un répertoire à partir de la ligne de commande. J'utilise unittest2, puisque nous exécutons Python 2.5.1. À partir de l'un de ces répertoires, j'ai essayé de taper ceci sur la ligne de commande:

python -m unittest2 discover -p 'test_*.py'

et plusieurs variantes différentes. Je ne reçois aucune erreur, mais rien ne se passe. Je m'attendais à ce que tous les tests de tous les cas de test de ce répertoire s'exécutent et obtiennent des résultats.

2) J'ai également essayé d'avoir un script dans le répertoire où je l'ai fait:

loader = unittest2.TestLoader()
t = loader.discover('.')

Si j'imprime la variable t, je peux voir mes cas de test, mais à partir des documents, je ne peux pas savoir quoi faire avec l'objet chargeur une fois que je l'ai.

38
Aaron

J'ai rencontré le même problème lors de l'exécution de python -m unittest discover. Voici une bonne liste de vérification pour vérifier votre configuration. Nose est plus flexible avec les configurations autorisées, mais pas nécessairement mieux.

  1. Assurez-vous que tous les fichiers/répertoires commencent par test. Faites pas utilisez test-something.py, car ce n'est pas un nom de module python valide. Utilisez test_something.py.

  2. Si vous placez vos tests dans un sous-répertoire (par exemple test/), assurez-vous de créer un test/__init__.py file so python traitera le répertoire comme un paquet.

  3. Toutes les définitions de cas de test de classe doivent être étendues unittest.TestCase. Par exemple

    class DataFormatTests(unittest.TestCase)
    
57
cmcginty

Une fois que vous avez découvert les tests, vous pouvez les exécuter avec un lanceur de test.

Pour python 2:

import unittest2
loader = unittest2.TestLoader()
tests = loader.discover('.')
testRunner = unittest2.runner.TextTestRunner()
testRunner.run(tests)

Pour python 3:

import unittest
loader = unittest.TestLoader()
tests = loader.discover('.')
testRunner = unittest.runner.TextTestRunner()
testRunner.run(tests)

L'exécution du code ci-dessus imprimera les résultats du test sur la sortie standard.

48
kortina

Indiquez comment vous essayez d'utiliser unittest2 à partir de la ligne de commande sur Python < 2.7, Je pense que vous avez peut-être manqué la note sur le unittest2 Page PyPI :

Remarque

Utilisation de la ligne de commande

Dans Python 2.7, vous invoquez les fonctionnalités les plus en ligne de commande (y compris la découverte de test) avec python -m unittest <args>. Comme unittest est un package, et la possibilité d'appeler des packages avec python -m ... est nouveau dans Python 2.7, nous ne pouvons pas le faire pour unittest2.

Au lieu de cela, unittest2 est livré avec une unité de script2. Utilisation de la ligne de commande:

unit2 discover unit2 -v test_module

Il existe également une copie de ce script appelée unit2.py, utile pour Windows qui utilise des extensions de fichier plutôt que des lignes Shebang pour déterminer avec quel programme exécuter les fichiers. Ces deux scripts sont installés par distutils.

Avez-vous essayé le unit2 script que cette note recommande comme alternative pour les anciens Pythons à la fonctionnalité "run package as main script" de Python 2.7? Peut-être que ses sources pourraient également être utiles pour savoir exactement comment découvrir -et exécuter des tests à partir de votre propre code, si c'est ce que vous préférez faire.

24
Alex Martelli