penti/TESTING_GUIDE.md

5.8 KiB

Testing Guide

퇴직연금 리밸런싱 + Quant 플랫폼 테스트 가이드

테스트 환경 설정

1. 테스트 데이터베이스 생성

# PostgreSQL에 테스트 데이터베이스 생성
docker-compose exec postgres psql -U postgres -c "CREATE DATABASE pension_quant_test;"

2. 의존성 설치

cd backend
pip install -r requirements-dev.txt

테스트 실행

단위 테스트 (Unit Tests)

빠르게 실행되는 단위 테스트만 실행:

pytest tests/ -m "unit" -v

통합 테스트 (Integration Tests)

데이터베이스와 API를 사용하는 통합 테스트:

pytest tests/ -m "integration" -v

전체 테스트 (느린 테스트 제외)

pytest tests/ -m "not slow and not crawler" -v

커버리지 포함 전체 테스트

pytest tests/ --cov=app --cov-report=html --cov-report=term-missing

커버리지 리포트는 htmlcov/index.html에서 확인 가능합니다.

특정 테스트 파일만 실행

pytest tests/test_api_backtest.py -v
pytest tests/test_backtest_engine.py -v
pytest tests/test_strategies.py -v

특정 테스트 클래스/함수만 실행

pytest tests/test_api_backtest.py::TestBacktestAPI::test_list_strategies -v

테스트 마커 (Markers)

프로젝트에서 사용하는 테스트 마커:

  • @pytest.mark.unit - 단위 테스트 (빠름)
  • @pytest.mark.integration - 통합 테스트 (DB/API 필요)
  • @pytest.mark.slow - 느린 테스트 (백테스트 실행 등)
  • @pytest.mark.crawler - 웹 크롤링 테스트 (외부 의존성)

테스트 구조

backend/tests/
├── conftest.py                 # Pytest 설정 및 픽스처
├── test_api_backtest.py        # 백테스트 API 테스트
├── test_api_portfolios.py      # 포트폴리오 API 테스트
├── test_api_rebalancing.py     # 리밸런싱 API 테스트
├── test_api_data.py            # 데이터 API 테스트
├── test_backtest_engine.py     # 백테스트 엔진 단위 테스트
└── test_strategies.py          # 전략 일관성 테스트

Fixtures

주요 pytest fixture:

db_session

새로운 데이터베이스 세션을 생성합니다. 각 테스트 후 롤백됩니다.

def test_something(db_session):
    # db_session 사용
    pass

client

FastAPI 테스트 클라이언트를 제공합니다.

def test_api_endpoint(client):
    response = client.get("/api/v1/endpoint")
    assert response.status_code == 200

sample_assets

테스트용 샘플 자산 데이터를 생성합니다.

def test_with_assets(sample_assets):
    # sample_assets는 3개의 Asset 객체 리스트
    pass

sample_price_data

테스트용 가격 데이터를 생성합니다 (30일치).

def test_with_prices(sample_price_data):
    # sample_price_data는 PriceData 객체 리스트
    pass

sample_portfolio

테스트용 포트폴리오를 생성합니다.

def test_portfolio(sample_portfolio):
    # sample_portfolio는 Portfolio 객체
    pass

통합 테스트 스크립트

전체 시스템 통합 테스트:

cd scripts
chmod +x run_tests.sh
./run_tests.sh

이 스크립트는 다음을 수행합니다:

  1. Docker 서비스 확인
  2. PostgreSQL 준비 대기
  3. 데이터베이스 마이그레이션
  4. 단위 테스트 실행
  5. 통합 테스트 실행
  6. API 헬스 체크
  7. 전략 엔드포인트 테스트
  8. Celery 워커 확인
  9. Flower 모니터링 확인
  10. Frontend 접근성 확인

배포 검증

배포된 환경을 검증하려면:

python scripts/verify_deployment.py

이 스크립트는 다음을 확인합니다:

  • API 헬스 체크
  • 전략 목록 조회
  • 데이터베이스 통계
  • 포트폴리오 API
  • Celery Flower
  • Frontend 접근성

성능 테스트

백테스트 성능 측정:

pytest tests/test_backtest_engine.py -v --durations=10

테스트 데이터 초기화

테스트 데이터베이스를 초기화하려면:

docker-compose exec postgres psql -U postgres -c "DROP DATABASE IF EXISTS pension_quant_test;"
docker-compose exec postgres psql -U postgres -c "CREATE DATABASE pension_quant_test;"

CI/CD 통합

GitHub Actions나 GitLab CI에서 사용할 수 있는 명령어:

# .github/workflows/test.yml 예시
- name: Run tests
  run: |
    pytest tests/ -m "not slow and not crawler" --cov=app --cov-report=xml

문제 해결

테스트 데이터베이스 연결 실패

# PostgreSQL이 실행 중인지 확인
docker-compose ps postgres

# 포트 확인
docker-compose port postgres 5432

Fixture not found 에러

conftest.py가 올바른 위치에 있는지 확인:

ls backend/tests/conftest.py

테스트 격리 문제

각 테스트는 독립적으로 실행되어야 합니다. 만약 테스트가 서로 영향을 미친다면:

# 트랜잭션 롤백 확인
@pytest.fixture(scope="function")
def db_session():
    # ... 트랜잭션 시작
    yield session
    # 트랜잭션 롤백
    transaction.rollback()

모범 사례

  1. 테스트는 독립적이어야 함: 각 테스트는 다른 테스트에 의존하지 않아야 합니다
  2. 명확한 테스트 이름: test_create_portfolio_with_invalid_ratio_sum처럼 무엇을 테스트하는지 명확하게
  3. 적절한 마커 사용: 느린 테스트는 @pytest.mark.slow로 표시
  4. 픽스처 재사용: 공통 테스트 데이터는 conftest.py에 픽스처로 정의
  5. 실패 메시지 포함: assert response.status_code == 200, f"Failed with {response.json()}"

다음 단계

  • 성능 벤치마크 테스트 추가
  • E2E 테스트 (Selenium/Playwright) 추가
  • 부하 테스트 (Locust) 추가
  • 보안 테스트 추가