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


@Neeraj Я думаю, що моє запитання заздалегідь зустрічається з цим?
вівторок

@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__, тому ви, можливо, захочете дозволити базовому класу обробляти аргументи для вас.


+1 Я б ініціалізував базовий клас, перш ніж викликати будь-який об'єктний метод.
Йоахім Ісакссон

Це не працює для мене. Речі всередині gen_stub не виконуються. Infact виглядає так, що gen_stub взагалі не викликається ... Я можу сказати, тому що self.tempdir, який повинен існувати, не може бути доступний іншими методами класу. Я отримую AttributeError: 'TestingClass' об’єкт не має атрибута 'tempdir'
ffledgling

22
ви не повинні закликати це, setUpа не переосмислювати __init__?
karthikr

2
@karthikr Я хочу створити заглушки один раз для всіх тестів, а не створювати їх для кожного тесту кожного разу. Деякі заглушки в деяких тестах навіть не будуть використані. Я б використовував setUpClass, але я не думаю, що python 2.4 підтримує його.
вівторок

2
Ви також можете бути трохи чіткішими у цьому випадку (що, на мій погляд, допомагає з читабельністю) та використовувати: unittest.TestCase.__init__(self,*args,**kwargs)замістьsuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo

22

Просто хотів додати кілька роз'яснень щодо зміни функції init

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

Також, швидше за все, ви створюєте тест на інтеграцію більше, ніж єдиний тест. Виберіть хороше ім’я для тестів, щоб розрізнити їх або помістити в інший модуль контейнера.


Дякуємо за посилання на документацію.
Кріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.