Python unittest - setUpClass() дает мне проблемы - почему я не могу так наследовать?
У меня есть код unittest, например:
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 __name__ == '__main__':
unittest.main()
Когда я пытаюсь запустить этот код, я получаю сообщение об ошибке:
======================================================================
ERROR: setUpClass (__main__.MyFirstSetOfTests)
----------------------------------------------------------------------
TypeError: unbound method setUpClass() must be called with MyFirstSetOfTests instance as first argument (got nothing instead)
----------------------------------------------------------------------
Ответы
Ответ 1
setUpClass
должен быть методом класса. Из документа :
Метод класса, вызываемый перед тестированием в отдельном прогоне класса. setUpClass
вызывается с классом как единственный аргумент и должен быть украшен как classmethod()
:
@classmethod def setUpClass (cls): ...
Подробнее см. Class and Module Fixtures.
В вашей версии отсутствует декоратор @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()
Ошибка вызывается из-за того, что MyFirstSetOfTests.setUpClass()
вызывается в классе, а не в экземпляре, но вы не отмечали свой метод как метод класса и, следовательно, он не передавался в автоматическом аргументе self
.