Bird
Raised Fist0
PyTesttesting~5 mins

Fixture finalization (request.addfinalizer) in PyTest - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of request.addfinalizer in pytest fixtures?

request.addfinalizer is used to register a cleanup function that runs after the test using the fixture finishes. It helps to release resources or reset states.

Click to reveal answer
intermediate
How does request.addfinalizer differ from using yield in pytest fixtures?

request.addfinalizer registers a cleanup callback explicitly, while yield splits the fixture into setup and teardown parts. Both achieve cleanup but with different syntax.

Click to reveal answer
beginner
Write a simple pytest fixture that opens a file and uses request.addfinalizer to close it.
<pre>import pytest

@pytest.fixture
def open_file(request):
    f = open('test.txt', 'w')
    def close_file():
        f.close()
    request.addfinalizer(close_file)
    return f</pre>
Click to reveal answer
beginner
When is the finalizer function registered by request.addfinalizer executed?

The finalizer function runs after the test function finishes, regardless of whether the test passed or failed. It ensures cleanup always happens.

Click to reveal answer
intermediate
Can multiple finalizers be added with request.addfinalizer in one fixture? What happens?

Yes, you can add multiple finalizers. They run in the reverse order of registration after the test completes.

Click to reveal answer
What does request.addfinalizer do in a pytest fixture?
ARegisters a function to run after the test for cleanup
BStarts the test execution
CSkips the test
DMarks the test as failed
When is the finalizer function executed in pytest fixtures using request.addfinalizer?
AAfter the test finishes
BBefore the test starts
COnly if the test passes
DOnly if the test fails
Which of the following is a correct way to add a finalizer in a pytest fixture?
Arequest.addfinalize(cleanup_function)
Brequest.finalize(cleanup_function)
Crequest.addfinalizer(cleanup_function)
Drequest.cleanup(cleanup_function)
If you add multiple finalizers with request.addfinalizer, in what order do they run?
AIn the order they were added
BIn reverse order of addition
CRandom order
DThey run simultaneously
Which is a benefit of using request.addfinalizer over yield in fixtures?
ARuns cleanup only on test failure
BRuns cleanup before setup
CSkips the test automatically
DAllows multiple cleanup functions
Explain how request.addfinalizer works in pytest fixtures and why it is useful.
Think about cleaning up after using something in a test.
You got /4 concepts.
    Describe the difference between using request.addfinalizer and yield in pytest fixtures for cleanup.
    One uses a function call, the other uses Python's yield keyword.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using request.addfinalizer in a pytest fixture?
      easy
      A. To register a cleanup function that runs after the test finishes
      B. To skip the test if a condition is met
      C. To mark a test as expected to fail
      D. To parametrize the test with multiple inputs

      Solution

      1. Step 1: Understand the role of request.addfinalizer

        This method is used inside fixtures to add a function that will run after the test, regardless of test outcome.
      2. Step 2: Identify the purpose of finalizers

        Finalizers clean up resources like files, connections, or data to keep tests independent and avoid side effects.
      3. Final Answer:

        To register a cleanup function that runs after the test finishes -> Option A
      4. Quick Check:

        Finalizer = cleanup function [OK]
      Hint: Finalizers always clean up after tests finish [OK]
      Common Mistakes:
      • Confusing finalizers with test skipping
      • Thinking finalizers run before tests
      • Using finalizers to parametrize tests
      2. Which of the following is the correct syntax to add a finalizer inside a pytest fixture using request?
      easy
      A. request.addfinalizer(cleanup_function())
      B. request.addfinalizer(cleanup_function)
      C. request.addfinalizer = cleanup_function
      D. request.finalizer(cleanup_function)

      Solution

      1. Step 1: Recall the correct method call syntax

        The addfinalizer method expects a callable (function) without calling it immediately.
      2. Step 2: Analyze each option

        request.addfinalizer(cleanup_function()) calls the function immediately, which is incorrect. request.addfinalizer(cleanup_function) passes the function reference correctly. Options C and D use invalid syntax.
      3. Final Answer:

        request.addfinalizer(cleanup_function) -> Option B
      4. Quick Check:

        Pass function, don't call it [OK]
      Hint: Pass function name without parentheses to addfinalizer [OK]
      Common Mistakes:
      • Calling the cleanup function immediately
      • Assigning instead of calling addfinalizer
      • Using wrong method names
      3. What will be the output when running this pytest code snippet?
      import pytest
      
      def cleanup():
          print('Cleanup done')
      
      @pytest.fixture
      def resource(request):
          request.addfinalizer(cleanup)
          print('Setup done')
          return 42
      
      def test_example(resource):
          print(f'Test got resource: {resource}')
          assert resource == 42
      
      medium
      A. Cleanup done\nSetup done\nTest got resource: 42
      B. Setup done\nCleanup done\nTest got resource: 42
      C. Test got resource: 42\nSetup done\nCleanup done
      D. Setup done\nTest got resource: 42\nCleanup done

      Solution

      1. Step 1: Trace the fixture and test execution order

        Fixture runs first, printing 'Setup done'. Then test runs, printing 'Test got resource: 42'. After test finishes, finalizer runs printing 'Cleanup done'.
      2. Step 2: Match output order with options

        Only Setup done\nTest got resource: 42\nCleanup done matches the order: setup, test, cleanup.
      3. Final Answer:

        Setup done\nTest got resource: 42\nCleanup done -> Option D
      4. Quick Check:

        Setup -> Test -> Cleanup order [OK]
      Hint: Finalizer runs after test, not before or during [OK]
      Common Mistakes:
      • Assuming cleanup runs before test
      • Mixing print order of setup and test
      • Thinking finalizer runs during fixture setup
      4. Identify the error in this pytest fixture code that uses request.addfinalizer:
      @pytest.fixture
      def my_fixture(request):
          def cleanup():
              print('Cleaning up')
          request.addfinalizer(cleanup())
          return 'data'
      
      medium
      A. The cleanup function must be defined outside the fixture
      B. The fixture should not return any value
      C. The cleanup function is called immediately instead of being passed
      D. The addfinalizer method does not exist on request

      Solution

      1. Step 1: Check how cleanup is passed to addfinalizer

        The code calls cleanup() immediately, passing its result (None) instead of the function itself.
      2. Step 2: Understand correct usage

        We must pass the function reference without parentheses to addfinalizer so it runs after the test.
      3. Final Answer:

        The cleanup function is called immediately instead of being passed -> Option C
      4. Quick Check:

        Pass function, don't call it [OK]
      Hint: Don't add parentheses when passing cleanup to addfinalizer [OK]
      Common Mistakes:
      • Calling cleanup instead of passing it
      • Defining cleanup outside fixture unnecessarily
      • Thinking addfinalizer is not a method
      5. You want to use request.addfinalizer to close two resources after a test. Which code correctly ensures both cleanup functions run after the test?
      hard
      A.
      @pytest.fixture
      def multi_resource(request):
          def cleanup1():
              print('Close resource 1')
          def cleanup2():
              print('Close resource 2')
          request.addfinalizer(cleanup1)
          request.addfinalizer(cleanup2)
          return 'resources'
      B.
      @pytest.fixture
      def multi_resource(request):
          def cleanup():
              print('Close resource 1')
              print('Close resource 2')
          request.addfinalizer(cleanup())
          return 'resources'
      C.
      @pytest.fixture
      def multi_resource(request):
          def cleanup1():
              print('Close resource 1')
          def cleanup2():
              print('Close resource 2')
          request.addfinalizer(cleanup1())
          request.addfinalizer(cleanup2())
          return 'resources'
      D.
      @pytest.fixture
      def multi_resource(request):
          def cleanup1():
              print('Close resource 1')
          def cleanup2():
              print('Close resource 2')
          request.addfinalizer = cleanup1
          request.addfinalizer = cleanup2
          return 'resources'

      Solution

      1. Step 1: Check how finalizers are registered

        @pytest.fixture
        def multi_resource(request):
            def cleanup1():
                print('Close resource 1')
            def cleanup2():
                print('Close resource 2')
            request.addfinalizer(cleanup1)
            request.addfinalizer(cleanup2)
            return 'resources'
        correctly calls request.addfinalizer twice, passing function references without calling them.
      2. Step 2: Identify errors in other options

        @pytest.fixture
        def multi_resource(request):
            def cleanup():
                print('Close resource 1')
                print('Close resource 2')
            request.addfinalizer(cleanup())
            return 'resources'
        calls cleanup immediately (wrong).
        @pytest.fixture
        def multi_resource(request):
            def cleanup1():
                print('Close resource 1')
            def cleanup2():
                print('Close resource 2')
            request.addfinalizer(cleanup1())
            request.addfinalizer(cleanup2())
            return 'resources'
        calls cleanup1() and cleanup2() immediately (wrong).
        @pytest.fixture
        def multi_resource(request):
            def cleanup1():
                print('Close resource 1')
            def cleanup2():
                print('Close resource 2')
            request.addfinalizer = cleanup1
            request.addfinalizer = cleanup2
            return 'resources'
        assigns functions to request.addfinalizer attribute, overwriting it (wrong).
      3. Final Answer:

        Option A correctly registers both cleanup functions as finalizers -> Option A
      4. Quick Check:

        Call addfinalizer twice with function references [OK]
      Hint: Call addfinalizer separately for each cleanup function [OK]
      Common Mistakes:
      • Calling cleanup functions immediately
      • Overwriting addfinalizer instead of calling it
      • Combining cleanup prints but calling immediately
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard