Loading...
Loading...
Creates pytest fixtures following project patterns including factory fixtures, async fixtures, and multi-layer organization. Use when setting up test fixtures, creating test data, organizing test utilities, or structuring conftest.py files. Works with Python test files, pytest configuration, and .py test utilities.
npx skill4agent add dawiddutoit/custom-claude setup-pytest-fixturesimport pytest
@pytest.fixture
def mock_settings():
"""Create mock settings for testing."""
settings = MagicMock()
settings.project = MagicMock()
settings.project.project_name = "test_project"
return settings@pytest.fixture
def mock_settings_factory():
"""Factory for custom mock settings."""
def create_settings(**kwargs):
settings = MagicMock()
settings.project = MagicMock()
settings.project.project_name = kwargs.get("project_name", "test_project")
return settings
return create_settingsmock_settings_minimalmock_settings_factory(**kwargs)@pytest_asyncio.fixture async def...@pytest.fixture(scope="session")tests/utils/mock_settings.pymock_services.pymock_drivers.pyenvironmental_helpers.pytests/conftest.pytests/unit/conftest.pytests/integration/conftest.pytests/e2e/conftest.pyimport pytest
from unittest.mock import MagicMock
@pytest.fixture
def fixture_name():
"""Clear docstring explaining purpose."""
# Setup
obj = MagicMock()
obj.attribute = "value"
# Return (no yield for simple fixtures)
return obj@pytest.fixture
def fixture_factory():
"""Factory for custom fixture."""
def create_fixture(**kwargs):
"""Create fixture with custom attributes.
Args:
**kwargs: Attributes to customize
Returns:
MagicMock: Configured fixture
"""
obj = MagicMock()
obj.attribute = kwargs.get("attribute", "default_value")
return obj
return create_fixtureimport pytest_asyncio
from collections.abc import AsyncGenerator
@pytest_asyncio.fixture(scope="function")
async def async_fixture() -> AsyncGenerator[Resource, None]:
"""Async fixture with setup and teardown."""
# Setup
resource = await create_resource()
yield resource
# Teardown
await resource.close()@pytest.fixture(scope="session")
def session_fixture():
"""Session-scoped fixture created once."""
# Expensive setup
resource = expensive_setup()
yield resource
# Cleanup after all tests
resource.cleanup()tests/utils/mock_*.py"""Reusable mock fixtures for [component] components."""
from unittest.mock import MagicMock
import pytest
@pytest.fixture
def fixture_name():
"""Fixture docstring."""
return MagicMock()tests/conftest.py# Import to make available project-wide
from tests.utils.mock_settings import (
fixture_name,
)
__all__ = [
"fixture_name",
]# tests/unit/conftest.py
import pytest
@pytest.fixture
def unit_specific_fixture():
"""Fixture only for unit tests."""
return MagicMock()def test_something(fixture_name):
"""Test using fixture."""
assert fixture_name.attribute == "value"def test_with_factory(fixture_factory):
"""Test using factory fixture."""
custom = fixture_factory(attribute="custom_value")
assert custom.attribute == "custom_value"@pytest.mark.asyncio
async def test_async(async_fixture):
"""Test using async fixture."""
result = await async_fixture.operation()
assert result == expecteddef test_with_multiple(fixture_one, fixture_two, fixture_factory):
"""Test using multiple fixtures."""
custom = fixture_factory(value="test")
assert fixture_one.works_with(fixture_two, custom)import pytest
from unittest.mock import MagicMock
@pytest.fixture
def mock_settings_minimal():
"""Create minimal mock settings for basic testing."""
settings = MagicMock()
settings.project = MagicMock()
settings.project.project_name = "test_project"
settings.neo4j = MagicMock()
settings.neo4j.database_name = "test_db"
return settings@pytest.fixture
def mock_settings_factory():
"""Factory for custom mock settings."""
def create_settings(**kwargs):
settings = MagicMock()
settings.project = MagicMock()
settings.project.project_name = kwargs.get("project_name", "test_project")
settings.neo4j = MagicMock()
settings.neo4j.database_name = kwargs.get("database_name", "test_db")
settings.chunking = MagicMock()
settings.chunking.chunk_size = kwargs.get("chunk_size", 50)
return settings
return create_settingsimport pytest_asyncio
from collections.abc import AsyncGenerator
from neo4j import AsyncGraphDatabase, AsyncDriver
@pytest_asyncio.fixture(scope="function")
async def real_neo4j_driver() -> AsyncGenerator[AsyncDriver, None]:
"""Create a real Neo4j driver with cleanup."""
driver = AsyncGraphDatabase.driver(
"bolt://localhost:7687",
auth=("neo4j", "password")
)
# Setup: Clear test data
async with driver.session(database="test_db") as session:
await session.run("MATCH (n {project_name: 'test_project'}) DETACH DELETE n")
yield driver
# Teardown: Close driver
await driver.close()uv pip install pytestuv pip install pytest-asynciotests/utils/tests/conftest.pytests/unit/conftest.pytests/integration/conftest.pytests/e2e/conftest.pymock_functionsessionmoduleyieldtests/utils/conftest.py@pytest.fixture
def mock_settings():
"""Standard settings mock."""
settings = MagicMock()
settings.project = MagicMock()
settings.neo4j = MagicMock()
return settings@pytest.fixture
def mock_service_result():
"""Factory for ServiceResult mocks."""
def create_result(success=True, data=None, error=None):
result = MagicMock()
result.is_success = success
result.data = data
result.error = error
return result
return create_result@pytest.fixture
def mock_embedding_service():
"""Async embedding service mock."""
service = AsyncMock()
service.generate_embeddings = AsyncMock(
return_value=MagicMock(success=True, data=[[0.1] * 384])
)
return servicetests/conftest.py__all__pytest-asynciouv pip install pytest-asyncio@pytest_asyncio.fixture@pytest.fixture@pytest.mark.asyncioyieldreturnawaitpython .claude/skills/setup-pytest-fixtures/scripts/generate_fixture.py \
--name mock_service --type factory --attributes host,port,timeoutpython .claude/skills/setup-pytest-fixtures/scripts/analyze_fixture_usage.py --unusedpython .claude/skills/setup-pytest-fixtures/scripts/organize_fixtures.py --validatetests/utils/mock_settings.pytests/utils/mock_services.pytests/utils/mock_drivers.pytests/utils/environmental_helpers.py