python, unittest: est-il un moyen de passer des options de ligne de commande pour l'application
J'ai un module qui importe unittest et a des cas de tests. Je voudrais
à accepter certaines options de ligne de commande (pour l'exemple ci-dessous, le nom d'un fichier de données),
mais quand j'essaie de passer l'option, je reçois le message "option -i n'est pas reconnu". Est-il possible d'avoir unittest + de fournir des options de l'application (note: je suis en utilisant optparse pour gérer les options)? Merci.
$ python test_app_data.py -i data_1.txt
option -i not recognized
=====================
de suivi: c'est une implémentation de la solution proposée:
import cfg_master #has the optparse option-handling code
...
if __name__ == '__main__':
#add you app's options here...
options_tpl = ('-i', '--in_dir', '-o', '--out_dir')
del_lst = []
for i,option in enumerate(sys.argv):
if option in options_tpl:
del_lst.append(i)
del_lst.append(i+1)
del_lst.reverse()
for i in del_lst:
del sys.argv[i]
unittest.main()
- En général, oui. Dans ce cas, la réponse semble dépendre beaucoup sur des détails qui ne vous ont pas donné.
- Votre "suivi" doit être enregistrée comme une réponse à votre question ne devrait contenir que le ... bien ... question.
Vous devez vous connecter pour publier un commentaire.
Bâtiment sur Alex réponse, c'est en fait assez facile à faire en utilisant
argparse
:Je n'ai pas testé toutes les options que vous pouvez passer dans unittest pour voir si elles fonctionnent ou pas, mais faire passer des tests de noms fonctionne, par exemple:
S'exécute MyTest avec
foo
etdata.txt
.unittest.main()
accepte un paramètre argv afin de ne pas avoir à jouer avec le global sys.argv, par exemple comme ceci:unit_argv = [sys.argv[0]] + args.unittest_args; unittest.main(argv=unit_argv)
.parse_known_args()
à la place et pas besoin d'utiliser unnargs='*'
option; voir Python: exécuter un unittest.Cas de test sans appel unittest.main()? pour ma version.pytest
!Dans votre
if __name__ == '__main__':
section, à laquelle vous n'êtes pas de nous montrer, vous aurez besoin deoptparse
et puisdel sys.argv[1:]
avant de passer le contrôle àunittest
code, de sorte que le dernier code n'essayez pas d'interpréter vos options de ligne de commande nouveau lorsque vous avez déjà traité avec eux. (C'est un peu plus difficile à avoir quelques options de votre propre et également passer un peu deunittest
, mais il peut être fait si vous avez de tels besoins complexes).sys.argv
exactement les arguments que vous voulezunittest.main
pour analyser -- pas plus, pas moins.J'ai pensé que je devais partager ma solution pour l'ajout d'un --commutateur de débogage pour le test de contrôle de l'enregistreur:
Puis j'ai étendu
unittest.TestCase
pour ajouter de la journalisation:Maintenant, je peux tourner et désactivez les messages dans mon test à l'aide de --debug, mais elle est ignorée régulièrement à des régressions.
Pour les petites applications autonomes, j'utilise une première sentinelle de l'option (-t) et d'appeler unittest.main() avant d'appeler argparse.ArgumentParser()
Vous ne devriez pas prendre des arguments et des options pour exécuter unittests, comme vous les faire exécuter en vertu de différent, de moins en moins prévisibles conditions de cette façon. Vous devez comprendre pourquoi vous avez besoin d'exécuter des tests avec des données différentes, et de vous faire de la suite de tests complète, assez pour couvrir le sol de tous les ensembles de données sans être exploitées de manière différente à chaque fois.