2014-12-16 3 views
3

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

Проблема в том, что создание этих объектов происходит довольно медленно, поэтому я могу создать объект в методе setUpClass и повторно использовать его.

@classmethod 
def setUpClass(cls): 
    cls.obj = MyClass(argument) 

def TestConstruction(self): 
    obj = MyClass(argument) 

def Test1(self): 
    self.assertEqual(self.obj.metohd1(), 1) 

дело

  1. Я создаю 2 раза дорогой объект
  2. установки является Кальес до TestConstruction, поэтому я не могу проверить неисправность внутри TestConstruction

Я буду счастлив, например, если есть способ установить TestConstruction для выполнения перед другими тестами.

+0

Вы используете встроенный в 'unittest' модуле? – Ngenator

+0

Если вы используете пакет 'unittest' stdlib, я настоятельно рекомендую вам перечитать документ о' Testcase.setUp() '- он запускается для каждого метода' test_xxx'. –

ответ

2

Почему бы не проверить как инициализацию, так и функциональность в одном и том же тесте?

class MyTestCase(TestCase): 
    def test_complicated_object(self): 
     obj = MyClass(argument) 
     self.assertEqual(obj.method(), 1) 

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

class CreationTestCase(TestCase): 
    def test_complicated_object(self): 
     obj = MyClass(argument) 

class UsageTestCase(TestCase): 
    @classmethod 
    def setupClass(cls): 
     cls.obj = MyClass(argument) 

    def test_complicated_object(self): 
     self.assertEqual(obj.method(), 1) 

Обратите внимание, что если вы методы мутировать объект, который вы собираетесь попасть в беду.

В качестве альтернативы, вы можете сделать это, но опять же, я бы не рекомендовал его

class MyTestCase(TestCase): 
    _test_object = None 

    @classmethod 
    def _create_test_object(cls): 
     if cls._test_object is None: 
      cls._test_object = MyClass(argument) 
     return cls._test_object 

    def test_complicated_object(self): 
     obj = self._create_test_object() 
     self.assertEqual(obj.method(), 1) 

    def more_test(self): 
     obj = self._create_test_object() 
     # obj will be cached, unless creation failed 
+0

У меня есть 50+ тестовых чеков, проверяющих разные типы поведения, я хотел бы быть более модульным. –

+0

@ RuggeroTurra Добавлено другое предложение. Один из последних вариантов - создать его в 'setupClass' и установить флаг в классе, который говорит, что создание завершилось неудачно (и' fail() 'ваши тесты, если флаг установлен), но это очень хакерское и приведет к сложным -debug. –

 Смежные вопросы

  • Нет связанных вопросов^_^