Dans notre équipe, nous définissons la plupart des cas de test comme ceci:
Une classe "framework" ourtcfw.py
:
import unittest
class OurTcFw(unittest.TestCase):
def setUp:
# something
# other stuff that we want to use everywhere
et beaucoup de cas de test comme testMyCase.py:
import localweather
class MyCase(OurTcFw):
def testItIsSunny(self):
self.assertTrue(localweather.sunny)
def testItIsHot(self):
self.assertTrue(localweather.temperature > 20)
if __name__ == "__main__":
unittest.main()
Lorsque j'écris un nouveau code de test et que je veux l'exécuter souvent et gagner du temps, ce que je fais, c'est que je mets "__" devant tous les autres tests. Mais c'est lourd, me distrait du code que j'écris et le bruit de validation que cela crée est tout simplement ennuyeux.
Par exemple, lorsque j'apporte des modifications à testItIsHot()
, je veux pouvoir faire ceci:
$ python testMyCase.py testItIsHot
et ont unittest
couru seulement testItIsHot()
Comment puis-je y parvenir?
J'ai essayé de réécrire la if __name__ == "__main__":
partie, mais depuis que je suis nouveau sur Python, je me sens perdu et continue de me baser sur tout le reste que les méthodes.
la source
__init__.py
intérieur de ce répertoire (et sous-répertoires, le cas échéant) et en appelant par exemple.python test/testMyCase.py test.MyCase.testItIsHot
.Si vous organisez vos cas de test, c'est-à-dire, suivez la même organisation comme le code réel et utilisez également les importations relatives pour les modules dans le même package
Vous pouvez également utiliser le format de commande suivant:
Documentation Python3 pour cela: https://docs.python.org/3/library/unittest.html#command-line-interface
la source
Cela peut bien fonctionner comme vous le pensez
Et il existe une autre façon de simplement tester
testItIsHot
:la source
Si vous consultez l'aide du module unittest, il vous indique plusieurs combinaisons qui vous permettent d'exécuter des classes de cas de test à partir d'un module et des méthodes de test à partir d'une classe de cas de test.
Il ne vous oblige pas à définir a
unittest.main()
comme comportement par défaut de votre module.la source
usage
est même étrangement incohérente): l'exécutionpython -m unittest module_test.TestClass.test_method
suppose un fichiermodule_test.py
(exécuté à partir du répertoire courant; et__init.py__
n'est pas requis); etmodule_test.py
contientclass TestClass(unittest.TestCase)...
ce qui contientdef test_method(self,...)
(cela fonctionne aussi pour moi sur python 2.7.13)Peut-être que ce sera utile pour quelqu'un. Si vous souhaitez exécuter uniquement des tests d'une classe spécifique:
Cela fonctionne pour moi en python 3.6
la source
Inspiré par @yarkee, je l'ai combiné avec une partie du code que j'ai déjà reçu. Vous pouvez également l'appeler à partir d'un autre script, simplement en appelant la fonction
run_unit_tests()
sans avoir besoin d'utiliser la ligne de commande, ou tout simplement l'appeler à partir de la ligne de commande avecpython3 my_test_file.py
.Malheureusement, cela ne fonctionne que pour
Python 3.3
ou supérieur:Code du coureur:
En modifiant un peu le code, vous pouvez passer un tableau avec tous les tests unitaires que vous souhaitez appeler:
Et un autre fichier:
Alternativement, vous pouvez utiliser https://docs.python.org/3/library/unittest.html#load-tests-protocol et définir la méthode suivante sur votre module / fichier de test:
Si vous souhaitez limiter l'exécution à un seul fichier de test, il vous suffit de définir le modèle de découverte de test sur le seul fichier dans lequel vous avez défini la
load_tests()
fonction.Références:
Alternativement au dernier exemple de programme principal, j'ai trouvé la variation suivante après avoir lu l'
unittest.main()
implémentation de la méthode:la source
TL; DR : Cela fonctionnerait très probablement:
L'explication :
La manière pratique
fonctionnerait MAIS son hypothèse tacite est que vous avez déjà cet extrait de code conventionnel à l'intérieur (généralement à la fin de) votre fichier de test.
La manière gênante
fonctionnerait toujours, sans vous obliger à avoir cet
if __name__ == "__main__": unittest.main()
extrait de code dans votre fichier source de test.Alors pourquoi la 2e méthode est-elle considérée comme peu pratique? Parce que ce serait pénible (_ insérez ici une partie de votre corps _) de taper ce long chemin délimité par des points à la main. En première méthode, la
mypkg/tests/test_module.py
pièce peut être complétée automatiquement, soit par un shell moderne, soit par votre éditeur.PS: Si vous pensiez que cette partie du corps se situe quelque part sous votre taille, vous êtes une personne authentique. :-) Je veux dire "articulation du doigt". Trop de frappe serait mauvais pour vos articulations. ;-)
la source