feat: 각 모듈 개별 테스트 실행 가능하도록 수정 및 docker compose 최신 버전 형식 적용
This commit is contained in:
@ -424,3 +424,35 @@ class AirQualityCollector:
|
||||
|
||||
logger.info(f"대기질 데이터 수집 완료: 총 {total_saved}건 저장")
|
||||
return total_saved
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
"""
|
||||
대기질 데이터 수집 서비스 모듈 테스트
|
||||
|
||||
사용법:
|
||||
python services/analytics/air_quality.py
|
||||
"""
|
||||
logger.info("=== 대기질 데이터 수집 서비스 모듈 테스트 ===")
|
||||
|
||||
try:
|
||||
config = get_config()
|
||||
service_key = config.data_api['service_key'] or "TEST_KEY"
|
||||
|
||||
logger.info(f"설정 로드 완료")
|
||||
logger.info(f"- 서비스 키: {service_key[:10] if service_key else 'NOT SET'}***")
|
||||
|
||||
logger.info("\n제공 기능:")
|
||||
logger.info("- get_air_quality: 대기질 데이터 조회")
|
||||
logger.info("- AirQualityCollector: 자동 데이터 수집 및 DB 저장")
|
||||
|
||||
logger.info("\n측정 항목:")
|
||||
logger.info("- PM2.5: 초미세먼지")
|
||||
logger.info("- PM10: 미세먼지")
|
||||
logger.info("- SO2, CO, NO2, O3: 기타 오염물질")
|
||||
|
||||
logger.info("\n✓ 대기질 데이터 수집 서비스 모듈 테스트 완료")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"대기질 모듈 테스트 실패: {e}")
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
@ -399,3 +399,36 @@ class GA4DataCollector:
|
||||
|
||||
logger.info(f"GA4 데이터 수집 완료: 총 {total_saved}건 저장")
|
||||
return total_saved
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
"""
|
||||
Google Analytics 4 데이터 수집 서비스 모듈 테스트
|
||||
|
||||
사용법:
|
||||
python services/analytics/ga4.py
|
||||
"""
|
||||
logger.info("=== Google Analytics 4 데이터 수집 서비스 모듈 테스트 ===")
|
||||
|
||||
try:
|
||||
config = get_config()
|
||||
|
||||
logger.info(f"설정 로드 완료")
|
||||
|
||||
logger.info("\n제공 기능:")
|
||||
logger.info("- GA4Client: GA4 API 클라이언트")
|
||||
logger.info("- GA4DataCollector: 자동 데이터 수집 및 DB 저장")
|
||||
|
||||
logger.info("\n수집 가능 메트릭:")
|
||||
logger.info("- 일별 세션 수")
|
||||
logger.info("- 일별 사용자 수")
|
||||
logger.info("- 이벤트 수")
|
||||
logger.info("- 이탈률")
|
||||
|
||||
logger.info("\n병렬 처리를 통한 성능 최적화 지원")
|
||||
|
||||
logger.info("\n✓ GA4 데이터 수집 서비스 모듈 테스트 완료")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"GA4 모듈 테스트 실패: {e}")
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
@ -298,3 +298,41 @@ class VisitorForecaster:
|
||||
}
|
||||
|
||||
return analysis
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
"""
|
||||
방문객 예측 서비스 모듈 테스트
|
||||
|
||||
사용법:
|
||||
python services/analytics/visitor_forecast.py
|
||||
"""
|
||||
logger.info("=== 방문객 예측 서비스 모듈 테스트 ===")
|
||||
|
||||
try:
|
||||
config = get_config()
|
||||
|
||||
logger.info(f"설정 로드 완료")
|
||||
|
||||
# 예측기 초기화
|
||||
forecaster = VisitorForecaster(config)
|
||||
logger.info("\nVisitorForecaster 초기화 완료")
|
||||
|
||||
logger.info("\n제공 기능:")
|
||||
logger.info("- predict_daily: 일별 방문객 수 예측")
|
||||
logger.info("- predict_weekly: 주별 방문객 수 예측")
|
||||
logger.info("- analyze_weather_impact: 날씨 영향도 분석")
|
||||
logger.info("- calculate_holiday_impact: 휴일 영향도 계산")
|
||||
|
||||
logger.info("\n예측 요인:")
|
||||
logger.info("- 날씨 (기온, 강수량, 습도)")
|
||||
logger.info("- 휴일 여부")
|
||||
logger.info("- 주말 여부")
|
||||
logger.info("- 과거 방문 패턴")
|
||||
|
||||
logger.info("\n✓ 방문객 예측 서비스 모듈 테스트 완료")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"방문객 예측 모듈 테스트 실패: {e}")
|
||||
import traceback
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
@ -333,3 +333,39 @@ def send_mattermost_notification(
|
||||
"""
|
||||
notifier = MattermostNotifier.from_config()
|
||||
return notifier.send_message(message, channel_id, use_webhook)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
"""
|
||||
Mattermost 알림 서비스 모듈 테스트
|
||||
|
||||
사용법:
|
||||
python services/notification/mattermost.py
|
||||
"""
|
||||
logger.info("=== Mattermost 알림 서비스 모듈 테스트 ===")
|
||||
|
||||
try:
|
||||
config = get_config()
|
||||
|
||||
logger.info(f"설정 로드 완료")
|
||||
|
||||
# 알림기 초기화
|
||||
notifier = MattermostNotifier.from_config()
|
||||
logger.info("\nMattermostNotifier 초기화 완료")
|
||||
|
||||
logger.info("\n제공 기능:")
|
||||
logger.info("- send_message: 기본 메시지 발송")
|
||||
logger.info("- send_alert: 알림 메시지 발송")
|
||||
logger.info("- send_weather: 날씨 정보 발송")
|
||||
logger.info("- send_daily_report: 일일 보고서 발송")
|
||||
|
||||
logger.info("\n지원 방식:")
|
||||
logger.info("- 웹훅 방식 (Incoming Webhook)")
|
||||
logger.info("- Bot API 방식")
|
||||
|
||||
logger.info("\n✓ Mattermost 알림 서비스 모듈 테스트 완료")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Mattermost 모듈 테스트 실패: {e}")
|
||||
import traceback
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
@ -342,3 +342,41 @@ class NotionWebhookHandler:
|
||||
url = page_data.get('url', 'URL 없음')
|
||||
|
||||
return f"📌 노션 페이지 업데이트됨\n**제목**: {title}\n🔗 [바로가기]({url})"
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
"""
|
||||
Notion 웹훅 처리 서비스 모듈 테스트
|
||||
|
||||
사용법:
|
||||
python services/notification/notion.py
|
||||
"""
|
||||
logger.info("=== Notion 웹훅 처리 서비스 모듈 테스트 ===")
|
||||
|
||||
try:
|
||||
config = get_config()
|
||||
|
||||
logger.info(f"설정 로드 완료")
|
||||
|
||||
# 핸들러 초기화
|
||||
api_secret = config.notion['api_secret'] or "TEST_KEY"
|
||||
handler = NotionWebhookHandler(api_secret)
|
||||
logger.info("\nNotionWebhookHandler 초기화 완료")
|
||||
|
||||
logger.info("\n제공 기능:")
|
||||
logger.info("- handle_event: 웹훅 이벤트 처리")
|
||||
logger.info("- verify_signature: 요청 서명 검증")
|
||||
logger.info("- generate_message: 알림 메시지 생성")
|
||||
|
||||
logger.info("\n지원 이벤트:")
|
||||
logger.info("- 페이지 생성 (page.created)")
|
||||
logger.info("- 페이지 수정 (page.updated)")
|
||||
logger.info("- 페이지 삭제 (page.deleted)")
|
||||
logger.info("- 데이터베이스 항목 생성 (object.created)")
|
||||
|
||||
logger.info("\n✓ Notion 웹훅 처리 서비스 모듈 테스트 완료")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Notion 모듈 테스트 실패: {e}")
|
||||
import traceback
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
@ -381,3 +381,31 @@ class ASOSDataCollector:
|
||||
|
||||
logger.info(f"총 {total_saved}건 저장 완료")
|
||||
return total_saved
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
"""
|
||||
ASOS 모듈 테스트
|
||||
|
||||
사용법:
|
||||
python services/weather/asos.py
|
||||
"""
|
||||
logger.info("=== ASOS 모듈 테스트 ===")
|
||||
|
||||
try:
|
||||
config = get_config()
|
||||
service_key = config.data_api['service_key'] or "TEST_KEY"
|
||||
|
||||
logger.info(f"설정 로드 완료")
|
||||
logger.info(f"- 서비스 키: {service_key[:10] if service_key else 'NOT SET'}***")
|
||||
|
||||
# 간단한 데이터 조회 테스트
|
||||
logger.info("\n기본 설정 확인:")
|
||||
logger.info(f"- ASOS API URL: {ASOS_API_URL}")
|
||||
logger.info(f"- 시간별 컬럼 수: {len(HRMT_KEYS)}")
|
||||
|
||||
logger.info("\n✓ ASOS 모듈 테스트 완료")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"ASOS 모듈 테스트 실패: {e}")
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
@ -30,6 +30,7 @@ import requests
|
||||
|
||||
from core.logging_utils import get_logger
|
||||
from core.http_client import create_retry_session
|
||||
from core.config import get_config
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
@ -528,3 +529,33 @@ def get_weekly_precip(service_key: str) -> Dict[str, float]:
|
||||
result[dt] = round(prob * 0.1, 1)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
"""
|
||||
기상청 예보 모듈 테스트
|
||||
|
||||
사용법:
|
||||
python services/weather/forecast.py
|
||||
"""
|
||||
logger = get_logger(__name__)
|
||||
logger.info("=== 기상청 예보 모듈 테스트 ===")
|
||||
|
||||
try:
|
||||
config = get_config()
|
||||
service_key = config.data_api['service_key'] or "TEST_KEY"
|
||||
|
||||
logger.info(f"설정 로드 완료")
|
||||
logger.info(f"- 서비스 키: {service_key[:10] if service_key else 'NOT SET'}***")
|
||||
|
||||
logger.info("\n모듈 기능 확인:")
|
||||
logger.info("- get_ultra_forecast: 초단기 예보 조회")
|
||||
logger.info("- get_vilage_forecast: 동네 예보 조회")
|
||||
logger.info("- get_midterm_forecast: 중기 예보 조회")
|
||||
|
||||
logger.info("\n✓ 기상청 예보 모듈 테스트 완료")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"기상청 예보 모듈 테스트 실패: {e}")
|
||||
import traceback
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
@ -26,7 +26,13 @@ from typing import Dict, List, Optional, Tuple, Any
|
||||
|
||||
from core.logging_utils import get_logger
|
||||
from core.config import get_config
|
||||
from .forecast import parse_precip, get_ultra_forecast, get_vilage_forecast
|
||||
|
||||
try:
|
||||
# 상대 import (패키지 내에서)
|
||||
from .forecast import parse_precip, get_ultra_forecast, get_vilage_forecast
|
||||
except ImportError:
|
||||
# 절대 import (직접 실행 시)
|
||||
from services.weather.forecast import parse_precip, get_ultra_forecast, get_vilage_forecast
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
@ -341,3 +347,37 @@ class PrecipitationService:
|
||||
'hourly': time_precip_list,
|
||||
'total': total
|
||||
}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
"""
|
||||
강수량 데이터 서비스 모듈 테스트
|
||||
|
||||
사용법:
|
||||
python services/weather/precipitation.py
|
||||
"""
|
||||
logger = get_logger(__name__)
|
||||
logger.info("=== 강수량 데이터 서비스 모듈 테스트 ===")
|
||||
|
||||
try:
|
||||
config = get_config()
|
||||
service_key = config.data_api['service_key'] or "TEST_KEY"
|
||||
|
||||
logger.info(f"설정 로드 완료")
|
||||
logger.info(f"- 서비스 키: {service_key[:10] if service_key else 'NOT SET'}***")
|
||||
|
||||
# 서비스 초기화 테스트
|
||||
service = PrecipitationService(service_key)
|
||||
logger.info("\nPrecipitationService 초기화 완료")
|
||||
|
||||
logger.info("\n제공 기능:")
|
||||
logger.info("- get_daily_summary: 일일 강수량 요약")
|
||||
logger.info("- generate_html_table: HTML 테이블 생성")
|
||||
logger.info("- get_output_format: 다양한 형식 제공 (JSON, HTML, 텍스트)")
|
||||
|
||||
logger.info("\n✓ 강수량 데이터 서비스 모듈 테스트 완료")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"강수량 모듈 테스트 실패: {e}")
|
||||
import traceback
|
||||
logger.error(traceback.format_exc())
|
||||
|
||||
Reference in New Issue
Block a user