Ответ 1
Вы можете использовать setUpClass
для определения методов, которые запускаются только один раз для каждого теста.
Моя версия 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 ---
почему это не работает? Я что-то пропустил?
Вы можете использовать setUpClass
для определения методов, которые запускаются только один раз для каждого теста.
Ответ Даниэля верен, но вот пример, чтобы избежать некоторых распространенных ошибок, которые я нашел, например, не вызывать 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()
Не пытайтесь дедуцировать вызовы setUp, просто вызовите его один раз.
Например:
class MyClass(object):
...
def _set_up():
code to do one-time setup
_set_up()
Это вызовет _set_up(), когда модуль загрузится первым. Я определил его как функцию уровня модуля, но вы также можете сделать его методом класса MyClass.
Поместите весь код, который вы хотите установить за пределами 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)
Твой способ тоже работает.