Bird
0
0

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🚀 Application Q15 of 15
PyTest - Fixtures
You want to use request.addfinalizer to close two resources after a test. Which code correctly ensures both cleanup functions run after the test?
A<pre>@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'</pre>
B<pre>@pytest.fixture def multi_resource(request): def cleanup(): print('Close resource 1') print('Close resource 2') request.addfinalizer(cleanup()) return 'resources'</pre>
C<pre>@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'</pre>
D<pre>@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'</pre>
Step-by-Step Solution
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]
Quick Trick: Call addfinalizer separately for each cleanup function [OK]
Common Mistakes:
MISTAKES
  • Calling cleanup functions immediately
  • Overwriting addfinalizer instead of calling it
  • Combining cleanup prints but calling immediately

Want More Practice?

15+ quiz questions · All difficulty levels · Free

Free Signup - Practice All Questions
More PyTest Quizzes