Fixtures help set up things your tests need. Sometimes one fixture needs another fixture to work. This is called fixture dependency.
Fixture dependencies (fixture using fixture) in PyTest
Introduction
Syntax
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 by naming them.
pytest automatically runs the dependent fixture first and passes its result.
Examples
user fixture depends on db_connection fixture.PyTest
import pytest @pytest.fixture def db_connection(): return "db connection" @pytest.fixture def user(db_connection): return f"user with {db_connection}"
client fixture uses config fixture to get URL.PyTest
import pytest @pytest.fixture def config(): return {"url": "http://example.com"} @pytest.fixture def client(config): return f"client using {config['url']}"
Sample Program
This test shows a fixture api_client that depends on base_url. The test checks the combined string and prints it.
PyTest
import pytest @pytest.fixture def base_url(): return "http://testsite.com" @pytest.fixture def api_client(base_url): return f"API client connected to {base_url}" def test_api(api_client): assert api_client == "API client connected to http://testsite.com" print(api_client)
Important Notes
Fixture dependencies help keep tests clean and avoid repeating setup code.
pytest resolves fixture dependencies automatically in the right order.
Use descriptive fixture names to make dependencies clear.
Summary
Fixtures can use other fixtures by naming them as parameters.
This helps build reusable and organized test setups.
pytest runs dependent fixtures first and passes their results automatically.
Practice
1. What happens when a pytest fixture uses another fixture as a parameter?
easy
Solution
Step 1: Understand fixture dependency in pytest
When a fixture uses another fixture as a parameter, pytest recognizes this dependency and runs the dependent fixture first.Step 2: How pytest passes results between fixtures
pytest automatically passes the result of the dependent fixture to the main fixture as an argument.Final Answer:
pytest runs the dependent fixture first and passes its result automatically -> Option CQuick Check:
Fixture dependency means automatic result passing [OK]
Hint: Dependent fixtures run first and pass results automatically [OK]
Common Mistakes:
- Thinking fixtures run independently without passing results
- Believing fixture dependencies cause errors
- Assuming fixtures run in parallel without order
2. Which of the following is the correct syntax to use one fixture inside another in pytest?
easy
Solution
Step 1: Check how fixtures receive other fixtures
Fixtures use other fixtures by naming them as parameters in the function definition.Step 2: Validate the syntax of fixture_b
@pytest.fixture def fixture_a(): return 5 @pytest.fixture def fixture_b(fixture_a): return fixture_a + 3 correctly defines fixture_b with fixture_a as a parameter, allowing pytest to inject fixture_a's return value.Final Answer:
@pytest.fixture def fixture_b(fixture_a): return fixture_a + 3 -> Option AQuick Check:
Fixture as parameter = correct syntax [OK]
Hint: Use fixture names as parameters to depend on them [OK]
Common Mistakes:
- Calling fixture functions directly inside another fixture
- Not passing dependent fixture as parameter
- Trying to use fixture variables without parameters
3. Given the code below, what will be the output when running the test?
import pytest
@pytest.fixture
def base():
return 10
@pytest.fixture
def add_five(base):
return base + 5
def test_sum(add_five):
assert add_five == 15
print(add_five)medium
Solution
Step 1: Understand fixture dependency and values
The fixture 'base' returns 10. The fixture 'add_five' uses 'base' and returns 10 + 5 = 15.Step 2: Analyze the test function output
The test asserts that 'add_five' equals 15, which is true, then prints 15.Final Answer:
15 -> Option DQuick Check:
Dependent fixture value = 15 [OK]
Hint: Dependent fixture returns combined value, test prints it [OK]
Common Mistakes:
- Confusing fixture return values
- Expecting base value instead of combined
- Assuming print outputs test result
4. Identify the error in the following pytest fixture code:
import pytest
@pytest.fixture
def data():
return [1, 2, 3]
@pytest.fixture
def processed_data():
data.append(4)
return datamedium
Solution
Step 1: Check how 'processed_data' accesses 'data'
'processed_data' tries to use 'data' but does not receive it as a parameter, so 'data' is undefined in its scope.Step 2: Correct way to use fixture dependencies
To use one fixture inside another, the dependent fixture must be listed as a parameter in the function definition.Final Answer:
'data' fixture is not passed as a parameter to 'processed_data' fixture -> Option BQuick Check:
Fixture dependency requires parameter passing [OK]
Hint: Always pass dependent fixtures as parameters [OK]
Common Mistakes:
- Using fixture names without parameters
- Calling fixture functions directly inside another fixture
- Missing @pytest.fixture decorator
5. You want to create a pytest fixture
full_config that depends on two other fixtures: base_config returning a dict {'host': 'localhost'} and auth_config returning {'user': 'admin'}. Which code correctly combines these fixtures so full_config returns {'host': 'localhost', 'user': 'admin'}?hard
Solution
Step 1: Understand fixture dependencies and parameter passing
To combine two fixtures, the dependent fixture must list both as parameters to receive their return values.Step 2: Combine dictionaries correctly
Using {**dict1, **dict2} merges two dictionaries into one. @pytest.fixture def base_config(): return {'host': 'localhost'} @pytest.fixture def auth_config(): return {'user': 'admin'} @pytest.fixture def full_config(base_config, auth_config): return {**base_config, **auth_config} correctly does this with both fixtures as parameters.Final Answer:
@pytest.fixture def full_config(base_config, auth_config): return {**base_config, **auth_config} -> Option AQuick Check:
Pass fixtures as parameters and merge dicts [OK]
Hint: Pass all fixtures as parameters and merge dicts with ** [OK]
Common Mistakes:
- Calling fixture functions directly instead of passing as parameters
- Trying to add dictionaries with + operator
- Using dict.update() which returns null
Recommended
Ready to prove it?
Pass the test and this pattern moves unknown
10 questions ~5 mineasy hard
