__init__ для unittest.TestCase

122

Я хотел бы добавить пару вещей к тому, что 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.

ffledgling
источник
@Neeraj Я думаю, что мой вопрос предшествует этому?
Ffledgling 05
@Abhijeet Этот вопрос был задан в 2013 году, вопрос, на который вы ссылаетесь, был задан в 2016 году, и в нем меньше ответов и обсуждений. Может быть, вам стоит вместо этого пометить другой вопрос как дубликат? Ответ там связан с Python 3, и этот вопрос касается Python 2.
Ffledgling
извините за то, что я плохо
Abhijeet

Ответы:

166

Попробуй это:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

Вы переопределяете TestCase's __init__, поэтому вы можете позволить базовому классу обрабатывать аргументы за вас.

karthikr
источник
+1 Я бы инициализировал базовый класс перед вызовом любого объектного метода.
Joachim Isaksson
У меня это не работает. Материал внутри gen_stub не выполняется. Infact выглядит так, как будто gen_stub вообще не вызывается ... Я могу сказать, потому что self.tempdir, который должен существовать, не может быть доступен для других методов класса. Я получаю AttributeError: объект TestingClass не имеет атрибута tempdir
ffledgling
22
Вы не должны вызывать это, setUpа не отменять __init__?
karthikr
2
@karthikr Я хочу сгенерировать заглушки один раз для всех тестов, а не воссоздавать их каждый раз для каждого теста. Некоторые заглушки даже не будут использоваться в некоторых тестах. Я бы использовал setUpClass, но я не думаю, что python 2.4 его поддерживает.
Ffledgling
2
Вы также можете быть более явным в этом случае (что, на мой взгляд, помогает с удобочитаемостью) и использовать: unittest.TestCase.__init__(self,*args,**kwargs)вместоsuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo
22

Просто хотел добавить некоторые пояснения по поводу переопределения функции инициализации

unittest.TestCase

Функция будет вызываться перед каждым методом в вашем тестовом классе. Обратите внимание, что если вы хотите добавить некоторые дорогостоящие вычисления, которые следует выполнить один раз перед запуском всех методов тестирования, используйте метод класса SetUpClass.

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

Эта функция будет вызываться один раз перед всеми тестовыми методами класса. См. setUpМетод, который вызывается перед каждым методом тестирования.

Томас Веттерли
источник
4

Установите unittest2 и используйте unittest из этого пакета.

import unittest2 

а затем используйте класс setupModule / tearDownModule или setupClass / tearDown для специальной логики инициализации

Дополнительная информация: http://www.voidspace.org.uk/python/articles/unittest2.shtml

Также, скорее всего, вы создаете интеграционный тест больше, чем unittest. Выберите хорошее название для тестов, чтобы различать их, или поместите в другой контейнерный модуль.

fabrizioM
источник
Спасибо за ссылку на документацию.
Крис