addCleanup & DoCleanups
addCleanup() registers cleanup functions that run after tearDown,
regardless of whether the test passed or failed. doCleanups() runs all
registered cleanups manually.
Basic Usage
import unittest
import tempfile
import os
class TestFileProcessing(unittest.TestCase):
def setUp(self):
self.temp_file = tempfile.NamedTemporaryFile(delete=False)
self.addCleanup(os.unlink, self.temp_file.name)
def test_process_file(self):
self.temp_file.write(b"test data")
self.temp_file.flush()
result = process_file(self.temp_file.name)
self.assertEqual(result, "processed")
def test_another_file_operation(self):
# cleanup runs automatically even if test fails
self.temp_file.write(b"more data")
validate_file(self.temp_file.name)
Multiple Cleanups
def setUp(self):
self.db = connect_db()
self.cache = connect_cache()
# Cleanups run in LIFO order (last registered, first executed)
self.addCleanup(self.cache.disconnect)
self.addCleanup(self.db.disconnect)
self.addCleanup(self.cleanup_temp_files)
def cleanup_temp_files(self):
for f in self.temp_files:
os.unlink(f)
doCleanups()
def test_with_early_cleanup(self):
resource = acquire_resource()
self.addCleanup(resource.release)
if not resource.is_valid():
self.doCleanups() # Run cleanups immediately
self.skipTest("Resource invalid")
# Continue with test...
use_resource(resource)
Key Takeaway
Use addCleanup() to register cleanup functions that always run.
Cleanups execute in LIFO order after tearDown, ensuring resources are freed
even if tests fail.