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, но я думаю, что с помощью этого счетчика можно что-то сделать.