Files
fletimageanalysis/back_src/test_project.py
2025-07-16 17:33:20 +09:00

315 lines
9.4 KiB
Python

"""
테스트 스크립트
프로젝트의 핵심 기능들을 테스트합니다.
"""
import sys
import os
import logging
from pathlib import Path
# 프로젝트 루트를 Python 경로에 추가
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))
# 로깅 설정
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def test_config():
"""설정 모듈 테스트"""
print("=" * 50)
print("설정 모듈 테스트")
print("=" * 50)
try:
from config import Config
print(f"✅ 앱 제목: {Config.APP_TITLE}")
print(f"✅ 앱 버전: {Config.APP_VERSION}")
print(f"✅ 업로드 폴더: {Config.UPLOAD_FOLDER}")
print(f"✅ 최대 파일 크기: {Config.MAX_FILE_SIZE_MB}MB")
print(f"✅ 허용 확장자: {Config.ALLOWED_EXTENSIONS}")
print(f"✅ Gemini 모델: {Config.GEMINI_MODEL}")
# 설정 검증
errors = Config.validate_config()
if errors:
print("❌ 설정 오류:")
for error in errors:
print(f" - {error}")
return False
else:
print("✅ 모든 설정이 올바릅니다.")
return True
except Exception as e:
print(f"❌ 설정 모듈 테스트 실패: {e}")
return False
def test_pdf_processor():
"""PDF 처리 모듈 테스트"""
print("\\n" + "=" * 50)
print("PDF 처리 모듈 테스트")
print("=" * 50)
try:
from pdf_processor import PDFProcessor
processor = PDFProcessor()
print("✅ PDF 처리기 초기화 성공")
# 테스트용 임시 PDF 생성 (실제로는 존재하지 않음)
test_pdf = "test_sample.pdf"
# 존재하지 않는 파일 테스트
result = processor.validate_pdf_file(test_pdf)
if not result:
print("✅ 존재하지 않는 파일 검증: 정상 동작")
else:
print("❌ 존재하지 않는 파일 검증: 비정상 동작")
# 확장자 검증 테스트
if not processor.validate_pdf_file("test.txt"):
print("✅ 잘못된 확장자 검증: 정상 동작")
else:
print("❌ 잘못된 확장자 검증: 비정상 동작")
# base64 변환 테스트 (PIL Image 사용)
try:
from PIL import Image
import io
# 작은 테스트 이미지 생성
test_image = Image.new('RGB', (100, 100), color='red')
base64_result = processor.image_to_base64(test_image)
if base64_result and len(base64_result) > 0:
print("✅ Base64 변환: 정상 동작")
else:
print("❌ Base64 변환: 실패")
except Exception as e:
print(f"❌ Base64 변환 테스트 실패: {e}")
print("✅ PDF 처리 모듈 기본 테스트 완료")
return True
except Exception as e:
print(f"❌ PDF 처리 모듈 테스트 실패: {e}")
return False
def test_gemini_analyzer():
"""Gemini 분석기 테스트"""
print("\\n" + "=" * 50)
print("Gemini 분석기 테스트")
print("=" * 50)
try:
from config import Config
# API 키 확인
if not Config.GEMINI_API_KEY:
print("❌ Gemini API 키가 설정되지 않았습니다.")
print(" .env 파일에 GEMINI_API_KEY를 설정하세요.")
return False
from gemini_analyzer import GeminiAnalyzer
analyzer = GeminiAnalyzer()
print("✅ Gemini 분석기 초기화 성공")
# API 연결 테스트
if analyzer.validate_api_connection():
print("✅ Gemini API 연결 테스트 성공")
else:
print("❌ Gemini API 연결 테스트 실패")
return False
# 모델 정보 확인
model_info = analyzer.get_model_info()
print(f"✅ 사용 모델: {model_info['model']}")
print(f"✅ API 키 길이: {model_info['api_key_length']}")
return True
except Exception as e:
print(f"❌ Gemini 분석기 테스트 실패: {e}")
return False
def test_utils():
"""유틸리티 모듈 테스트"""
print("\\n" + "=" * 50)
print("유틸리티 모듈 테스트")
print("=" * 50)
try:
from utils import FileUtils, DateTimeUtils, TextUtils, ValidationUtils
# 파일 유틸리티 테스트
safe_name = FileUtils.get_safe_filename("test<file>name?.pdf")
print(f"✅ 안전한 파일명 생성: '{safe_name}'")
# 날짜/시간 유틸리티 테스트
timestamp = DateTimeUtils.get_timestamp()
filename_timestamp = DateTimeUtils.get_filename_timestamp()
print(f"✅ 타임스탬프: {timestamp}")
print(f"✅ 파일명 타임스탬프: {filename_timestamp}")
# 텍스트 유틸리티 테스트
long_text = "이것은 긴 텍스트입니다. " * 10
truncated = TextUtils.truncate_text(long_text, 50)
print(f"✅ 텍스트 축약: '{truncated}'")
# 검증 유틸리티 테스트
is_valid_pdf = ValidationUtils.is_valid_pdf_extension("test.pdf")
is_invalid_pdf = ValidationUtils.is_valid_pdf_extension("test.txt")
print(f"✅ PDF 확장자 검증: {is_valid_pdf} / {not is_invalid_pdf}")
return True
except Exception as e:
print(f"❌ 유틸리티 모듈 테스트 실패: {e}")
return False
def test_file_structure():
"""파일 구조 테스트"""
print("\\n" + "=" * 50)
print("파일 구조 테스트")
print("=" * 50)
required_files = [
"main.py",
"config.py",
"pdf_processor.py",
"gemini_analyzer.py",
"ui_components.py",
"utils.py",
"requirements.txt",
".env.example",
"README.md",
"project_plan.md"
]
required_dirs = [
"uploads",
"assets",
"docs"
]
missing_files = []
missing_dirs = []
# 파일 확인
for file in required_files:
if not (project_root / file).exists():
missing_files.append(file)
else:
print(f"{file}")
# 디렉토리 확인
for dir_name in required_dirs:
if not (project_root / dir_name).exists():
missing_dirs.append(dir_name)
else:
print(f"{dir_name}/")
if missing_files:
print("❌ 누락된 파일:")
for file in missing_files:
print(f" - {file}")
if missing_dirs:
print("❌ 누락된 디렉토리:")
for dir_name in missing_dirs:
print(f" - {dir_name}/")
return len(missing_files) == 0 and len(missing_dirs) == 0
def test_dependencies():
"""의존성 테스트"""
print("\\n" + "=" * 50)
print("의존성 테스트")
print("=" * 50)
required_packages = [
"flet",
"google.genai",
"fitz", # PyMuPDF
"PIL", # Pillow
"dotenv" # python-dotenv
]
missing_packages = []
for package in required_packages:
try:
if package == "fitz":
import fitz
elif package == "PIL":
import PIL
elif package == "dotenv":
import dotenv
elif package == "google.genai":
import google.genai
else:
__import__(package)
print(f"{package}")
except ImportError:
missing_packages.append(package)
print(f"{package} - 설치되지 않음")
if missing_packages:
print("\\n설치가 필요한 패키지:")
print("pip install " + " ".join(missing_packages))
return False
else:
print("\\n✅ 모든 의존성이 설치되어 있습니다.")
return True
def main():
"""메인 테스트 함수"""
print("PDF 도면 분석기 - 테스트 스크립트")
print("=" * 80)
tests = [
("파일 구조", test_file_structure),
("의존성", test_dependencies),
("설정 모듈", test_config),
("PDF 처리 모듈", test_pdf_processor),
("유틸리티 모듈", test_utils),
("Gemini 분석기", test_gemini_analyzer),
]
passed = 0
total = len(tests)
for test_name, test_func in tests:
try:
if test_func():
passed += 1
print(f"\\n✅ {test_name} 테스트 통과")
else:
print(f"\\n❌ {test_name} 테스트 실패")
except Exception as e:
print(f"\\n❌ {test_name} 테스트 오류: {e}")
print("\\n" + "=" * 80)
print(f"테스트 결과: {passed}/{total} 통과")
if passed == total:
print("🎉 모든 테스트가 통과했습니다!")
print("애플리케이션 실행 준비가 완료되었습니다.")
print("\\n실행 방법:")
print("python main.py")
else:
print("⚠️ 일부 테스트가 실패했습니다.")
print("실패한 테스트를 확인하고 문제를 해결하세요.")
print("=" * 80)
if __name__ == "__main__":
main()