Подтвердить что ты не робот

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)

----------------------------------------------------------------------
4b9b3361

Ответ 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.