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

__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.

4b9b3361

Ответ 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 для метода, который вызывается перед каждым тестовым методом.