O2Sound_ver2_final/backend/tests/SQLITE_ARRAY_SOLUTION.md

3.0 KiB

SQLite ARRAY 타입 문제 해결 가이드

문제 원인

  • PostgreSQL의 ARRAY 타입은 SQLite에서 지원되지 않습니다
  • Item 모델의 hashtags 필드가 ARRAY(String(30)) 타입으로 정의되어 있어 에러 발생

해결 방법

방법 1: Mock만 사용하는 간단한 테스트 (권장)

# simple 옵션으로 실행 (데이터베이스 없이 Mock만 사용)
./run-tests.sh simple

# 또는 특정 테스트만
./run-tests.sh auth

방법 2: 수동으로 conftest 변경

# 간단한 conftest 사용
cp tests/conftest_simple.py tests/conftest.py

# 테스트 실행
poetry run pytest tests/api/v1/test_auth.py -v

# 원래대로 복원
git checkout tests/conftest.py

방법 3: PostgreSQL 테스트 데이터베이스 사용

# PostgreSQL 설치 (Ubuntu)
sudo apt-get install postgresql postgresql-contrib

# 테스트 데이터베이스 생성
sudo -u postgres createdb test_o2sound

# 환경변수 설정
export TEST_DATABASE_URL="postgresql://postgres:password@localhost/test_o2sound"

# conftest.py 수정하여 PostgreSQL 사용

방법 4: 특정 모델 테스트 제외

# 데이터베이스 관련 테스트 제외하고 실행
poetry run pytest tests/ -v \
  --ignore=tests/test_database_integration.py \
  --ignore=tests/test_integration_scenarios.py

빠른 실행 명령어

API 테스트만 실행 (Mock 사용)

# 인증 API 테스트
poetry run pytest tests/api/v1/test_auth.py -v -k "not database"

# 사용자 API 테스트
poetry run pytest tests/api/v1/test_user.py -v

# 모든 API 테스트 (데이터베이스 제외)
poetry run pytest tests/api/ -v

환경별 실행

# 개발 환경 (Mock만 사용)
TESTING=1 poetry run pytest tests/api/v1/test_auth.py -v

# CI/CD 환경
docker run --rm -v $(pwd):/app python:3.12 sh -c "cd /app && pip install pytest && pytest tests/"

영구적인 해결책

1. 테스트용 모델 생성

# tests/models.py
from sqlalchemy import Column, String, Text
from app.domain.models.base import BaseModel

class TestItem(BaseModel):
    __tablename__ = "test_items"
    
    name = Column(String, nullable=False)
    hashtags = Column(Text)  # JSON으로 저장

2. 조건부 import

# app/domain/models/item.py
import os
from sqlalchemy import Column, String
from sqlalchemy.dialects.postgresql import ARRAY

if os.getenv('TESTING'):
    from sqlalchemy import Text as ARRAY_TYPE
else:
    ARRAY_TYPE = ARRAY(String(30))

class Item(BaseModel):
    hashtags = Column(ARRAY_TYPE, nullable=True)

추천 워크플로우

  1. 로컬 개발: Mock만 사용하는 간단한 테스트

    ./run-tests.sh auth
    
  2. CI/CD: PostgreSQL 도커 컨테이너 사용

    services:
      postgres:
        image: postgres:15
        env:
          POSTGRES_PASSWORD: test
    
  3. 통합 테스트: 실제 PostgreSQL 사용

    docker-compose up -d postgres
    pytest tests/ --integration