Add pytest markers for fast/slow test separation

- Add --run-slow flag to optionally include slow tests
- Auto-detect tests that use db_session, test_db, db_engine, or qdrant fixtures
- Skip slow tests by default for faster development iteration
- Usage: pytest (fast only) or pytest --run-slow (all tests)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Daniel O'Connell 2025-12-19 18:21:41 +01:00
parent 56ed7b7d8f
commit 93b77a16d6
2 changed files with 55 additions and 0 deletions

22
pytest.ini Normal file
View File

@ -0,0 +1,22 @@
[pytest]
testpaths = tests
python_files = test_*.py
python_classes = Test*
python_functions = test_*
# Custom markers
markers =
slow: marks tests as slow (creates database, uses containers, etc.)
integration: marks tests that require external services
db: marks tests that require database access
# Usage:
# pytest - Run fast tests only (default)
# pytest --run-slow - Run all tests including slow ones
# pytest -m slow --run-slow - Run only slow tests
# Suppress common warnings
filterwarnings =
ignore::DeprecationWarning:feedparser.*
ignore::DeprecationWarning:discord.*
ignore::sqlalchemy.exc.MovedIn20Warning

View File

@ -21,6 +21,39 @@ from memory.common.qdrant import initialize_collections
from tests.providers.email_provider import MockEmailProvider from tests.providers.email_provider import MockEmailProvider
def pytest_addoption(parser):
"""Add custom command-line options for pytest."""
parser.addoption(
"--run-slow",
action="store_true",
default=False,
help="Run slow tests (database, containers, etc.)",
)
def pytest_configure(config):
"""Configure pytest with custom markers."""
config.addinivalue_line("markers", "slow: marks tests as slow")
config.addinivalue_line("markers", "integration: marks integration tests")
config.addinivalue_line("markers", "db: marks tests that require database")
def pytest_collection_modifyitems(config, items):
"""Auto-mark tests that use slow fixtures and skip them unless --run-slow is provided."""
if config.getoption("--run-slow"):
# --run-slow given: don't skip slow tests
return
skip_slow = pytest.mark.skip(reason="need --run-slow option to run")
slow_fixtures = {"test_db", "db_engine", "db_session", "qdrant"}
for item in items:
# Check if test uses any slow fixtures
if slow_fixtures.intersection(set(getattr(item, "fixturenames", []))):
item.add_marker(pytest.mark.slow)
item.add_marker(skip_slow)
class MockRedis: class MockRedis:
"""In-memory mock of Redis for testing.""" """In-memory mock of Redis for testing."""