J'ai un code unittest comme le suivant:
import unittest
class MyUnitTest(unittest.TestCase):
def setUpClass(self):
do_something_expensive_for_all_sets_of_tests()
class MyFirstSetOfTests(MyUnitTest):
def setUpClass(self):
super(MyFirstSetOfTests, self).setUpClass()
do_something_expensive_for_just_these_first_tests()
def test_one(self):
...
def test_two(self):
...
class MySecondSetOfTests(MyUnitTest):
def setUpClass(self):
super(MySecondSetOfTests, self).setUpClass()
do_something_expensive_for_just_these_second_tests()
def test_one(self):
...
def test_two(self):
...
if __== '__main__':
unittest.main()
Lorsque j'essaie d'exécuter ce code, j'obtiens une erreur comme celle-ci:
======================================================================
ERROR: setUpClass (__main__.MyFirstSetOfTests)
----------------------------------------------------------------------
TypeError: unbound method setUpClass() must be called with MyFirstSetOfTests instance as first argument (got nothing instead)
----------------------------------------------------------------------
setUpClass
doit être une méthode de classe. De la documentation :
Une méthode de classe appelée avant les tests dans une exécution de classe individuelle.
setUpClass
est appelé avec la classe comme seul argument et doit être décoré commeclassmethod()
:@classmethod def setUpClass(cls): ...
Voir Class and Module Fixtures pour plus de détails.
Votre version ne contient pas le décorateur @classmethod
:
class MyUnitTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
do_something_expensive_for_all_sets_of_tests()
class MyFirstSetOfTests(MyUnitTest):
@classmethod
def setUpClass(cls):
super(MyFirstSetOfTests, cls).setUpClass()
do_something_expensive_for_just_these_first_tests()
L'erreur est générée car MyFirstSetOfTests.setUpClass()
est appelée sur la classe , pas sur une instance, mais vous n'avez pas marqué votre méthode comme un classmethod
et donc il n'a pas été passé dans l'argument automatique self
. Dans le code mis à jour ci-dessus, j'ai utilisé cls
à la place, pour indiquer que le nom fait référence à l'objet de classe.