Sometimes we want to prepare a context for each test to be run under. The setUp
method is run prior to each test in the class. tearDown
is run at the end of every test. These methods are optional. Remember that TestCases are often used in cooperative multiple inheritance so you should be careful to always call super
in these methods so that base class's setUp
and tearDown
methods also get called. The base implementation of TestCase
provides empty setUp
and tearDown
methods so that they can be called without raising exceptions:
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()
Note that in python2.7+, there is also the addCleanup
method that registers functions to be called after the test is run. In contrast to tearDown
which only gets called if setUp
succeeds, functions registered via addCleanup
will be called even in the event of an unhandled exception in setUp
. As a concrete example, this method can frequently be seen removing various mocks that were registered while the test was running:
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)
Another benefit of registering cleanups this way is that it allows the programmer to put the cleanup code next to the setup code and it protects you in the event that a subclasser forgets to call super
in tearDown
.