penti/docs/TESTING_GUIDE.md

251 lines
5.8 KiB
Markdown

# Testing Guide
퇴직연금 리밸런싱 + Quant 플랫폼 테스트 가이드
## 테스트 환경 설정
### 1. 테스트 데이터베이스 생성
```bash
# PostgreSQL에 테스트 데이터베이스 생성
docker-compose exec postgres psql -U postgres -c "CREATE DATABASE pension_quant_test;"
```
### 2. 의존성 설치
```bash
cd backend
pip install -r requirements-dev.txt
```
## 테스트 실행
### 단위 테스트 (Unit Tests)
빠르게 실행되는 단위 테스트만 실행:
```bash
pytest tests/ -m "unit" -v
```
### 통합 테스트 (Integration Tests)
데이터베이스와 API를 사용하는 통합 테스트:
```bash
pytest tests/ -m "integration" -v
```
### 전체 테스트 (느린 테스트 제외)
```bash
pytest tests/ -m "not slow and not crawler" -v
```
### 커버리지 포함 전체 테스트
```bash
pytest tests/ --cov=app --cov-report=html --cov-report=term-missing
```
커버리지 리포트는 `htmlcov/index.html`에서 확인 가능합니다.
### 특정 테스트 파일만 실행
```bash
pytest tests/test_api_backtest.py -v
pytest tests/test_backtest_engine.py -v
pytest tests/test_strategies.py -v
```
### 특정 테스트 클래스/함수만 실행
```bash
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`
새로운 데이터베이스 세션을 생성합니다. 각 테스트 후 롤백됩니다.
```python
def test_something(db_session):
# db_session 사용
pass
```
### `client`
FastAPI 테스트 클라이언트를 제공합니다.
```python
def test_api_endpoint(client):
response = client.get("/api/v1/endpoint")
assert response.status_code == 200
```
### `sample_assets`
테스트용 샘플 자산 데이터를 생성합니다.
```python
def test_with_assets(sample_assets):
# sample_assets는 3개의 Asset 객체 리스트
pass
```
### `sample_price_data`
테스트용 가격 데이터를 생성합니다 (30일치).
```python
def test_with_prices(sample_price_data):
# sample_price_data는 PriceData 객체 리스트
pass
```
### `sample_portfolio`
테스트용 포트폴리오를 생성합니다.
```python
def test_portfolio(sample_portfolio):
# sample_portfolio는 Portfolio 객체
pass
```
## 통합 테스트 스크립트
전체 시스템 통합 테스트:
```bash
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 접근성 확인
## 배포 검증
배포된 환경을 검증하려면:
```bash
python scripts/verify_deployment.py
```
이 스크립트는 다음을 확인합니다:
- API 헬스 체크
- 전략 목록 조회
- 데이터베이스 통계
- 포트폴리오 API
- Celery Flower
- Frontend 접근성
## 성능 테스트
백테스트 성능 측정:
```bash
pytest tests/test_backtest_engine.py -v --durations=10
```
## 테스트 데이터 초기화
테스트 데이터베이스를 초기화하려면:
```bash
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에서 사용할 수 있는 명령어:
```yaml
# .github/workflows/test.yml 예시
- name: Run tests
run: |
pytest tests/ -m "not slow and not crawler" --cov=app --cov-report=xml
```
## 문제 해결
### 테스트 데이터베이스 연결 실패
```bash
# PostgreSQL이 실행 중인지 확인
docker-compose ps postgres
# 포트 확인
docker-compose port postgres 5432
```
### Fixture not found 에러
conftest.py가 올바른 위치에 있는지 확인:
```bash
ls backend/tests/conftest.py
```
### 테스트 격리 문제
각 테스트는 독립적으로 실행되어야 합니다. 만약 테스트가 서로 영향을 미친다면:
```python
# 트랜잭션 롤백 확인
@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) 추가
- [ ] 보안 테스트 추가