ValueError: aucun méthode d'essai in <class 'myapp.les tests.SessionTestCase " >: runTest
J'ai un cas de test:
class LoginTestCase(unittest.TestCase):
...
J'aimerais l'utiliser dans un autre cas de test:
class EditProfileTestCase(unittest.TestCase):
def __init__(self):
self.t = LoginTestCase()
self.t.login()
Cela soulève:
ValueError: no such test method in <class 'LoginTest: runTest`
J'ai regardé la unittest code où l'exception est appelé, et il semble que les tests ne sont pas censés être écrit de cette manière. Est-il un moyen standard pour écrire quelque chose que vous aimeriez testé de sorte qu'il peut être réutilisé plus tard, des tests? Ou est-il une solution?
J'ai ajouté un vide runTest
méthode pour LoginTest
comme douteux solution de contournement pour le moment.
Vous devez vous connecter pour publier un commentaire.
unittest
n'noir profond magique: si vous choisissez de l'utiliser pour exécuter votre appareil de tests (ce que je fais, car de cette façon je peux utiliser une batterie très puissant de test de coureurs &c intégrée dans le système de build sur mon lieu de travail, mais il y a certainement la peine d'alternatives), vous feriez mieux de jouer selon ses règles.Dans ce cas, je serais tout simplement avoir
EditProfileTestCase
dériver deLoginTestCase
(plutôt que directement à partir deunittest.TestCase
). Si il y a certaines parties deLoginTestCase
que vous ne voulez pas également à tester dans l'environnement différent deEditProfileTestCase
, et d'autres que vous ne le faites pas, c'est une simple question de refactoriserLoginTestCase
dans une de ces deux parties (éventuellement en utilisant l'héritage multiple) et si certaines choses doivent se produire de façon légèrement différente dans les deux cas, le facteur en auxiliaire "crochet méthodes" (dans "la Méthode de Modèle" modèle de conception) - J'utilise l'ensemble de ces approches souvent à diminuer standard et une hausse de la réutilisation dans le copieux tests unitaires j'ai toujours écrire (si j'ai de l'unité de la couverture de test < ic à 95%, j'ai toujours sentir vraiment mal à l'aise -- dessous de 90%, je commence à sentir physiquement malade;-).La confusion avec la "runTest" est principalement basée sur le fait que cela fonctionne:
Donc il n'y a pas de "runTest" dans la classe et tous les test-fonctions sont appelés. Cependant, si vous regardez la classe de base "TestCase" (lib/python/unittest/case.py ensuite, vous trouverez qu'il a un argument "methodName", qui est par défaut à "runTest" mais il ne dispose PAS d'un défaut de mise en œuvre de "def runTest"
La raison que unittest.principales œuvres de l'amende est basée sur le fait qu'il n'a pas besoin de "runTest" - vous pouvez imiter le comportement par la création d'un cas de test-sous-classe de l'instance, pour toutes les méthodes que vous avez dans votre sous - classe, il suffit de fournir le nom que le premier argument:
method
est en effet une fonction à l'intérieur de lafor
boucle, une propriété, par exempletest_name="foo"
peut être un faux positif iciVoici quelques " profonde magie noire':
Très pratique si vous voulez juste tester exécuter des tests unitaires à partir d'un shell (c'est à dire, IPython).
Si vous n'avez pas l'esprit de montage de l'unité de test de code de module directement, la seule solution est d'ajouter des sous case.py classe cas de test une nouvelle méthode appelée runTest qui ne fait rien.
Le fichier à modifier se trouve sous pythoninstall\Lib\unittest\case.py
Cela ne vous permettra jamais d'erreur.
unittest.TestCase
sous-classeGuido réponse est presque là, cependant, elle n'explique pas la chose. J'avais besoin de regarder à
unittest
code à saisir le flux.Dire que vous avez l'suivantes.
Lorsque vous utilisez
unittest.main()
, il va essayer de découvrir des cas de test dans le module en cours. Le code estunittest.loader.TestLoader.loadTestsFromTestCase
.Ce que celui-ci est la conversion de classe de cas de test dans la suite de tests, qui détient les instances de la classe par sa méthode d'essai. I. e. mon exemple va être transformé en
unittest.suite.TestSuite([MyTestCase('testA'), MyTestCase('testB')])
. Donc, si vous souhaitez créer un cas de test manuellement, vous devez faire la même chose.@dmvianna réponse m'a très près d'être en mesure d'exécuter
unittest
dans un jupyter (ipython) ordinateur portable, mais j'ai dû faire un peu plus. Si j'ai écrit le texte suivant:J'ai eu
Ce n'est pas rompu, mais il n'a pas d'exécuter tous les tests! Si j'ai instancié la classe de test
(notez les parenthèses à la fin de la ligne; c'est le seul changement) j'ai eu
Le correctif est maintenant assez clair: ajouter
runTest
à la classe de test:Il fonctionne aussi correctement (3 tests) si mon
runTest
justepass
es, comme suggéré par @Darren.C'est un peu yucchy, nécessitant une certaine main-d'oeuvre manuelle de ma part, mais c'est aussi plus explicite, et c'est un Python de la vertu, n'est-ce pas?
Je ne pouvais pas obtenir toutes les techniques via l'appel de
unittest.main
explicite les arguments à partir d'ici, ou à partir de cette question relative à la Impossible d'exécuter unittest fonction principale dans ipython/jupyter portable à l'intérieur d'un jupyter ordinateur portable, mais je suis de retour sur la route avec un réservoir plein de gaz.runTest
méthode, avez-vous à direself.test_upper()
au lieu detest_upper(self)
?