251 lines
5.8 KiB
Markdown
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) 추가
|
|
- [ ] 보안 테스트 추가
|