Pytest Fixtures

Pytest fixtures for test setup and teardown.

Basic Fixtures

import pytest

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

Use fixture
def test_data(sample_data):
    assert sample_data["name"] == "John"

Fixture Scopes

Function scope (default)
@pytest.fixture(scope="function")
def func_fixture():
    return "data"

Class scope
@pytest.fixture(scope="class")
def class_fixture():
    return "shared"

Module scope
@pytest.fixture(scope="module")
def module_fixture():
    return "once per module"

Session scope
@pytest.fixture(scope="session")
def session_fixture():
    return "once per session"

Fixture Teardown

Using yield
@pytest.fixture
def database():
    db = create_database()
    yield db
    db.close()

Using request.addfinalizer
@pytest.fixture
def resource(request):
    r = acquire_resource()
    request.addfinalizer(lambda: r.release())
    return r

Parametrized Fixtures

Parametrize fixture
@pytest.fixture(params=[1, 2, 3])
def number(request):
    return request.param

def test_number(number):
    assert number > 0

Parametrize test
@pytest.mark.parametrize("input,expected", [
    (1, 2),
    (2, 4),
    (3, 6)
])
def test_double(input, expected):
    assert input * 2 == expected