__init__ для unittest.TestCase
Я хотел бы добавить пару вещей к тому, что класс unittest.TestCase
делает после инициализации, но я не могу понять, как это сделать.
Прямо сейчас я делаю это:
#filename test.py
class TestingClass(unittest.TestCase):
def __init__(self):
self.gen_stubs()
def gen_stubs(self):
# Create a couple of tempfiles/dirs etc etc.
self.tempdir = tempfile.mkdtemp()
# more stuff here
Я бы хотел, чтобы все заглушки генерировались только один раз для всего этого набора тестов. Я не могу использовать setUpClass()
потому что я работаю на Python 2.4 (я также не смог заставить его работать на Python 2.7).
Что я здесь не так делаю?
Я получаю эту ошибку:
'TypeError: __init__() takes 1 argument (2 given)'
... и другие ошибки, когда я перемещаю весь код заглушки в __init__
когда запускаю его с помощью команды python -m unittest -v test
.
Ответы
Ответ 1
Попробуйте следующее:
class TestingClass(unittest.TestCase):
def __init__(self, *args, **kwargs):
super(TestingClass, self).__init__(*args, **kwargs)
self.gen_stubs()
Вы переопределяете TestCase
__init__
, поэтому вы можете позволить базовому классу обрабатывать аргументы для вас.
Ответ 2
Установите unittest2 и используйте этот пакет unittest.
import unittest2
а затем используйте класс setupModule/tearDownModule или setupClass/tearDown
для специальной логики инициализации
Дополнительная информация: http://www.voidspace.org.uk/python/articles/unittest2.shtml
Кроме того, скорее всего, вы создаете интеграционный тест больше, чем unittest.
Выберите хорошее имя для тестов, чтобы отличить их или добавить в другой контейнерный модуль.
Ответ 3
Просто хотел добавить некоторые пояснения по поводу переопределения функции инициализации
unittest.TestCase
Функция будет вызываться перед каждым методом в вашем тестовом классе. Обратите внимание, что если вы хотите добавить некоторые дорогостоящие вычисления, которые должны быть выполнены один раз перед запуском всех методов тестирования, пожалуйста, используйте метод setUpClass classmethod
@classmethod
def setUpClass(cls):
cls.attribute1 = some_expensive_computation()
Эта функция будет вызываться один раз перед всеми методами тестирования класса. Смотрите setUp для метода, который вызывается перед каждым тестовым методом.