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

Запуск setUp только один раз

Моя версия Python 2.6.

Я хотел бы выполнить метод setUp только один раз, так как я делаю там вещи, которые необходимы для каждого теста.

Моя идея состояла в том, чтобы создать логический var, который будет установлен на "true" после первого выполнения.

class mySelTest(unittest.TestCase):
    setup_done = False

    def setUp(self):
        print str(self.setup_done)
            
        if self.setup_done:
            return
        self.setup_done = True
        print str(self.setup_done)

Выход:

False

True

--- Test 1 ---

False

True

--- Test 2 ---

почему это не работает? Я что-то пропустил?

4b9b3361

Ответ 1

Вы можете использовать setUpClass для определения методов, которые запускаются только один раз для каждого теста.

Ответ 2

Ответ Даниэля верен, но вот пример, чтобы избежать некоторых распространенных ошибок, которые я нашел, например, не вызывать super() в setUpClass().

Документация для setUpClass() не упоминает, что вам нужно позвонить super(). Вы получите сообщение об ошибке, если вы этого не сделаете, как показано в этом связанном вопросе.

class SomeTest(TestCase):
    def setUp(self):
        self.user1 = UserProfile.objects.create_user(resource=SomeTest.the_resource)

    @classmethod
    def setUpClass(cls):
        """ get_some_resource() is slow, to avoid calling it for each test use setUpClass()
            and store the result as class variable
        """
        super(SomeTest, cls).setUpClass()
        cls.the_resource = get_some_resource()

Ответ 3

Не пытайтесь дедуцировать вызовы setUp, просто вызовите его один раз.

Например:

class MyClass(object):
    ...

def _set_up():
    code to do one-time setup

_set_up()

Это вызовет _set_up(), когда модуль загрузится первым. Я определил его как функцию уровня модуля, но вы также можете сделать его методом класса MyClass.

Ответ 4

Поместите весь код, который вы хотите установить за пределами mySelTest.

setup_done = False

class mySelTest(unittest.TestCase):

    def setUp(self):
        print str(setup_done)

        if setup_done:
            return

        setup_done = True
        print str(setup_done)

Другая возможность заключается в создании класса Singleton, который вы создаете в setUp(), который запускает только код __new__ один раз и возвращает экземпляр объекта для остальных вызовов. Смотрите: Есть ли простой, элегантный способ определения одиночных чисел?

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(
                            cls, *args, **kwargs)
            # PUT YOUR SETUP ONCE CODE HERE!
            cls.setUpBool = True

        return cls._instance

class mySelTest(unittest.TestCase):

    def setUp(self):
        # The first call initializes singleton, ever additional call returns the instantiated reference.
        print(Singleton().setUpBool)

Твой способ тоже работает.