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

219 lines
6.9 KiB
Python

"""
Cross-Tabulated CSV 내보내기 개선 테스트 스크립트 (Simple 버전)
키 통합 기능 테스트
Author: Claude Assistant
Created: 2025-07-16
Version: 1.0.0
"""
import sys
import os
from datetime import datetime
import json
# 프로젝트 루트 디렉토리를 Python 경로에 추가
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from cross_tabulated_csv_exporter import CrossTabulatedCSVExporter
class MockResult:
"""테스트용 모의 결과 객체"""
def __init__(self, file_name, file_type, success=True, **kwargs):
self.file_name = file_name
self.file_type = file_type
self.success = success
# PDF 관련 속성
if 'pdf_analysis_result' in kwargs:
self.pdf_analysis_result = kwargs['pdf_analysis_result']
# DXF 관련 속성
if 'dxf_title_blocks' in kwargs:
self.dxf_title_blocks = kwargs['dxf_title_blocks']
# 오류 메시지
if 'error_message' in kwargs:
self.error_message = kwargs['error_message']
def test_key_integration():
"""키 통합 기능 테스트"""
print("=== Cross-Tabulated CSV 키 통합 기능 테스트 ===")
# 테스트용 CSV 내보내기 객체 생성
exporter = CrossTabulatedCSVExporter()
# 테스트 케이스 1: PDF 분석 결과 (키 분리 형태)
print("\n테스트 케이스 1: PDF 분석 결과 (키 분리 -> 통합)")
pdf_analysis_result = {
"사업명_value": "고속국도 제30호선 대산~당진 고속도로 건설공사",
"사업명_x": "40",
"사업명_y": "130",
"시설_공구_value": "제2공구 : 온산~사성",
"시설_공구_x": "41",
"시설_공구_y": "139",
"건설분야_value": "토목",
"건설분야_x": "199",
"건설분야_y": "1069",
"건설단계_value": "실시설계",
"건설단계_x": "263",
"건설단계_y": "1069"
}
mock_pdf_result = MockResult(
"황단면도.pdf",
"PDF",
success=True,
pdf_analysis_result=json.dumps(pdf_analysis_result)
)
# 테스트 케이스 2: DXF 분석 결과
print("테스트 케이스 2: DXF 분석 결과")
dxf_title_blocks = [
{
"block_name": "TITLE_BLOCK",
"attributes": [
{
"tag": "DWG_NO",
"text": "A-001",
"insert_x": 150,
"insert_y": 25
},
{
"tag": "TITLE",
"text": "도면제목",
"insert_x": 200,
"insert_y": 50
}
]
}
]
mock_dxf_result = MockResult(
"도면001.dxf",
"DXF",
success=True,
dxf_title_blocks=dxf_title_blocks
)
# 모든 테스트 결과를 리스트로 구성
test_results = [mock_pdf_result, mock_dxf_result]
# 출력 디렉토리 생성
output_dir = "test_results_integrated"
os.makedirs(output_dir, exist_ok=True)
# 테스트 실행: 통합된 CSV 저장
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_path = os.path.join(output_dir, f"integrated_test_results_{timestamp}.csv")
print(f"\nCSV 저장 위치: {output_path}")
success = exporter.export_cross_tabulated_csv(
test_results,
output_path,
include_coordinates=True,
coordinate_source="auto"
)
if success:
print(f"SUCCESS: 통합된 CSV 파일이 저장되었습니다.")
print(f"파일 위치: {output_path}")
# 저장된 CSV 파일 내용 미리보기
try:
with open(output_path, 'r', encoding='utf-8-sig') as f:
lines = f.readlines()
print(f"\nCSV 파일 미리보기 (상위 10행):")
for i, line in enumerate(lines[:10]):
print(f"{i+1:2d}: {line.rstrip()}")
if len(lines) > 10:
print(f" ... 총 {len(lines)}")
except Exception as e:
print(f"WARNING: 파일 읽기 오류: {e}")
else:
print("ERROR: CSV 저장에 실패했습니다.")
return success
def test_key_extraction():
"""키 추출 및 그룹화 기능 단위 테스트"""
print("\n=== 키 추출 및 그룹화 단위 테스트 ===")
exporter = CrossTabulatedCSVExporter()
# 테스트 케이스: 다양한 키 형태
test_keys = [
"사업명_value",
"사업명_x",
"사업명_y",
"시설_공구_val",
"시설_공구_x_coord",
"시설_공구_y_coord",
"건설분야_text",
"건설분야_left",
"건설분야_top",
"일반키"
]
print("\n키 분석 결과:")
for key in test_keys:
base_key = exporter._extract_base_key(key)
key_type = exporter._determine_key_type(key)
print(f" {key:20s} -> 기본키: '{base_key:12s}' 타입: {key_type}")
print("\n키 추출 및 그룹화 단위 테스트 완료")
def test_expected_output():
"""예상 출력 형태 테스트"""
print("\n=== 예상 출력 형태 확인 ===")
print("\n기대하는 CSV 출력 형태:")
print("file_name,file_type,key,value,x,y")
print("황단면도.pdf,PDF,사업명,고속국도 제30호선 대산~당진 고속도로 건설공사,40,130")
print("황단면도.pdf,PDF,시설_공구,제2공구 : 온산~사성,41,139")
print("황단면도.pdf,PDF,건설분야,토목,199,1069")
print("도면001.dxf,DXF,DWG_NO,A-001,150,25")
print("도면001.dxf,DXF,TITLE,도면제목,200,50")
print("\n개선사항:")
print("- 기존: 사업명_value, 사업명_x, 사업명_y가 별도 행으로 분리")
print("- 개선: 사업명 하나의 행에 value, x, y 정보 통합")
if __name__ == "__main__":
try:
print("Cross-Tabulated CSV 키 통합 기능 테스트 시작")
# 1. 키 추출 및 그룹화 단위 테스트
test_key_extraction()
# 2. 예상 출력 형태 확인
test_expected_output()
# 3. 실제 통합 기능 테스트
success = test_key_integration()
print(f"\n{'='*60}")
if success:
print("SUCCESS: 모든 테스트가 성공적으로 완료되었습니다!")
print("키 통합 기능이 정상적으로 동작합니다.")
else:
print("ERROR: 테스트 중 일부가 실패했습니다.")
print("코드를 점검해주세요.")
print(f"{'='*60}")
except Exception as e:
print(f"ERROR: 테스트 실행 중 오류 발생: {e}")
import traceback
traceback.print_exc()