Labs ICT
โญ Pro Login

addCleanup & DoCleanups

Registering cleanup functions for test teardown

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.

๐Ÿงช Quick Quiz

addCleanup() registers a function that: