본문으로 건너뛰기

[pydantic-ai] DBOS 테스트용 인메모리 SQLite 되돌리기: 파일 기반 DB 복원

PR 링크: pydantic/pydantic-ai#3921 상태: Merged | 변경: +14 / -7

들어가며

PR #3800에서 DBOS 테스트의 SQLite를 인메모리(sqlite:///:memory:?cache=shared)로 전환했지만, DBOS 내부 동작과의 호환성 문제가 발견되어 파일 기반 SQLite로 되돌립니다. 이 PR은 "때로는 최적화를 되돌려야 한다"는 실용적 판단의 좋은 사례입니다.

핵심 코드 분석

Before (인메모리 SQLite - PR #3800):

from sqlalchemy import create_engine
from sqlalchemy.pool import StaticPool

in_memory_engine = create_engine(
    'sqlite:///:memory:?cache=shared', connect_args={'check_same_thread': False}, poolclass=StaticPool
)

DBOS_CONFIG: DBOSConfig = {
    'name': 'pydantic_dbos_tests',
    'run_admin_server': False,
    'enable_otlp': True,
    'system_database_engine': in_memory_engine,
}

After (파일 기반 SQLite + 자동 정리):

DBOS_SQLITE_FILE = 'dbostest.sqlite'
DBOS_CONFIG: DBOSConfig = {
    'name': 'pydantic_dbos_tests',
    'system_database_url': f'sqlite:///{DBOS_SQLITE_FILE}',
    'run_admin_server': False,
    'enable_otlp': True,
}

@pytest.fixture(autouse=True, scope='module')
def cleanup_test_sqlite_file() -> Iterator[None]:
    if os.path.exists(DBOS_SQLITE_FILE):
        os.remove(DBOS_SQLITE_FILE)
    try:
        yield
    finally:
        if os.path.exists(DBOS_SQLITE_FILE):
            os.remove(DBOS_SQLITE_FILE)

system_database_engine 대신 system_database_url을 사용하고, autouse=True, scope='module' fixture로 테스트 전후에 SQLite 파일을 자동 정리합니다. sqlalchemyStaticPool import도 제거되어 의존성이 줄었습니다.

왜 이게 좋은가

인메모리 SQLite는 빠르지만, 멀티스레드 접근, 커넥션 공유, 트랜잭션 격리 측면에서 파일 기반과 다르게 동작할 수 있습니다. DBOS처럼 내부적으로 복잡한 데이터베이스 상태 관리를 하는 시스템에서는 이런 차이가 간헐적 테스트 실패로 나타날 수 있습니다. 파일 기반으로 되돌리되 자동 정리 fixture를 추가하여 테스트 격리를 보장한 것은 균형 잡힌 접근입니다.

정리

항목 내용
되돌린 이유 인메모리 SQLite와 DBOS 내부 동작 호환성 문제
해결 파일 기반 SQLite + module-scope 자동 정리 fixture
교훈 테스트 인프라 최적화는 테스트 대상의 특성을 고려해야 함

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글