Bird
Raised Fist0
PyTesttesting~5 mins

@pytest.fixture decorator

Choose your learning style10 modes available
Introduction

The @pytest.fixture decorator helps create reusable setup code for tests. It makes tests cleaner and avoids repeating the same preparation steps.

When multiple tests need the same setup, like creating a test database connection.
When you want to prepare test data once and use it in many tests.
When you want to clean up resources after tests run, like closing files or connections.
When you want to share common objects or states between tests without repeating code.
Syntax
PyTest
@pytest.fixture
def fixture_name():
    # setup code
    yield resource
    # teardown code (optional)

The function decorated with @pytest.fixture can return or yield a resource.

Using yield allows you to run cleanup code after the test finishes.

Examples
This fixture returns a simple list that tests can use.
PyTest
@pytest.fixture
def sample_data():
    return [1, 2, 3]
This fixture opens a file before the test and closes it after the test finishes.
PyTest
@pytest.fixture
def open_file():
    f = open('test.txt', 'w')
    yield f
    f.close()
Sample Program

This test script uses the numbers fixture to provide a list to two tests. Both tests use the same data without repeating setup code.

PyTest
import pytest

@pytest.fixture
def numbers():
    return [10, 20, 30]


def test_sum(numbers):
    assert sum(numbers) == 60

def test_max(numbers):
    assert max(numbers) == 30
OutputSuccess
Important Notes

Fixtures improve test readability and reduce duplicated setup code.

You can use fixtures inside other fixtures to build complex setups.

Fixtures can have scopes like function, module, or session to control how often they run.

Summary

@pytest.fixture creates reusable setup code for tests.

Fixtures help keep tests clean and avoid repeating preparation steps.

Use yield in fixtures to add cleanup after tests run.

Practice

(1/5)
1. What is the main purpose of the @pytest.fixture decorator in pytest?
easy
A. To define a test case with parameters
B. To mark a test as expected to fail
C. To create reusable setup code that can be shared across multiple tests
D. To skip a test during execution

Solution

  1. Step 1: Understand what @pytest.fixture does

    The @pytest.fixture decorator is used to create setup code that can be reused in many tests to avoid repetition.
  2. Step 2: Compare options with the fixture purpose

    Options A, B, and C describe other pytest features, not fixtures.
  3. Final Answer:

    To create reusable setup code that can be shared across multiple tests -> Option C
  4. Quick Check:

    Fixture = reusable setup code [OK]
Hint: Fixtures provide shared setup for tests to avoid repetition [OK]
Common Mistakes:
  • Confusing fixtures with test skipping or marking
  • Thinking fixtures run tests themselves
  • Believing fixtures are only for cleanup
2. Which of the following is the correct syntax to define a fixture named db_connection in pytest?
easy
A. def db_connection(): pass
B. @pytest.fixture def db_connection(): pass
C. @fixture def db_connection(): pass
D. @pytest.test def db_connection(): pass

Solution

  1. Step 1: Identify correct decorator usage

    The correct decorator for fixtures is @pytest.fixture, fully qualified with the pytest module.
  2. Step 2: Check each option

    @pytest.fixture def db_connection(): pass uses @pytest.fixture correctly. def db_connection(): pass misses the decorator. @fixture def db_connection(): pass uses @fixture without importing. @pytest.test def db_connection(): pass uses @pytest.test which is invalid.
  3. Final Answer:

    @pytest.fixture def db_connection(): pass -> Option B
  4. Quick Check:

    Use @pytest.fixture before function [OK]
Hint: Always prefix fixture with @pytest.fixture decorator [OK]
Common Mistakes:
  • Omitting the @pytest.fixture decorator
  • Using @fixture without importing pytest
  • Confusing @pytest.test with fixture decorator
3. Given the following pytest code, what will be the output when running the test?
import pytest

@pytest.fixture
def sample_data():
    return [1, 2, 3]

def test_sum(sample_data):
    assert sum(sample_data) == 6
    print('Test passed')
medium
A. No output printed, test passes silently
B. Test fails with assertion error
C. SyntaxError due to fixture usage
D. Test passed printed and test passes

Solution

  1. Step 1: Understand fixture usage

    The fixture sample_data returns a list [1, 2, 3]. The test receives this list as argument.
  2. Step 2: Check assertion and print

    The sum of [1, 2, 3] is 6, so the assertion passes. The print statement runs and outputs 'Test passed'.
  3. Final Answer:

    Test passed printed and test passes -> Option D
  4. Quick Check:

    Fixture provides data, assertion true, print runs [OK]
Hint: Fixture returns data; test uses it and prints on success [OK]
Common Mistakes:
  • Assuming fixture causes syntax error
  • Thinking print won't show during test run
  • Believing assertion fails with correct sum
4. Identify the error in this fixture code and how to fix it:
import pytest

@pytest.fixture
def resource():
    setup = open('file.txt')
    yield setup
    setup.close()
medium
A. File 'file.txt' may not exist causing runtime error
B. No error; code is correct
C. Missing parentheses in yield statement
D. Fixture must return value, not yield

Solution

  1. Step 1: Analyze fixture code

    The fixture opens a file and yields the file object, then closes it after test.
  2. Step 2: Identify potential runtime issue

    If 'file.txt' does not exist, open() will raise an error before yield. This is a runtime error, not syntax.
  3. Final Answer:

    File 'file.txt' may not exist causing runtime error -> Option A
  4. Quick Check:

    File open can fail if file missing [OK]
Hint: Check external resources exist before opening in fixture [OK]
Common Mistakes:
  • Thinking yield needs parentheses
  • Believing fixtures cannot use yield
  • Ignoring file existence errors
5. How can you modify this fixture to ensure cleanup code runs after the test, even if the test fails?
import pytest

@pytest.fixture
def temp_file():
    f = open('temp.txt', 'w')
    yield f
    f.close()
hard
A. Use try-finally inside the fixture around yield
B. Replace yield with return
C. Remove yield and close file before returning
D. Add a separate test to close the file

Solution

  1. Step 1: Understand fixture cleanup with yield

    Using yield in fixtures allows code after yield to run as cleanup after the test finishes.
  2. Step 2: Ensure cleanup runs even if test fails

    Wrapping yield with try-finally ensures the cleanup code (file close) runs no matter what happens in the test.
  3. Final Answer:

    Use try-finally inside the fixture around yield -> Option A
  4. Quick Check:

    try-finally ensures cleanup after yield [OK]
Hint: Wrap yield with try-finally to guarantee cleanup [OK]
Common Mistakes:
  • Replacing yield with return loses cleanup
  • Closing file before yield stops test using it
  • Adding separate test for cleanup is incorrect
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