Fixture composition helps you reuse setup code by combining simple fixtures into bigger ones. This keeps tests clean and avoids repeating code.
Fixture composition in PyTest
import pytest @pytest.fixture def fixture_a(): return 'data from A' @pytest.fixture def fixture_b(fixture_a): return f'B uses {fixture_a}'
Fixtures can accept other fixtures as parameters to compose setups.
pytest automatically injects the required fixtures when running tests.
logged_in_user fixture uses user fixture and adds more setup.import pytest @pytest.fixture def user(): return {'name': 'Alice'} @pytest.fixture def logged_in_user(user): user['logged_in'] = True return user
prepared_db that depends on db_connection.import pytest @pytest.fixture def db_connection(): return 'db connection' @pytest.fixture def prepared_db(db_connection): return f'{db_connection} with test data loaded'
This test uses fixture composition: api_endpoint depends on base_url. The test checks the composed URL.
import pytest @pytest.fixture def base_url(): return 'http://example.com' @pytest.fixture def api_endpoint(base_url): return f'{base_url}/api/v1' def test_api(api_endpoint): assert api_endpoint == 'http://example.com/api/v1' if __name__ == '__main__': pytest.main([__file__])
Use fixture composition to keep your test setup modular and easy to update.
pytest injects fixtures by matching parameter names, so names must match exactly.
Fixtures can be scoped (function, module, session) to control how often they run.
Fixture composition lets you build complex setups from simple fixtures.
It avoids repeating code and makes tests easier to maintain.
pytest automatically handles fixture dependencies by matching names.
Practice
Solution
Step 1: Understand fixture composition purpose
Fixture composition means using simple fixtures inside other fixtures to build complex setups.Step 2: Identify the main benefit
This avoids repeating code and makes tests easier to maintain by reusing fixtures.Final Answer:
It allows reusing simple fixtures to build complex test setups. -> Option DQuick Check:
Fixture composition = reuse fixtures [OK]
- Thinking fixture composition auto-generates data
- Confusing fixture composition with test parallelization
- Believing it removes the need for assertions
Solution
Step 1: Recall fixture dependency syntax
In pytest, to use one fixture inside another, list the dependent fixture as a parameter.Step 2: Check options for correct syntax
def fixture_a(fixture_b): pass shows a fixture function with another fixture as a parameter, which is correct.Final Answer:
def fixture_a(fixture_b): pass -> Option AQuick Check:
Fixture dependency = parameter in fixture function [OK]
- Calling fixture functions directly inside another fixture
- Using class syntax for fixtures incorrectly
- Yielding fixture names instead of using parameters
test_combined?
import pytest
@pytest.fixture
def data():
return 5
@pytest.fixture
def multiplier(data):
return data * 2
def test_combined(multiplier):
assert multiplier == 10
print(f"Result: {multiplier}")Solution
Step 1: Trace fixture values
The fixturedatareturns 5. The fixturemultiplierusesdataand returns 5 * 2 = 10.Step 2: Analyze test behavior
The test receivesmultiplieras 10, asserts it equals 10 (true), then prints 'Result: 10'.Final Answer:
Test passes and prints 'Result: 10' -> Option BQuick Check:
Fixture value = 10, assertion true [OK]
- Assuming fixture returns original data, not multiplied
- Expecting runtime errors without missing fixtures
- Confusing syntax errors with correct fixture code
import pytest
@pytest.fixture
def base_value():
return 3
@pytest.fixture
def composed_fixture():
value = base_value
return value + 2
def test_value(composed_fixture):
assert composed_fixture == 5Solution
Step 1: Check how base_value is used inside composed_fixture
Insidecomposed_fixture,value = base_valueassigns the function, not its result.Step 2: Correct usage of fixture call
Fixtures are injected by pytest, but inside another fixture you must accept them as parameters or call them properly. Here, base_value should be a parameter or called with parentheses if used directly.Final Answer:
Missing parentheses when calling base_value fixture inside composed_fixture -> Option CQuick Check:
Fixture call needs parentheses or parameter injection [OK]
- Assigning fixture function instead of calling it
- Returning values incorrectly from fixtures
- Misunderstanding fixture injection in tests
full_setup that uses two fixtures db_connection and user_data. The full_setup should return a dictionary combining both. Which code correctly composes these fixtures?Solution
Step 1: Understand fixture composition with parameters
Fixtures can be composed by listing dependent fixtures as parameters in the fixture function.Step 2: Check correct dictionary merging
import pytest @pytest.fixture def full_setup(db_connection, user_data): return {**db_connection, **user_data} correctly accepts both fixtures as parameters and merges their dictionaries using unpacking syntax.Final Answer:
import pytest @pytest.fixture def full_setup(db_connection, user_data): return {**db_connection, **user_data} -> Option AQuick Check:
Fixture composition with parameters and dict merge [OK]
- Calling fixtures like functions inside another fixture
- Trying to merge fixtures without parameters
- Using unsupported operations like + on dicts
Ready to prove it?
Pass the test and this pattern moves unknown
