Bird
Raised Fist0
PyTesttesting~15 mins

@pytest.fixture decorator - Build an Automation Script

Choose your learning style10 modes available
Automate test using @pytest.fixture for setup
Preconditions (2)
Step 1: Create a fixture function named 'sample_data' that returns a dictionary with keys 'name' and 'age'
Step 2: Create a test function 'test_sample_data' that uses the 'sample_data' fixture as a parameter
Step 3: Inside the test, assert that 'name' in sample_data equals 'Alice'
Step 4: Assert that 'age' in sample_data equals 30
✅ Expected Result: The test passes confirming the fixture provides correct data
Automation Requirements - pytest
Assertions Needed:
Assert 'name' key in fixture data equals 'Alice'
Assert 'age' key in fixture data equals 30
Best Practices:
Use @pytest.fixture decorator for reusable setup data
Name fixtures clearly to indicate their purpose
Use fixtures as function parameters for automatic injection
Keep fixture scope default (function) unless needed otherwise
Automated Solution
PyTest
import pytest

@pytest.fixture
def sample_data():
    return {"name": "Alice", "age": 30}

def test_sample_data(sample_data):
    assert sample_data["name"] == "Alice"
    assert sample_data["age"] == 30

The @pytest.fixture decorator marks the sample_data function as a fixture. This means pytest will run it before the test that uses it and provide its return value as an argument.

The test function test_sample_data accepts sample_data as a parameter. Pytest automatically calls the fixture and passes its return value.

Assertions check that the fixture data matches expected values. This confirms the fixture setup works correctly.

This approach avoids repeating setup code in multiple tests and keeps tests clean and focused.

Common Mistakes - 3 Pitfalls
{'mistake': 'Not using the @pytest.fixture decorator on the setup function', 'why_bad': "Without the decorator, pytest won't recognize the function as a fixture and won't inject it into tests.", 'correct_approach': 'Always add @pytest.fixture above the setup function to register it as a fixture.'}
Calling the fixture function directly inside the test instead of using it as a parameter
Using mutable default arguments or global variables inside fixtures
Bonus Challenge

Modify the fixture to accept a parameter for 'name' and 'age' and run the test with three different sets of data

Show Hint

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