Fixture scope controls how often a setup code runs in tests. It helps save time by reusing setup steps when possible.
Fixture scope (function, class, module, session) in PyTest
@pytest.fixture(scope='function' or 'class' or 'module' or 'session') def fixture_name(): # setup code yield resource # teardown code
The scope parameter defines how often the fixture runs.
Default scope is function, meaning it runs before each test function.
@pytest.fixture(scope='function') def setup_function(): print('Setup for each test') yield print('Teardown for each test')
@pytest.fixture(scope='class') def setup_class(): print('Setup once per test class') yield print('Teardown once per test class')
@pytest.fixture(scope='module') def setup_module(): print('Setup once per module') yield print('Teardown once per module')
@pytest.fixture(scope='session') def setup_session(): print('Setup once per test session') yield print('Teardown once per test session')
This test shows two fixtures with different scopes. The function-scoped fixture runs before and after each test. The class-scoped fixture runs once before all tests in the class and once after.
import pytest @pytest.fixture(scope='function') def resource_function(): print('Setup function') yield 'resource' print('Teardown function') @pytest.fixture(scope='class') def resource_class(): print('Setup class') yield 'resource' print('Teardown class') class TestExample: def test_one(self, resource_function, resource_class): print('Test one running') assert resource_function == 'resource' assert resource_class == 'resource' def test_two(self, resource_function, resource_class): print('Test two running') assert resource_function == 'resource' assert resource_class == 'resource'
Use function scope for isolated tests that need fresh setup each time.
Use wider scopes like class, module, or session to speed up tests by sharing setup.
Remember teardown runs in reverse order of setup.
Fixture scope controls how often setup and teardown run.
Scopes: function (each test), class (each test class), module (each file), session (whole run).
Choosing the right scope saves time and keeps tests reliable.
Practice
function scope mean for a pytest fixture?Solution
Step 1: Understand fixture scopes
Pytest fixtures can have different scopes controlling how often they run.Step 2: Define function scope meaning
Function scope means the fixture runs before each test function and tears down after it.Final Answer:
The fixture runs once per test function. -> Option DQuick Check:
function scope = runs per test function [OK]
- Confusing function scope with class or module scope
- Thinking function scope runs once per class
- Assuming function scope runs once per session
module scope?Solution
Step 1: Recall fixture scope syntax
To set a fixture scope, use @pytest.fixture(scope='scope_name').Step 2: Match scope name for module
The correct scope name for module is 'module'.Final Answer:
@pytest.fixture(scope='module') -> Option AQuick Check:
module scope syntax = scope='module' [OK]
- Using 'session' instead of 'module' for module scope
- Forgetting to add scope parameter
- Using incorrect quotes or misspelling scope
setup_db run?
import pytest
@pytest.fixture(scope='class')
def setup_db():
print('Setup DB')
class TestA:
def test_1(self, setup_db):
pass
def test_2(self, setup_db):
pass
class TestB:
def test_3(self, setup_db):
pass
Solution
Step 1: Understand class scope behavior
Fixture with class scope runs once per test class, before any tests in that class.Step 2: Count test classes using the fixture
There are two test classes: TestA and TestB, each uses setup_db fixture.Step 3: Calculate total runs
setup_db runs once for TestA and once for TestB, total 2 times.Final Answer:
2 times -> Option CQuick Check:
class scope = once per class, 2 classes = 2 runs [OK]
- Counting runs per test method instead of per class
- Confusing class scope with function scope
- Ignoring multiple test classes
import pytest
@pytest.fixture(scope='modul')
def setup_env():
pass
def test_example(setup_env):
assert True
Solution
Step 1: Check fixture scope spelling
The scope value 'modul' is misspelled; correct is 'module'.Step 2: Understand effect of typo
Pytest will not recognize the scope and may default or error, causing fixture not to run properly.Final Answer:
Typo in scope value causes fixture not to run. -> Option BQuick Check:
Scope must be spelled correctly [OK]
- Assuming fixture must return a value
- Confusing fixture decorator with marker
- Ignoring spelling errors in parameters
Solution
Step 1: Understand the requirement
The database connection should be initialized once before all tests in multiple modules and closed after all tests.Step 2: Match scope to requirement
Session scope runs once per entire test session, perfect for setup/teardown across all modules.Final Answer:
Usesessionscope to share across all tests in the run. -> Option AQuick Check:
Session scope = once per test run [OK]
- Choosing function or class scope which run too often
- Using module scope which limits to one file
- Not matching scope to resource lifetime
Ready to prove it?
Pass the test and this pattern moves unknown
