0
0
PyTesttesting~20 mins

Fixture teardown (yield) in PyTest - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Yield Fixture Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of pytest fixture with yield
What will be the output when running this pytest test with the given fixture?
PyTest
import pytest

@pytest.fixture
def resource():
    print("Setup resource")
    yield "data"
    print("Teardown resource")

def test_example(resource):
    print(f"Using {resource}")
    assert resource == "data"
AUsing data\nSetup resource\nTeardown resource
BSetup resource\nTeardown resource\nUsing data
CSetup resource\nUsing data\nTeardown resource
DUsing data\nTeardown resource\nSetup resource
Attempts:
2 left
💡 Hint
Remember that code before yield runs before the test, and code after yield runs after the test.
assertion
intermediate
2:00remaining
Correct assertion for fixture teardown effect
Given a pytest fixture that yields a list and appends an item after yield, which assertion correctly verifies the list contents after the test?
PyTest
import pytest

@pytest.fixture
def my_list():
    data = []
    yield data
    data.append('done')

def test_modify_list(my_list):
    my_list.append('test')
    # Which assertion below correctly checks the list after test?
Aassert my_list == ['done']
Bassert my_list == ['test', 'done']
Cassert my_list == []
Dassert my_list == ['test']
Attempts:
2 left
💡 Hint
The assertion runs inside the test, before teardown code runs.
🔧 Debug
advanced
2:00remaining
Identify the error in fixture teardown with yield
What error will this pytest fixture cause when used in a test?
PyTest
import pytest

@pytest.fixture
def broken_fixture():
    print("Setup")
    yield
    print("Teardown")
    yield

def test_broken(broken_fixture):
    assert True
ASyntaxError: multiple yield statements in fixture
BRuntimeError: generator didn't stop after second yield
CTypeError: fixture must yield exactly once
DNo error, test passes normally
Attempts:
2 left
💡 Hint
A pytest fixture must yield exactly once; multiple yields cause runtime issues.
🧠 Conceptual
advanced
2:00remaining
Purpose of yield in pytest fixture teardown
Why does pytest use yield in fixtures for teardown instead of separate setup and teardown functions?
AYield allows setup and teardown code to be in one place, improving readability and resource management.
BYield makes the fixture run twice, once for setup and once for teardown.
CYield is used to pause the test execution until teardown is manually triggered.
DYield automatically retries the test if it fails during setup.
Attempts:
2 left
💡 Hint
Think about how yield separates setup and teardown in one function.
framework
expert
3:00remaining
Order of execution in multiple yield fixtures
Given two pytest fixtures using yield, what is the correct order of printed output when both are used in a test?
PyTest
import pytest

@pytest.fixture
def fixture_a():
    print("Setup A")
    yield
    print("Teardown A")

@pytest.fixture
def fixture_b():
    print("Setup B")
    yield
    print("Teardown B")

def test_both(fixture_a, fixture_b):
    print("Test running")
    assert True
ASetup A\nSetup B\nTest running\nTeardown B\nTeardown A
BSetup B\nSetup A\nTest running\nTeardown A\nTeardown B
CSetup B\nSetup A\nTest running\nTeardown B\nTeardown A
DSetup A\nSetup B\nTest running\nTeardown A\nTeardown B
Attempts:
2 left
💡 Hint
Fixtures are set up in order of parameters, but teardown happens in reverse order.