200 lines
5.8 KiB
Markdown
200 lines
5.8 KiB
Markdown
|
|
# 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*
|