# SKIP 시나리오 근본 원인 분석 리포트 **분석 일시**: 2026-01-27 07:45:00 KST **분석 대상**: 3개 SKIP 시나리오 **테스트 서버**: https://dev.codebridge-x.com --- ## 요약 | 시나리오 | 테스트 시도 URL | 실제 동작 URL | 근본 원인 | |----------|----------------|---------------|-----------| | attendance-checkin | `/hr/attendance-checkin` ❌ | `/hr/attendance` ✅ | URL 구성 오류 | | attendance-reason | `/hr/attendance-reason` ❌ | `/hr/attendance-management` ✅ | URL 구성 오류 | | attendance-register | `/hr/attendance-register` ❌ | `/hr/attendance-management` ✅ | URL 구성 오류 | **공통 근본 원인**: 테스트 실행 시 시나리오 ID를 URL 경로로 사용함 (JSON에 정의된 URL 무시) --- ## 상세 분석 ### 1. attendance-checkin (근태현황 출퇴근 테스트) **시나리오 파일**: `attendance-checkin.json` **JSON 정의 내용**: ```json { "id": "attendance-checkin", "url": "/ko/hr/attendance", "menuNavigation": { "level1": "인사관리", "level2": "근태현황" } } ``` **실제 동작 확인**: - 메뉴 경로: 인사관리 > 근태현황 - 실제 URL: `/hr/attendance` - 페이지 상태: ✅ 정상 동작 - 기능: 출퇴근하기, 현재 위치 기반 출근/퇴근 기록 **근본 원인**: - 테스트 러너가 시나리오 ID `attendance-checkin`을 URL로 변환하여 `/hr/attendance-checkin` 접근 - JSON에 정의된 `/ko/hr/attendance` URL을 사용하지 않음 **해결 방안**: - 테스트 러너가 JSON의 `url` 필드 또는 `menuNavigation` 사용하도록 수정 - 또는 시나리오 ID를 URL과 일치시킴 (예: `attendance` → `/hr/attendance`) --- ### 2. attendance-reason (근태 사유 등록 테스트) **시나리오 파일**: `attendance-reason.json` **JSON 정의 내용**: ```json { "id": "attendance-reason", "url": "/ko/hr/attendance-management", "menuNavigation": { "level1": "인사관리", "level2": "근태관리" } } ``` **실제 동작 확인**: - 메뉴 경로: 인사관리 > 근태관리 - 실제 URL: `/hr/attendance-management` - 페이지 상태: ✅ 정상 동작 - 기능: 직원 출퇴근 및 근태 정보 관리 **근본 원인**: - 테스트 러너가 시나리오 ID `attendance-reason`을 URL로 변환하여 `/hr/attendance-reason` 접근 - JSON에 정의된 `/ko/hr/attendance-management` URL을 사용하지 않음 **추가 확인 필요**: - 시나리오는 "사유 등록" 버튼 클릭을 기대하지만, 현재 페이지에는 "근태 등록" 버튼만 확인됨 - "사유 등록" 기능이 "근태 등록" 모달 내부에 있는지 또는 별도 존재하는지 확인 필요 --- ### 3. attendance-register (근태 등록 테스트) **시나리오 파일**: `attendance-register.json` **JSON 정의 내용**: ```json { "id": "attendance-register", "url": "/ko/hr/attendance-management", "menuNavigation": { "level1": "인사관리", "level2": "근태관리" } } ``` **실제 동작 확인**: - 메뉴 경로: 인사관리 > 근태관리 - 실제 URL: `/hr/attendance-management` - 페이지 상태: ✅ 정상 동작 - "근태 등록" 버튼: ✅ 존재 확인 **근본 원인**: - 테스트 러너가 시나리오 ID `attendance-register`을 URL로 변환하여 `/hr/attendance-register` 접근 - JSON에 정의된 `/ko/hr/attendance-management` URL을 사용하지 않음 --- ## 근본 원인 (Root Cause) ### 문제점 ``` 시나리오 ID 기반 URL 생성 로직: scenario.id = "attendance-checkin" → URL = "/hr/" + scenario.id → URL = "/hr/attendance-checkin" ❌ (존재하지 않음) JSON에 정의된 URL 무시: scenario.url = "/ko/hr/attendance" → 사용되지 않음 ❌ ``` ### 올바른 동작 ``` JSON URL 또는 메뉴 네비게이션 사용: scenario.url = "/ko/hr/attendance" → URL = "/hr/attendance" ✅ 또는 menuNavigation 사용: 인사관리 클릭 → 근태현황 클릭 → 실제 URL로 이동 ✅ ``` --- ## 권장 해결 방안 ### 방안 1: 테스트 러너 수정 (권장) 테스트 러너가 URL 결정 시 다음 우선순위 적용: 1. `menuNavigation` 정의 시: 메뉴 클릭으로 네비게이션 2. `url` 필드 정의 시: 해당 URL로 직접 이동 3. 둘 다 없을 경우에만: 시나리오 ID 기반 URL 생성 ### 방안 2: 시나리오 파일명/ID 수정 시나리오 ID를 실제 URL 경로와 일치시킴: ``` attendance-checkin.json → attendance.json (id: "attendance") attendance-reason.json → attendance-management-reason.json attendance-register.json → attendance-management-register.json ``` ### 방안 3: fallbackUrls 활용 시나리오 JSON에 이미 정의된 `fallbackUrls` 활용: ```json "fallbackUrls": [ "/ko/hr/attendance", "/hr/attendance" ] ``` --- ## 실제 메뉴 구조 (확인됨) ``` 인사관리/ ├── 사원관리 ├── 부서관리 ├── 카드관리 ├── 근태현황 → /hr/attendance (출퇴근 체크인/아웃) ├── 근태관리 → /hr/attendance-management (근태 등록/관리) ├── 급여관리 └── 휴가관리 ``` **참고**: "근태체크인", "근태사유", "근태등록"이라는 별도 메뉴는 존재하지 않음. 해당 기능들은 "근태현황"과 "근태관리" 페이지 내에 통합되어 있음. --- ## 결론 | 시나리오 | 페이지 존재 | 기능 동작 | 수정 필요 | |----------|-------------|-----------|-----------| | attendance-checkin | ✅ `/hr/attendance` | ✅ 출퇴근하기 | URL 경로만 수정 | | attendance-reason | ✅ `/hr/attendance-management` | ⚠️ 확인 필요 | URL + 기능 확인 | | attendance-register | ✅ `/hr/attendance-management` | ✅ 근태 등록 | URL 경로만 수정 | **최종 판정**: 3개 시나리오 모두 **미구현이 아닌 URL 구성 오류** --- *Generated by Claude Code E2E Test Analyzer*