Sometimes tests need to use the same resource like a file or database. Handling shared resources helps tests run smoothly without breaking each other.
Handling shared resources in PyTest
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
PyTest
import pytest @pytest.fixture(scope="module") def shared_resource(): resource = setup_resource() yield resource teardown_resource(resource)
Use @pytest.fixture to create shared resources.
The scope controls how often the resource is created and destroyed.
Examples
PyTest
import pytest @pytest.fixture(scope="function") def resource(): print("Setup resource") yield "data" print("Teardown resource")
PyTest
import pytest @pytest.fixture(scope="module") def resource(): print("Setup once per module") yield "data" print("Teardown once per module")
PyTest
import pytest @pytest.fixture(scope="session") def resource(): print("Setup once per session") yield "data" print("Teardown once per session")
Sample Program
This example shows a shared list used by two tests. The list is set up once per module and cleared after all tests run.
PyTest
import pytest @pytest.fixture(scope="module") def shared_list(): print("Setup shared list") data = [] yield data print("Teardown shared list") data.clear() def test_append(shared_list): shared_list.append(1) assert shared_list == [1] def test_append_again(shared_list): shared_list.append(2) assert shared_list == [1, 2]
Important Notes
Always clean up shared resources to avoid side effects between tests.
Choose the right scope to balance speed and isolation.
Use yield in fixtures to separate setup and teardown steps clearly.
Summary
Shared resources help tests reuse setup work and avoid conflicts.
Use pytest fixtures with scopes to control resource lifetime.
Clean up resources after tests to keep tests independent and reliable.
Practice
1. What is the main purpose of using shared resources in pytest tests?
easy
Solution
Step 1: Understand shared resources in testing
Shared resources allow multiple tests to use the same setup, saving time and avoiding repeated work.Step 2: Recognize the benefit of avoiding conflicts
Using shared resources carefully prevents tests from interfering with each other, keeping results reliable.Final Answer:
To reuse setup work and avoid conflicts between tests -> Option BQuick Check:
Shared resources = reuse setup + avoid conflicts [OK]
Hint: Shared resources save setup time and prevent test clashes [OK]
Common Mistakes:
- Thinking shared resources slow tests down
- Believing shared resources remove the need for setup
- Confusing shared resources with skipping tests
2. Which pytest fixture scope is best to share a resource across all tests in a module?
easy
Solution
Step 1: Recall pytest fixture scopes
"function" runs for each test, "class" for each test class, "module" for all tests in a file, "session" for all tests in a run.Step 2: Identify scope for sharing in a module
To share a resource across all tests in one module (file), use "module" scope.Final Answer:
"module" scope -> Option DQuick Check:
Module scope = share resource in one file [OK]
Hint: "module" scope shares resource across one test file [OK]
Common Mistakes:
- Using "function" scope which creates resource per test
- Choosing "class" scope which limits sharing to test classes
- Confusing "session" scope which shares across all tests
3. What will be the output of this pytest fixture usage?
import pytest
@pytest.fixture(scope="module")
def resource():
print("Setup resource")
yield "data"
print("Teardown resource")
def test_one(resource):
assert resource == "data"
def test_two(resource):
assert resource == "data"medium
Solution
Step 1: Understand fixture scope and yield behavior
With "module" scope, setup runs once before all tests in the module, yield provides the resource, and teardown runs once after all tests.Step 2: Analyze print outputs during test run
"Setup resource" prints once before tests, both tests use the resource and pass, then "Teardown resource" prints once after all tests.Final Answer:
Setup resource printed once, then tests pass, then Teardown resource printed once -> Option AQuick Check:
Module scope fixture setup/teardown run once [OK]
Hint: Module scope fixture setup/teardown run once per module [OK]
Common Mistakes:
- Expecting setup/teardown to run before and after each test
- Thinking print statements are suppressed
- Confusing fixture scope with function scope
4. Identify the error in this pytest fixture that shares a database connection:
@pytest.fixture(scope="module")
def db_connection():
conn = open_db()
yield conn
conn.close()
def test_query(db_connection):
assert db_connection.execute("SELECT 1") == 1
def test_insert(db_connection):
db_connection.execute("INSERT INTO table VALUES (1)")medium
Solution
Step 1: Review fixture setup and teardown
The fixture opens a connection, yields it, then closes it after all tests in the module.Step 2: Consider side effects of shared connection
Because the connection is shared and not reset between tests, changes in one test (like insert) may affect others, causing flaky tests.Final Answer:
The connection might be shared but not reset between tests causing side effects -> Option AQuick Check:
Shared resource without reset risks test interference [OK]
Hint: Shared resources need reset or isolation to avoid side effects [OK]
Common Mistakes:
- Thinking connection is never closed
- Assuming function scope is always required
- Missing yield statement in fixture
5. You want to share a temporary folder between tests but ensure it is empty before each test. Which pytest fixture setup is best?
hard
Solution
Step 1: Understand the need to share and clean resource
You want to share the folder to save setup time but also ensure it is empty before each test to avoid leftover files.Step 2: Choose fixture scope and cleanup strategy
A "function" scoped fixture creates and deletes the folder for each test, ensuring it is empty before each test and avoiding leftover files.Final Answer:
Use a "function" scoped fixture that creates and deletes the folder for each test -> Option CQuick Check:
Function scope fixture creates clean folder per test [OK]
Hint: Create and delete resource per test for clean state [OK]
Common Mistakes:
- Using function scope causing slow tests
- Using session scope without cleanup causing test pollution
- Using class scope which limits sharing incorrectly
