J'ai un répertoire qui contient mes tests unitaires Python. Chaque module de test unitaire est de la forme test _ *. Py . J'essaie de créer un fichier appelé all_test.py qui, vous l'aurez deviné, exécutera tous les fichiers du formulaire de test susmentionné et renverra le résultat. J'ai essayé jusqu'à présent deux méthodes; les deux ont échoué. Je vais montrer les deux méthodes, et j'espère que quelqu'un sait comment faire cela correctement.
Pour ma première vaillante tentative, je me suis dit: "Si je viens d'importer tous mes modules de test dans le fichier, puis d'appeler ce unittest.main()
doodad, cela fonctionnera, non?" Eh bien, il s'est avéré que j'avais tort.
import glob
import unittest
testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
if __name__ == "__main__":
unittest.main()
Cela n'a pas fonctionné, le résultat que j'ai obtenu a été:
$ python all_test.py
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Pour mon deuxième essai, je pense, ok, peut-être que j'essaierai de faire tout ce test d'une manière plus "manuelle". J'ai donc essayé de le faire ci-dessous:
import glob
import unittest
testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
[__import__(str) for str in module_strings]
suites = [unittest.TestLoader().loadTestsFromName(str) for str in module_strings]
[testSuite.addTest(suite) for suite in suites]
print testSuite
result = unittest.TestResult()
testSuite.run(result)
print result
#Ok, at this point I have a result
#How do I display it as the normal unit test command line output?
if __name__ == "__main__":
unittest.main()
Cela n'a pas fonctionné non plus, mais cela semble si proche!
$ python all_test.py
<unittest.TestSuite tests=[<unittest.TestSuite tests=[<unittest.TestSuite tests=[<test_main.TestMain testMethod=test_respondes_to_get>]>]>]>
<unittest.TestResult run=1 errors=0 failures=0>
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Il me semble que j'ai une suite quelconque et je peux exécuter le résultat. Je suis un peu préoccupé par le fait qu'il dit que je n'ai que run=1
, semble que cela devrait être run=2
, mais c'est un progrès. Mais comment passer et afficher le résultat sur main? Ou comment puis-je le faire fonctionner pour que je puisse simplement exécuter ce fichier et, ce faisant, exécuter tous les tests unitaires dans ce répertoire?
la source
Réponses:
Avec Python 2.7 et supérieur, vous n'avez pas besoin d'écrire de nouveau code ou d'utiliser des outils tiers pour ce faire; l'exécution de tests récursifs via la ligne de commande est intégrée. Mettez un
__init__.py
dans votre répertoire de test et:Vous pouvez en savoir plus dans la documentation python 2.7 ou python 3.x unittest.
la source
Vous pourriez utiliser un lanceur de test qui ferait cela pour vous. nez est très bon par exemple. Une fois exécuté, il trouvera des tests dans l'arborescence actuelle et les exécutera.
Actualisé:
Voici un code de mes jours avant le nez. Vous ne voulez probablement pas la liste explicite des noms de modules, mais peut-être que le reste vous sera utile.
la source
En python 3, si vous utilisez
unittest.TestCase
:__init__.py
fichier vide (ou autre) dans votretest
répertoire ( doit être nommétest/
)test/
correspondent au modèletest_*.py
. Ils peuvent se trouver dans un sous-répertoire soustest/
et ces sous-répertoires peuvent être nommés comme n'importe quoi.Ensuite, vous pouvez exécuter tous les tests avec:
Terminé! Une solution à moins de 100 lignes. Espérons qu'un autre débutant en python gagne du temps en trouvant cela.
la source
Ceci est désormais possible directement depuis unittest: unittest.TestLoader.discover .
la source
.... ---------------------------------------------------------------------- Ran 4 tests in 0.000s OK
Pourquoi? La différence, d'où ça vient?python file.py
Eh bien, en étudiant un peu le code ci-dessus (en utilisant spécifiquement
TextTestRunner
etdefaultTestLoader
), j'ai pu être assez proche. Finalement, j'ai corrigé mon code en passant simplement toutes les suites de tests à un seul constructeur de suites, plutôt que de les ajouter "manuellement", ce qui a résolu mes autres problèmes. Voici donc ma solution.Oui, il est probablement plus facile d'utiliser simplement le nez que de le faire, mais c'est d'ailleurs le point.
la source
Si vous souhaitez exécuter tous les tests à partir de différentes classes de cas de test et que vous êtes heureux de les spécifier explicitement, vous pouvez le faire comme ceci:
où
uclid
est mon projet etTestSymbols
etTestPatterns
sont des sous-classes deTestCase
.la source
TestSuite
accepte un itérable comme argument, vous pouvez construire cet itérable en boucle pour éviter de le répéterloader.loadTestsFromTestCase
.J'ai utilisé la
discover
méthode et une surcharge deload_tests
pour obtenir ce résultat en un nombre de lignes de code (minimal, je pense):Exécution sur cinq quelque chose comme
la source
J'ai essayé différentes approches mais toutes semblent défectueuses ou je dois créer du code, c'est ennuyeux. Mais il existe un moyen pratique sous Linux, qui consiste simplement à trouver chaque test à travers un certain modèle, puis à les invoquer un par un.
et surtout, cela fonctionne définitivement.
la source
Dans le cas d'une bibliothèque ou d'une application packagée , vous ne voulez pas le faire.
setuptools
le fera pour vous .Dites-lui simplement où se trouve votre package de test racine, comme:
Et courez
python setup.py test
.La découverte basée sur des fichiers peut être problématique dans Python 3, sauf si vous évitez les importations relatives dans votre suite de tests, car
discover
utilise l'importation de fichiers. Même s'il prend en charge en optiontop_level_dir
, mais j'ai eu des erreurs de récursivité infinies. Ainsi, une solution simple pour un code non packagé est de mettre les éléments suivants dans__init__.py
votre package de test (voir le protocole load_tests ).la source
J'utilise PyDev / LiClipse et je n'ai pas vraiment compris comment exécuter tous les tests à la fois à partir de l'interface graphique. (modifier: vous faites un clic droit sur le dossier de test racine et choisissez
Run as -> Python unit-test
Voici ma solution de contournement actuelle:
J'ai mis ce code dans un module appelé
all
dans mon répertoire de test. Si j'exécute ce module en tant qu'unité à partir de LiClipse, tous les tests sont exécutés. Si je demande de répéter uniquement des tests spécifiques ou ayant échoué, seuls ces tests sont exécutés. Cela n'interfère pas non plus avec mon lanceur de test en ligne de commande (nosetests) - il est ignoré.Vous devrez peut-être modifier les arguments en
discover
fonction de la configuration de votre projet.la source
Sur la base de la réponse de Stephen Cagle, j'ai ajouté la prise en charge des modules de test imbriqués.
Le code recherche tous les sous-répertoires de
.
pour les*Tests.py
fichiers qui sont ensuite chargés. Il s'attend*Tests.py
à ce que chacun contienne une seule classe*Tests(unittest.TestCase)
qui est chargée à son tour et exécutée l'une après l'autre.Cela fonctionne avec l'imbrication profonde arbitraire des répertoires / modules, mais chaque répertoire intermédiaire doit contenir
__init__.py
au moins un fichier vide . Cela permet au test de charger les modules imbriqués en remplaçant les barres obliques (ou les contre-obliques) par des points (voirreplace_slash_by_dot
).la source
C'est une vieille question, mais ce qui a fonctionné pour moi maintenant (en 2019) est:
Tous mes fichiers de test sont dans le même dossier que les fichiers source et se terminent par
_test
.la source
Étant donné que la découverte de tests semble être un sujet complet, il existe un cadre dédié pour tester la découverte:
Plus de lecture ici: https://wiki.python.org/moin/PythonTestingToolsTaxonomy
la source
Ce script BASH exécutera le répertoire de test python unittest de N'IMPORTE OH dans le système de fichiers, quel que soit le répertoire de travail dans lequel vous vous trouvez: son répertoire de travail sera toujours là où
test
répertoire.TOUS LES TESTS, indépendant $ PWD
le module Python unittest est sensible à votre répertoire actuel, sauf si vous lui dites où (en utilisant
discover -s
option).Ceci est utile lorsque vous restez dans le répertoire de travail
./src
ou./example
et vous avez besoin d'un test unitaire global rapide:ESSAIS SÉLECTIONNÉS, indépendants PWD $
Je nomme ce fichier utilitaire:
runone.py
et je l'utilise comme ceci:Pas besoin de
test/__init__.py
fichier pour surcharger votre package / surcharge de mémoire pendant la production.la source
Voici mon approche en créant un wrapper pour exécuter des tests à partir de la ligne de commande:
Par souci de simplicité, veuillez excuser mes normes de codage non PEP8 .
Ensuite, vous pouvez créer la classe BaseTest pour les composants communs à tous vos tests, de sorte que chacun de vos tests ressemblerait simplement à:
Pour exécuter, vous spécifiez simplement des tests dans le cadre des arguments de la ligne de commande, par exemple:
la source