366 lines
11 KiB
Markdown
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 시간 단축
|