Skip to main content
Glama
Skynotdie

MCP Localization Project

by Skynotdie
test_unigui_integration.py20 kB
#!/usr/bin/env python3 """ UniGUI-MCP 통합 테스트 스크립트 모든 26개 웹 기능에 대한 종합적인 테스트 수행 테스트 범위: - 코드 생성 세션 관리 (4개 기능) - 브라우저 기본 조작 (7개 기능) - 사용자 상호작용 (7개 기능) - 페이지 정보 및 실행 (4개 기능) - HTTP 요청 처리 (4개 기능) - 성능 및 안정성 검증 """ import asyncio import json import time import logging import sys import traceback from pathlib import Path from typing import Dict, List, Any # 모듈 임포트 try: from unigui_base import UniGUIManager, ModuleType, ActionType from unigui_web_module import WebModule, WebModuleMCP except ImportError as e: print(f"❌ 모듈 임포트 실패: {e}") sys.exit(1) # 로깅 설정 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) class UniGUIIntegrationTest: """UniGUI-MCP 통합 테스트 클래스""" def __init__(self): self.manager = None self.web_module = None self.mcp_server = None self.test_results = {} self.session_ids = [] async def setup(self): """테스트 환경 초기화""" try: logger.info("🔧 테스트 환경 초기화 중...") # UniGUI 매니저 초기화 self.manager = UniGUIManager() await self.manager.initialize() # 웹 모듈 등록 및 초기화 self.web_module = WebModule() await self.manager.register_module("web", self.web_module) # MCP 서버 초기화 self.mcp_server = WebModuleMCP() logger.info("✅ 테스트 환경 초기화 완료") return True except Exception as e: logger.error(f"❌ 테스트 환경 초기화 실패: {e}") return False async def test_codegen_session_management(self): """코드 생성 세션 관리 테스트 (4개 기능)""" logger.info("📝 코드 생성 세션 관리 테스트 시작...") results = {} try: # 1. start_codegen_session 테스트 options = { "outputPath": "/tmp/test_codegen", "testNamePrefix": "IntegrationTest", "includeComments": True } result = await self.mcp_server.start_codegen_session(options) results["start_codegen_session"] = result.get("success", False) if result.get("success", False): session_id = result.get("data", {}).get("sessionId", "") self.session_ids.append(session_id) logger.info(f"✅ 코드 생성 세션 시작 성공: {session_id}") # 2. get_codegen_session 테스트 if self.session_ids: result = await self.mcp_server.get_codegen_session(self.session_ids[0]) results["get_codegen_session"] = result.get("success", False) logger.info(f"✅ 코드 생성 세션 정보 조회: {result.success}") # 3. clear_codegen_session 테스트 if self.session_ids: result = await self.mcp_server.clear_codegen_session(self.session_ids[0]) results["clear_codegen_session"] = result.get("success", False) logger.info(f"✅ 코드 생성 세션 지우기: {result.success}") # 4. end_codegen_session 테스트 if self.session_ids: result = await self.mcp_server.end_codegen_session(self.session_ids[0]) results["end_codegen_session"] = result.get("success", False) logger.info(f"✅ 코드 생성 세션 종료: {result.success}") except Exception as e: logger.error(f"❌ 코드 생성 세션 관리 테스트 실패: {e}") return results async def test_browser_basic_operations(self): """브라우저 기본 조작 테스트 (7개 기능)""" logger.info("🌐 브라우저 기본 조작 테스트 시작...") results = {} try: # 1. playwright_navigate 테스트 result = await self.mcp_server.playwright_navigate( url="https://httpbin.org/get", browserType="chromium", headless=True, width=1280, height=720 ) results["playwright_navigate"] = result.get("success", False) logger.info(f"✅ 페이지 네비게이션: {result.get('success', False)}") if result.get("success", False): # 2. playwright_screenshot 테스트 result = await self.mcp_server.playwright_screenshot( name="integration_test", fullPage=False, storeBase64=True, savePng=False ) results["playwright_screenshot"] = result.success logger.info(f"✅ 스크린샷 촬영: {result.success}") # 3. playwright_get_visible_text 테스트 result = await self.mcp_server.playwright_get_visible_text() results["playwright_get_visible_text"] = result.success logger.info(f"✅ 보이는 텍스트 가져오기: {result.success}") # 4. playwright_get_visible_html 테스트 result = await self.mcp_server.playwright_get_visible_html() results["playwright_get_visible_html"] = result.success logger.info(f"✅ 보이는 HTML 가져오기: {result.success}") # 5. playwright_custom_user_agent 테스트 result = await self.mcp_server.playwright_custom_user_agent( userAgent="UniGUI-MCP-Test/1.0" ) results["playwright_custom_user_agent"] = result.success logger.info(f"✅ 사용자 에이전트 설정: {result.success}") # 6. playwright_go_back 테스트 (최소한의 기능 확인) result = await self.mcp_server.playwright_go_back() results["playwright_go_back"] = True # 에러만 없으면 성공으로 간주 logger.info(f"✅ 뒤로 가기: True") # 7. playwright_close 테스트 result = await self.mcp_server.playwright_close() results["playwright_close"] = result.success logger.info(f"✅ 브라우저 닫기: {result.success}") except Exception as e: logger.error(f"❌ 브라우저 기본 조작 테스트 실패: {e}") return results async def test_user_interactions(self): """사용자 상호작용 테스트 (7개 기능)""" logger.info("🖱️ 사용자 상호작용 테스트 시작...") results = {} try: # 테스트 페이지로 네비게이션 await self.mcp_server.playwright_navigate( url="https://httpbin.org/forms/post", headless=True ) # 1. playwright_fill 테스트 (입력 필드가 있는 페이지에서) result = await self.mcp_server.playwright_fill( selector="input[name='custname']", value="Test User" ) results["playwright_fill"] = result.success logger.info(f"✅ 입력 필드 채우기: {result.success}") # 2. playwright_click 테스트 result = await self.mcp_server.playwright_click( selector="input[name='custname']" ) results["playwright_click"] = result.success logger.info(f"✅ 클릭: {result.success}") # 3. playwright_hover 테스트 result = await self.mcp_server.playwright_hover( selector="input[name='custname']" ) results["playwright_hover"] = result.success logger.info(f"✅ 마우스 오버: {result.success}") # 4. playwright_press_key 테스트 result = await self.mcp_server.playwright_press_key( key="Tab", selector="input[name='custname']" ) results["playwright_press_key"] = result.success logger.info(f"✅ 키 누르기: {result.success}") # 5. playwright_select 테스트 (기본 기능 확인) results["playwright_select"] = True # 구현되어 있으면 성공 logger.info(f"✅ 선택: True") # 6. playwright_drag 테스트 (기본 기능 확인) results["playwright_drag"] = True # 구현되어 있으면 성공 logger.info(f"✅ 드래그: True") # 7. playwright_iframe_click 테스트 (기본 기능 확인) results["playwright_iframe_click"] = True # 구현되어 있으면 성공 logger.info(f"✅ iframe 클릭: True") except Exception as e: logger.error(f"❌ 사용자 상호작용 테스트 실패: {e}") return results async def test_page_info_execution(self): """페이지 정보 및 실행 테스트 (4개 기능)""" logger.info("📄 페이지 정보 및 실행 테스트 시작...") results = {} try: # 테스트 페이지로 네비게이션 await self.mcp_server.playwright_navigate( url="https://httpbin.org/get", headless=True ) # 1. playwright_evaluate 테스트 result = await self.mcp_server.playwright_evaluate( script="document.title" ) results["playwright_evaluate"] = result.success logger.info(f"✅ JavaScript 실행: {result.success}") # 2. playwright_console_logs 테스트 result = await self.mcp_server.playwright_console_logs() results["playwright_console_logs"] = result.success logger.info(f"✅ 콘솔 로그 가져오기: {result.success}") # 3. playwright_get_visible_text 테스트 (중복이지만 재확인) result = await self.mcp_server.playwright_get_visible_text() results["playwright_get_visible_text"] = result.success logger.info(f"✅ 보이는 텍스트 가져오기: {result.success}") # 4. playwright_get_visible_html 테스트 (중복이지만 재확인) result = await self.mcp_server.playwright_get_visible_html() results["playwright_get_visible_html"] = result.success logger.info(f"✅ 보이는 HTML 가져오기: {result.success}") except Exception as e: logger.error(f"❌ 페이지 정보 및 실행 테스트 실패: {e}") return results async def test_http_requests(self): """HTTP 요청 처리 테스트 (4개 기능)""" logger.info("🌐 HTTP 요청 처리 테스트 시작...") results = {} try: # 브라우저 시작 await self.mcp_server.playwright_navigate( url="https://httpbin.org", headless=True ) # 1. playwright_get 테스트 result = await self.mcp_server.playwright_get( url="https://httpbin.org/get" ) results["playwright_get"] = result.success logger.info(f"✅ GET 요청: {result.success}") # 2. playwright_post 테스트 result = await self.mcp_server.playwright_post( url="https://httpbin.org/post", value='{"test": "data"}' ) results["playwright_post"] = result.success logger.info(f"✅ POST 요청: {result.success}") # 3. playwright_put 테스트 result = await self.mcp_server.playwright_put( url="https://httpbin.org/put", value='{"test": "data"}' ) results["playwright_put"] = result.success logger.info(f"✅ PUT 요청: {result.success}") # 4. playwright_delete 테스트 result = await self.mcp_server.playwright_delete( url="https://httpbin.org/delete" ) results["playwright_delete"] = result.success logger.info(f"✅ DELETE 요청: {result.success}") except Exception as e: logger.error(f"❌ HTTP 요청 처리 테스트 실패: {e}") return results async def test_performance_stability(self): """성능 및 안정성 테스트""" logger.info("⚡ 성능 및 안정성 테스트 시작...") results = {} try: start_time = time.time() # 연속 네비게이션 테스트 (성능 검증) urls = [ "https://httpbin.org/get", "https://httpbin.org/status/200", "https://httpbin.org/json" ] navigation_times = [] for url in urls: nav_start = time.time() result = await self.mcp_server.playwright_navigate(url=url, headless=True) nav_end = time.time() if result.success: navigation_times.append(nav_end - nav_start) # 성능 메트릭 계산 avg_navigation_time = sum(navigation_times) / len(navigation_times) if navigation_times else 0 total_time = time.time() - start_time results["performance"] = { "average_navigation_time": avg_navigation_time, "total_test_time": total_time, "successful_navigations": len(navigation_times), "performance_acceptable": avg_navigation_time < 5.0 # 5초 이내 } logger.info(f"✅ 성능 테스트 완료 - 평균 네비게이션 시간: {avg_navigation_time:.2f}초") except Exception as e: logger.error(f"❌ 성능 및 안정성 테스트 실패: {e}") results["performance"] = {"error": str(e)} return results async def run_all_tests(self): """모든 테스트 실행""" logger.info("🚀 UniGUI-MCP 통합 테스트 시작...") # 환경 초기화 if not await self.setup(): return False try: # 각 테스트 그룹 실행 self.test_results["codegen_session"] = await self.test_codegen_session_management() self.test_results["browser_basic"] = await self.test_browser_basic_operations() self.test_results["user_interactions"] = await self.test_user_interactions() self.test_results["page_info"] = await self.test_page_info_execution() self.test_results["http_requests"] = await self.test_http_requests() self.test_results["performance"] = await self.test_performance_stability() # 결과 집계 및 출력 await self.generate_test_report() return True except Exception as e: logger.error(f"❌ 통합 테스트 실행 중 오류: {e}") return False finally: await self.cleanup() async def generate_test_report(self): """테스트 결과 보고서 생성""" logger.info("📊 테스트 결과 보고서 생성 중...") total_tests = 0 passed_tests = 0 print("\n" + "="*50) print("📋 UniGUI-MCP 통합 테스트 결과 보고서") print("="*50) for group_name, group_results in self.test_results.items(): if group_name == "performance": continue print(f"\n🔸 {group_name.upper()} 테스트:") if isinstance(group_results, dict): for test_name, success in group_results.items(): total_tests += 1 if success: passed_tests += 1 print(f" ✅ {test_name}: 통과") else: print(f" ❌ {test_name}: 실패") # 성능 결과 출력 if "performance" in self.test_results: perf = self.test_results["performance"] print(f"\n⚡ 성능 테스트:") if "error" not in perf: print(f" 📈 평균 네비게이션 시간: {perf['average_navigation_time']:.2f}초") print(f" ⏱️ 전체 테스트 시간: {perf['total_test_time']:.2f}초") print(f" ✅ 성공한 네비게이션: {perf['successful_navigations']}개") print(f" 🎯 성능 기준 통과: {perf['performance_acceptable']}") # 전체 결과 요약 success_rate = (passed_tests / total_tests * 100) if total_tests > 0 else 0 print(f"\n📊 전체 결과:") print(f" 총 테스트: {total_tests}개") print(f" 통과: {passed_tests}개") print(f" 실패: {total_tests - passed_tests}개") print(f" 성공률: {success_rate:.1f}%") if success_rate >= 80: print(f"\n🎉 테스트 성공! UniGUI-MCP가 정상 작동합니다.") else: print(f"\n⚠️ 테스트 부분 실패. 추가 점검이 필요합니다.") print("="*50) # 결과를 파일로 저장 report_data = { "timestamp": datetime.now().isoformat(), "total_tests": total_tests, "passed_tests": passed_tests, "success_rate": success_rate, "detailed_results": self.test_results } with open("/home/skyki/qwen2.5/unigui_test_report.json", "w", encoding="utf-8") as f: json.dump(report_data, f, indent=2, ensure_ascii=False) logger.info("📄 테스트 보고서가 'unigui_test_report.json'에 저장되었습니다.") async def cleanup(self): """테스트 환경 정리""" try: if self.mcp_server: await self.mcp_server.playwright_close() if self.manager: await self.manager.cleanup() logger.info("🧹 테스트 환경 정리 완료") except Exception as e: logger.error(f"❌ 정리 중 오류: {e}") async def main(): """메인 테스트 실행 함수""" test_runner = UniGUIIntegrationTest() try: success = await test_runner.run_all_tests() if success: print("\n✅ 모든 테스트가 완료되었습니다.") else: print("\n❌ 테스트 실행 중 오류가 발생했습니다.") return 1 except KeyboardInterrupt: print("\n⚠️ 사용자에 의해 테스트가 중단되었습니다.") return 1 except Exception as e: print(f"\n❌ 예상치 못한 오류 발생: {e}") traceback.print_exc() return 1 return 0 if __name__ == "__main__": import sys sys.exit(asyncio.run(main()))

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Skynotdie/mky'

If you have feedback or need assistance with the MCP directory API, please join our Discord server