la surcharge de unittest.cas de test en python
Je suis en train de créer un test unitaire cadre du sous-classement de la unittest.cas de test de la classe, mais semblent faire une erreur lorsque vous traitez avec les __init__
méthode.
Je ne peux pas comprendre pourquoi le constructeur de ComplexTest
n'est pas appelé avant celui de BasicTest
et l'exception, semble également être lié à ma constructeurs.
Je suis assez nouveau à Python sorte que toute aide sur la façon de résoudre ce problème spécifique ou de remplacement des architectures à mon utilisation serait le cas de la plupart de bienvenue.
Merci!
1) test_framework.py
import unittest
class BasicTest(unittest.TestCase):
def __init__(self, *args, **kwargs):
print('BasicTest.__init__')
super(unittest.TestCase, self).__init__(*args, **kwargs)
def setUp(self):
print('BasicTest.setUp')
super(unittest.TestCase, self).tearDown()
def tearDown(self):
print('BasicTest.tearDown')
super(unittest.TestCase, self).tearDown()
class ComplexTest(BasicTest):
def __init__(self, *args, **kwargs):
print('ComplexTest.__init__')
super(BasicTest, self).__init__(*args, **kwargs)
def setUp(self):
print('ComplexTest.setUp')
super(BasicTest, self).tearDown()
def tearDown(self):
print('ComplexTest.tearDown')
super(BasicTest, self).tearDown()
2) test.py
import unittest
import test_framework
class TestValueFunctions(test_framework.ComplexTest):
def __init__(self, *args, **kwargs):
print('TestValueFunctions.__init__')
super(test_framework.ComplexTest, self).__init__(*args, **kwargs)
def setUp(self):
print('TestValueFunctions.setUp')
super(test_framework.ComplexTest, self).tearDown()
self.value = 4711
def tearDown(self):
print('TestValueFunctions.tearDown')
super(test_framework.ComplexTest, self).tearDown()
def test_value(self):
print('TestValueFunctions.test_value')
self.assertEqual(self.value, 4711)
if __name__ == '__main__':
unittest.main()
3) lorsque maintenant essayer de l'exécuter, je vois la pile suivante
TestValueFunctions.__init__
BasicTest.__init__
Traceback (most recent call last):
File "D:\MyDev\ljs_app\trunk\examples\python\unittest\test.py", line 23, in <module>
unittest.main()
File "C:\Python27\lib\unittest\main.py", line 94, in __init__
self.parseArgs(argv)
File "C:\Python27\lib\unittest\main.py", line 149, in parseArgs
self.createTests()
File "C:\Python27\lib\unittest\main.py", line 155, in createTests
self.test = self.testLoader.loadTestsFromModule(self.module)
File "C:\Python27\lib\unittest\loader.py", line 65, in loadTestsFromModule
tests.append(self.loadTestsFromTestCase(obj))
File "C:\Python27\lib\unittest\loader.py", line 56, in loadTestsFromTestCase
loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
File "D:\MyDev\ljs_app\trunk\examples\python\unittest\test.py", line 7, in __init__
super(test_framework.ComplexTest, self).__init__(*args, **kwargs)
File "D:\MyDev\ljs_app\trunk\examples\python\unittest\test_framework.py", line 6, in __init__
super(unittest.TestCase, self).__init__(*args, **kwargs)
TypeError: object.__init__() takes no parameters
super
est que vous n'avez pas est explicitement état de la super-classe. Comme vous le voyez dans les erreurs que vous appelez object.__init__
au lieu de TestCase.__init__
avec ce code.Seulement en Python 3 pouvez vous omettez l'argument classe de
super
.OriginalL'auteur doberkofler | 2013-09-30
Vous devez vous connecter pour publier un commentaire.
En effet, votre méthode init est faux.
Devrait être:
Cela appel
__init__
sur la classe mère de BasicTest, ce qui est le cas de test. C'est la même chose pour l'installation et le démontage:la dernière ligne de l'exemple de configuration doit être:
super(BasicTest, self).setUp()
. Maintenant il va appeler le démontage méthode parent, qui n'est pas logique. De même pour la question des exemples de code.OriginalL'auteur GL770
Ah
super
! Qui sait pourquoi il ne fait rien. Si vous arrêtez de les utiliser dans votre test et au lieu d'appeler explicitement la classe parent que vous voulez, comme ceci:Vous vous retrouverez avec la sortie ci-dessous:
Voir: Python est Super chouette, mais vous ne pouvez pas l'utiliser
Il n'est pas de casser des choses. Surtout depuis
unittest.TestCase
n'utilise pas super. C'est le cas de l'appelant explicitement le code que vous voulez dans l'ordre que vous voulez l'appeler.Pas vrai, si vous avez cela et une autre classe qui sous-classes
unittest.TestCase
à la fois en tant que parents directs de cette classe, ou d'une manière telle que cela se termine plus tôt dans le mro qu'une autre méthode, ça va être problématique. Peut-être moins dans ce cas particulier, mais plus généralement, c'est pas un bon choix (surtout si elle est une sous-classe de l'objet)OriginalL'auteur aychedee