"""测试配置:每个测试用例使用隔离的内存数据库。""" import pytest from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from app.core import db as db_module from app.models import Base @pytest.fixture(autouse=True) def _isolate_db(tmp_path, monkeypatch): """每个测试用例:创建独立内存 SQLite → 建表 → 替换全局引擎 → 测试结束自动清理。 这确保测试之间完全隔离,不共享任何数据。 """ test_db_url = f"sqlite:///{tmp_path}/test.db" engine = create_engine(test_db_url, connect_args={"check_same_thread": False}) # 启用 WAL + 外键 from sqlalchemy import event, text @event.listens_for(engine, "connect") def _set_pragma(dbapi_conn, _): cursor = dbapi_conn.cursor() cursor.execute("PRAGMA journal_mode=WAL") cursor.execute("PRAGMA foreign_keys=ON") cursor.close() Base.metadata.create_all(engine) test_factory = sessionmaker(bind=engine, expire_on_commit=False) # 替换全局引擎和 session 工厂 monkeypatch.setattr(db_module, "_engine", engine) monkeypatch.setattr(db_module, "_session_factory", test_factory) # 清空内存 session 存储 from app.core import session as session_module session_module._store.clear() yield engine.dispose()