Unittest setUp/tearDown для нескольких тестов
Есть ли функция, которая запускается в начале/конце сценария тестов? Функции setUp и tearDown запускаются до/после каждого отдельного теста.
Обычно я хотел бы иметь это:
class TestSequenceFunctions(unittest.TestCase):
def setUpScenario(self):
start() #launched at the beginning, once
def test_choice(self):
element = random.choice(self.seq)
self.assertTrue(element in self.seq)
def test_sample(self):
with self.assertRaises(ValueError):
random.sample(self.seq, 20)
for element in random.sample(self.seq, 5):
self.assertTrue(element in self.seq)
def tearDownScenario(self):
end() #launched at the end, once
Теперь эти setUp и tearDown являются модульными тестами и распространяются во всех моих сценариях (содержащих много тестов), один из них - первый тест, второй - последний тест.
Ответы
Ответ 1
Начиная с версии 2.7 (за документация) вы получаете setUpClass
и tearDownClass
, которые выполняются до и после тестов в данном классе, соответственно. Кроме того, если у вас есть группа из них в одном файле, вы можете использовать setUpModule
и tearDownModule
(документацию).
В противном случае лучше всего создать собственный производный TestSuite и переопределить run()
. Все остальные вызовы будут обрабатываться родителем, и запуск вызовет ваш код установки и разрыва вокруг вызова до родительского метода run
.
Ответ 2
У меня такой же сценарий, для меня отлично работают методы setUpClass и tearDownClass
import unittest
class Test(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls._connection = createExpensiveConnectionObject()
@classmethod
def tearDownClass(cls):
cls._connection.destroy()
Ответ 3
Для python 2.5, а при работе с pydev это немного сложно. Похоже, что pydev не использует набор тестов, но находит все отдельные тестовые примеры и запускает их все отдельно.
Мое решение для этого было использовать переменную класса следующим образом:
class TestCase(unittest.TestCase):
runCount = 0
def setUpClass(self):
pass # overridden in actual testcases
def run(self, result=None):
if type(self).runCount == 0:
self.setUpClass()
super(TestCase, self).run(result)
type(self).runCount += 1
С помощью этого трюка, когда вы наследуете этот TestCase
(вместо исходного unittest.TestCase
), вы также наследуете runCount
of 0. Затем в методе запуска runCount
проверочный тест для детей проверяется и увеличивается. Это оставляет переменную runCount
для этого класса при 0.
Это означает, что setUpClass
будет выполняться только один раз для каждого класса, а не один раз для каждого экземпляра.
У меня пока нет метода tearDownClass
, но я думаю, что с помощью этого счетчика можно что-то сделать.