Files
sam-hotfix/e2e/SCENARIO_QUALITY_ANALYSIS_2026-02-03.md
김보곤 6d320b396d test: E2E 전체 테스트 66/75 (88.0%) 통과 - 시나리오 리라이트 후 재실행
- 실패 시나리오 11개 리라이트 + 중복 2개 삭제 (fill_form → READ-only 패턴)
- 이전 78.7% → 88.0% 개선 (+9.3%p)
- 실패 9건 중 7건은 사이드바 렌더링 인프라 이슈
- 실질 기능 성공률 97.1% (66/68)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 22:01:54 +09:00

366 lines
11 KiB
Markdown

# E2E 시나리오 품질 분석 및 개선 계획
**분석일**: 2026-02-03
**분석 대상**: 96개 시나리오 (e2e/scenarios/*.json)
---
## 1. 시나리오 품질 등급 분류
### A등급 (우수) - 7개
포괄적 CRUD 검증, API 모니터링, 에러 처리 완비
| 시나리오 | 스텝 수 | 특징 |
|----------|--------|------|
| login.json | 23 | 로그인 실패/성공, 세션 유지, 로그아웃, 재로그인 |
| free-board.json | 77 | 게시글+댓글 CRUD, 검색/필터/정렬, 페이지네이션 |
| vendor-management.json | 34 | 상세 검증, 수정 후 복원, API 호출 확인 |
| approval-box.json | 11+ | PDF 다운로드, 실제 승인/반려 동작 |
| employee-register.json | 15 | CRUD 전체, 기간 검색 검증 |
| crud-delete-vendor.json | 15 | CRUD 전체 흐름, 롤백 계획 포함 |
| crud-delete-freeboard.json | - | CRUD 전체 흐름 |
### B등급 (보통) - 약 30개
UI 요소 확인 + 일부 기능 테스트
| 예시 시나리오 | 스텝 수 | 부족한 점 |
|-------------|--------|----------|
| attendance-management.json | ~10 | 등록/수정 동작 미검증 |
| vacation-management.json | ~8 | 조회만 검증 |
| deposit-management.json | ~6 | 상세/수정 미검증 |
### C등급 (미흡) - 약 55개
메뉴 접근 + 목업 감지만 테스트
| 예시 시나리오 | 스텝 수 | 문제점 |
|-------------|--------|--------|
| accounting-deposit.json | 4 | 등록 버튼 존재 확인만 |
| settings-permission.json | 3 | 권한 설정 동작 미테스트 |
| production-item.json | 3 | 페이지 로드만 확인 |
| purchase-client.json | 3 | 개발 중 페이지 |
| accounting-*.json (대부분) | 3-4 | 기본 UI만 확인 |
| settings-*.json (대부분) | 3-4 | 설정 변경 미테스트 |
| hr-*.json (일부) | 4-6 | CRUD 미완성 |
---
## 2. 주요 문제점 분석
### 문제 1: 검증 수준 불균형 (CRITICAL)
**현황**:
- A등급 (Level 4): 7개 (7.3%)
- B등급 (Level 2-3): 30개 (31.3%)
- C등급 (Level 1): 59개 (61.4%)
**Level별 정의**:
| Level | 검증 내용 | 예시 |
|-------|----------|------|
| 1 | 요소 존재 확인 | 버튼이 보이는가? |
| 2 | 상호작용 확인 | 클릭 시 반응하는가? |
| 3 | 기능 동작 확인 | 모달 열림, API 호출? |
| 4 | 데이터 검증 | 등록 후 목록 반영? |
**문제**: 61%의 시나리오가 "버튼 존재 확인"만 하고 실제 동작을 테스트하지 않음
### 문제 2: 일관성 없는 구조
**step ID 형식 혼란**:
```json
// 형식 1: 숫자
{"id": 1, ...}
// 형식 2: 문자열
{"id": "step-1", ...}
// 형식 3: 혼합
{"id": "step-0", ...}, {"id": 1, ...}
```
**action 필드 불일치**:
- `menu_navigate` vs `scrollAndFind`
- `verify_elements` vs `verify_element`
- `verify_not_mockup` vs `verify_page`
**expected 필드 불일치**:
```json
// 형식 1: 객체
"expected": {"url_contains": "/path", "visible": ["text"]}
// 형식 2: 문자열
"expected": "정상 페이지"
```
### 문제 3: 중복 메뉴 처리 부족
**영향 시나리오**: 거래처관리, 단가관리, 품목관리 등 중복 이름 메뉴
**해결**: `searchWithinParent`, `closeOtherMenus` 플래그 추가됨
- 적용된 시나리오: 3개
- 미적용 시나리오: 93개
### 문제 4: 필수 요소 누락
| 요소 | 포함된 시나리오 | 누락된 시나리오 |
|------|---------------|---------------|
| expectedAPIs | 15개 | 81개 |
| testData | 10개 | 86개 |
| requiredVerifications | 20개 | 76개 |
| rollbackPlan | 2개 | 94개 |
### 문제 5: 테스트 데이터 격리 미흡
**현황**:
- `E2E_TEST_` 접두사 사용: 3개 시나리오
- 기존 데이터 사용: 93개 시나리오
**위험**:
- 운영 데이터 오염 가능성
- 테스트 간 간섭 발생
---
## 3. 개선 우선순위
### Phase 1: 핵심 업무 시나리오 (HIGH)
**대상**: 실제 업무에서 가장 많이 사용되는 기능
**기간**: 즉시
| 시나리오 | 현재 등급 | 개선 내용 |
|----------|----------|----------|
| accounting-deposit.json | C | CRUD 전체 추가 |
| accounting-withdrawal.json | C | CRUD 전체 추가 |
| hr-attendance-*.json | B | 출퇴근 등록 테스트 |
| hr-vacation.json | B | 휴가 신청/승인 테스트 |
| approval-box.json | A | 유지 (이미 우수) |
### Phase 2: 설정/관리 시나리오 (MEDIUM)
**대상**: 시스템 설정 및 기준 정보 관리
**기간**: 1주 내
| 시나리오 | 현재 등급 | 개선 내용 |
|----------|----------|----------|
| settings-permission.json | C | 권한 부여/회수 테스트 |
| settings-attendance.json | C | 설정 변경 + 저장 테스트 |
| permission-management.json | B | 역할별 권한 검증 |
| popup-management.json | C | 팝업 등록/수정/삭제 |
### Phase 3: 개발 중 페이지 (LOW)
**대상**: 아직 개발 중인 페이지
**기간**: 개발 완료 후
| 시나리오 | 상태 | 조치 |
|----------|------|------|
| purchase-client.json | 개발 중 | 대기 |
| production-item.json | 부분 개발 | 대기 |
---
## 4. 시나리오 표준 템플릿
### 최소 구조 (C→B 등급 개선)
```json
{
"id": "scenario-name",
"name": "시나리오 한글명",
"screenshotPolicy": {
"onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
},
"description": "상세 설명",
"baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": {
"level1": "1차메뉴",
"level2": "2차메뉴",
"expectedUrl": "/expected/path",
"searchWithinParent": true,
"closeOtherMenus": true
},
"auth": {
"username": "TestUser5",
"password": "password123!"
},
"steps": [
{
"id": 1,
"name": "메뉴 진입",
"action": "menu_navigate",
"expected": {"url_contains": "/path"}
},
{
"id": 2,
"name": "목업 페이지 감지",
"action": "verify_not_mockup",
"checks": ["목록 표시", "버튼 존재"]
},
{
"id": 3,
"name": "테이블 확인",
"action": "verify_table",
"checks": ["컬럼1", "컬럼2"]
},
{
"id": 4,
"name": "등록 버튼 클릭",
"action": "click",
"target": "button:has-text('등록')",
"expected": {"modal": true}
},
{
"id": 5,
"name": "데이터 입력",
"action": "fill_form",
"fields": [{"name": "필드명", "value": "E2E_TEST_값"}]
},
{
"id": 6,
"name": "저장 및 검증",
"action": "click",
"target": "button:has-text('저장')",
"verify": {
"api_call": "POST /api/v1/resource",
"toast": "등록 완료",
"data_created": true
}
}
],
"expectedAPIs": [
{"method": "GET", "endpoint": "/api/v1/resource"},
{"method": "POST", "endpoint": "/api/v1/resource"}
],
"requiredVerifications": [
{"id": 5, "name": "목업 페이지 감지", "steps": [2]},
{"id": 2, "name": "등록/저장", "steps": [4, 5, 6]}
]
}
```
### 완전 CRUD 구조 (B→A 등급 개선)
```json
{
"steps": [
// ... 기본 진입 스텝 ...
// CREATE
{"id": "create-1", "phase": "CREATE", "name": "등록 버튼 클릭"},
{"id": "create-2", "phase": "CREATE", "name": "테스트 데이터 입력"},
{"id": "create-3", "phase": "CREATE", "name": "저장 + API 검증"},
{"id": "create-4", "phase": "CREATE", "name": "목록 반영 확인"},
// READ
{"id": "read-1", "phase": "READ", "name": "상세 페이지 진입"},
{"id": "read-2", "phase": "READ", "name": "데이터 일치 확인"},
// UPDATE
{"id": "update-1", "phase": "UPDATE", "name": "수정 모드 진입"},
{"id": "update-2", "phase": "UPDATE", "name": "데이터 변경"},
{"id": "update-3", "phase": "UPDATE", "name": "저장 + API 검증"},
{"id": "update-4", "phase": "UPDATE", "name": "변경 반영 확인"},
// DELETE
{"id": "delete-1", "phase": "DELETE", "name": "삭제 버튼 클릭"},
{"id": "delete-2", "phase": "DELETE", "name": "확인 다이얼로그"},
{"id": "delete-3", "phase": "DELETE", "name": "삭제 + API 검증"},
{"id": "delete-4", "phase": "DELETE", "name": "목록에서 제거 확인"}
],
"testData": {
"create": {"name": "E2E_TEST_데이터_{timestamp}"},
"update": {"name": "E2E_TEST_수정완료_{timestamp}"}
},
"rollbackPlan": {
"onCreateFail": "모달 닫기",
"onUpdateFail": "수동 삭제 필요",
"onDeleteFail": "수동 삭제 필요"
}
}
```
---
## 5. 개선 실행 계획
### 즉시 실행 (오늘)
1. **searchWithinParent 플래그 전체 적용**
- 대상: 중복 메뉴 이름이 있는 모든 시나리오
- 효과: 메뉴 탐색 실패 방지
2. **C등급 시나리오 최소 검증 추가**
- 대상: accounting-*, settings-* 시리즈
- 추가: 등록 버튼 클릭 → 모달 열림 → 닫기 검증
### 1주 내 실행
3. **핵심 업무 시나리오 CRUD 완성**
- hr-attendance-checkin.json: 출퇴근 등록
- hr-vacation.json: 휴가 신청/승인
- accounting-deposit.json: 입금 등록
4. **테스트 데이터 격리 적용**
- 모든 CREATE 스텝에 `E2E_TEST_` 접두사 적용
- DELETE 스텝 필수화
### 2주 내 실행
5. **expectedAPIs 전체 추가**
- API 문서 기반 엔드포인트 정의
- API 호출 검증 로직 추가
6. **requiredVerifications 표준화**
- 7개 필수 검증 항목 체크리스트 적용
---
## 6. 품질 지표 목표
| 지표 | 현재 | 1주 후 | 2주 후 |
|------|------|-------|-------|
| A등급 시나리오 | 7개 (7%) | 15개 (16%) | 25개 (26%) |
| B등급 시나리오 | 30개 (31%) | 40개 (42%) | 45개 (47%) |
| C등급 시나리오 | 59개 (61%) | 41개 (43%) | 26개 (27%) |
| expectedAPIs 포함 | 15개 | 50개 | 96개 |
| CRUD 완전 테스트 | 5개 | 15개 | 30개 |
---
## 7. 즉시 개선할 시나리오 목록 (Top 10)
| 우선순위 | 시나리오 | 현재 | 개선 내용 |
|---------|---------|------|----------|
| 1 | accounting-deposit.json | C | 입금 등록 CRUD |
| 2 | accounting-withdrawal.json | C | 출금 등록 CRUD |
| 3 | hr-attendance-checkin.json | B | 출퇴근 등록 |
| 4 | hr-vacation.json | B | 휴가 신청/승인 |
| 5 | settings-permission.json | C | 권한 변경 테스트 |
| 6 | popup-management.json | C | 팝업 CRUD |
| 7 | settings-attendance.json | C | 설정 변경 |
| 8 | accounting-bill.json | C | 청구서 CRUD |
| 9 | material-receiving.json | C | 입고 등록 |
| 10 | production-work-order.json | B | 작업지시 CRUD |
---
## 8. 결론
**현재 상태**: 96개 시나리오 중 7개만 완전한 E2E 테스트 수준
**핵심 문제**:
- 61%가 "페이지 로드 확인"만 테스트
- 실제 CRUD 동작 검증 부족
- 테스트 데이터 격리 미흡
**권장 조치**:
1. 즉시: 중복 메뉴 플래그 전체 적용
2. 1주: 핵심 업무 10개 시나리오 CRUD 완성
3. 2주: 전체 시나리오 최소 B등급 달성
**예상 효과**:
- 실제 기능 오류 발견율 3배 증가
- 회귀 테스트 신뢰도 향상
- QA 시간 단축