Тестовая настройка и разрушение в пределах unittest.TestCase

Иногда мы хотим подготовить контекст для каждого запускаемого теста. setUp метод запускается перед каждым испытанием в классе. tearDown запускается в конце каждого теста. Эти методы не являются обязательными. Помните , что TestCases часто используется в кооперативном множественном наследовании , так что вы должны быть осторожны , чтобы всегда вызывать super в этих методах , так что базовый класс setUp и tearDown метода также дозвонилась. Базовая реализация TestCase обеспечивает пустую setUp и tearDown методу , чтобы их можно было бы назвать , не поднимая исключение:

import unittest


class SomeTest(unittest.TestCase):
    def setUp(self):
        super(SomeTest, self).setUp()
        self.mock_data = [1,2,3,4,5]

    def test(self):
        self.assertEqual(len(self.mock_data), 5)

    def tearDown(self):
        super(SomeTest, self).tearDown()
        self.mock_data = []


if __name__ == '__main__':
    unittest.main()


Обратите внимание , что в python2.7 +, есть также addCleanup метод , который регистрирует функцию вызываться после выполнения теста. В отличие от tearDown который только вызывается , если setUp преуспевает, функции , зарегистрированные с помощью addCleanup будет называться даже в случае необработанного исключения в setUp . В качестве конкретного примера этот метод часто можно увидеть, удаляя различные макеты, которые были зарегистрированы во время выполнения теста:

 import unittest
import some_module


class SomeOtherTest(unittest.TestCase):
    def setUp(self):
        super(SomeOtherTest, self).setUp()

        # Replace `some_module.method` with a `mock.Mock`
        my_patch = mock.patch.object(some_module, 'method')
        my_patch.start()

        # When the test finishes running, put the original method back.
        self.addCleanup(my_patch.stop)

 

Еще одно преимущество регистрации ыборкы таким образом, что она позволяет программисту поставить очищающий код рядом с кодом установки и защищает вас в том случае, если subclasser забывает назвать super в tearDown .