Bird
Raised Fist0
PyTesttesting~8 mins

Fixture teardown (yield) in PyTest - Framework Patterns

Choose your learning style10 modes available
Framework Mode - Fixture teardown (yield)
Folder Structure
tests/
├── test_example.py
├── conftest.py
utilities/
├── helpers.py
pytest.ini

This is a simple pytest project structure. conftest.py holds fixtures including those with yield for teardown. Test files go in tests/. Utility functions live in utilities/.

Test Framework Layers
  • Fixtures Layer: conftest.py contains fixtures with setup and teardown using yield.
  • Test Layer: Test files in tests/ use fixtures to prepare and clean test state.
  • Utilities Layer: Helper functions or classes in utilities/ support tests and fixtures.
  • Configuration Layer: pytest.ini or environment variables configure test runs.
Configuration Patterns
  • Use pytest.ini to set default options like markers and test paths.
  • Use environment variables or pytest_addoption in conftest.py to select environments or browsers.
  • Store sensitive data like credentials outside code, load them in fixtures if needed.
  • Fixtures with yield handle setup before yield and teardown after, ensuring cleanup regardless of test outcome.
Test Reporting and CI/CD Integration
  • Use pytest built-in reports with --junitxml=report.xml for CI systems.
  • Integrate with CI tools (GitHub Actions, Jenkins) to run tests on push or pull requests.
  • Teardown in fixtures ensures environment is clean after tests, preventing flaky results in CI.
  • Use plugins like pytest-html for readable HTML reports.
Best Practices
  1. Use yield in fixtures to clearly separate setup and teardown steps.
  2. Keep teardown code simple and reliable to avoid leaving resources open.
  3. Scope fixtures appropriately (function, module, session) to optimize test speed and resource use.
  4. Use conftest.py for shared fixtures to avoid duplication.
  5. Always clean up external resources like files, database connections, or network sockets in teardown.
Self Check

Where in this framework structure would you add a new fixture that sets up a temporary database connection and ensures it closes after tests?

Key Result
Use pytest fixtures with yield to manage setup and teardown cleanly and reliably.

Practice

(1/5)
1. What is the main purpose of using yield in a pytest fixture?
easy
A. To separate setup and teardown code in the fixture
B. To skip the test execution
C. To run the test multiple times
D. To mark the test as expected to fail

Solution

  1. Step 1: Understand fixture setup and teardown

    In pytest, setup code prepares resources before a test, and teardown code cleans up after the test.
  2. Step 2: Role of yield in fixture

    The yield statement splits the fixture into two parts: code before yield runs before the test (setup), and code after yield runs after the test (teardown).
  3. Final Answer:

    To separate setup and teardown code in the fixture -> Option A
  4. Quick Check:

    Yield separates setup and teardown [OK]
Hint: Remember: yield splits setup and cleanup in fixtures [OK]
Common Mistakes:
  • Thinking yield skips tests
  • Confusing yield with test repetition
  • Using yield to mark test outcomes
2. Which of the following is the correct syntax for a pytest fixture using yield for teardown?
easy
A. def my_fixture(): setup() yield teardown()
B. def my_fixture(): yield setup() teardown()
C. def my_fixture(): setup() teardown() yield
D. def my_fixture(): teardown() yield setup()

Solution

  1. Step 1: Identify setup and teardown order

    Setup code must run before yield, teardown code after yield.
  2. Step 2: Check each option's order

    def my_fixture(): setup() yield teardown() correctly places setup before yield and teardown after. Others have incorrect order.
  3. Final Answer:

    def my_fixture(): setup() yield teardown() -> Option A
  4. Quick Check:

    Setup before yield, teardown after [OK]
Hint: Setup before yield, teardown after yield in fixture [OK]
Common Mistakes:
  • Placing teardown before yield
  • Calling setup after yield
  • Yield placed at the end after teardown
3. What will be the output when running this pytest fixture and test?
import pytest

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

def test_example(resource):
    print('Test running')
medium
A. Test running\nSetup\nTeardown
B. Setup\nTeardown\nTest running
C. Setup\nTest running\nTeardown
D. Teardown\nSetup\nTest running

Solution

  1. Step 1: Trace fixture execution order

    Fixture prints 'Setup' before yield, then test runs printing 'Test running', then fixture prints 'Teardown' after yield.
  2. Step 2: Combine output sequence

    Output order is 'Setup', 'Test running', then 'Teardown'.
  3. Final Answer:

    Setup\nTest running\nTeardown -> Option C
  4. Quick Check:

    Setup -> Test -> Teardown order [OK]
Hint: Yield splits setup (before) and teardown (after) print order [OK]
Common Mistakes:
  • Assuming teardown runs before test
  • Mixing print order
  • Ignoring yield effect on execution flow
4. Identify the error in this pytest fixture using yield:
@pytest.fixture
def faulty_fixture():
    yield
    setup()
    teardown()
medium
A. Teardown code must be before yield
B. Yield cannot be used in fixtures
C. Fixture must return a value instead of yield
D. Setup code is after yield, so it runs after the test instead of before

Solution

  1. Step 1: Analyze code order around yield

    Setup code should run before yield to prepare resources; here it is after yield, so it runs after the test.
  2. Step 2: Understand consequences

    This means setup runs too late, breaking test assumptions. Teardown after setup is also misplaced.
  3. Final Answer:

    Setup code is after yield, so it runs after the test instead of before -> Option D
  4. Quick Check:

    Setup must be before yield [OK]
Hint: Setup must be before yield, teardown after [OK]
Common Mistakes:
  • Placing setup after yield
  • Thinking yield is not allowed
  • Confusing teardown position
5. You want to create a pytest fixture that opens a file before a test and closes it after. Which fixture code correctly uses yield for this purpose?
hard
A. def file_fixture(): yield open('data.txt') f.close()
B. def file_fixture(): f = open('data.txt') yield f f.close()
C. def file_fixture(): f = open('data.txt') f.close() yield f
D. def file_fixture(): f = open('data.txt') yield f.close()

Solution

  1. Step 1: Open file before yield and yield file object

    def file_fixture(): f = open('data.txt') yield f f.close() opens the file, yields the file object to the test, allowing test to use it.
  2. Step 2: Close file after yield

    After test finishes, code after yield closes the file, ensuring cleanup.
  3. Final Answer:

    def file_fixture(): f = open('data.txt') yield f f.close() -> Option B
  4. Quick Check:

    Open before yield, yield resource, close after yield [OK]
Hint: Yield resource to test, cleanup after yield [OK]
Common Mistakes:
  • Closing file before yield
  • Yielding without resource variable
  • Not closing file after test
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