- 실패 시나리오 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>
11 KiB
11 KiB
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 형식 혼란:
// 형식 1: 숫자
{"id": 1, ...}
// 형식 2: 문자열
{"id": "step-1", ...}
// 형식 3: 혼합
{"id": "step-0", ...}, {"id": 1, ...}
action 필드 불일치:
menu_navigatevsscrollAndFindverify_elementsvsverify_elementverify_not_mockupvsverify_page
expected 필드 불일치:
// 형식 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 등급 개선)
{
"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 등급 개선)
{
"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. 개선 실행 계획
즉시 실행 (오늘)
-
searchWithinParent 플래그 전체 적용
- 대상: 중복 메뉴 이름이 있는 모든 시나리오
- 효과: 메뉴 탐색 실패 방지
-
C등급 시나리오 최소 검증 추가
- 대상: accounting-, settings- 시리즈
- 추가: 등록 버튼 클릭 → 모달 열림 → 닫기 검증
1주 내 실행
-
핵심 업무 시나리오 CRUD 완성
- hr-attendance-checkin.json: 출퇴근 등록
- hr-vacation.json: 휴가 신청/승인
- accounting-deposit.json: 입금 등록
-
테스트 데이터 격리 적용
- 모든 CREATE 스텝에
E2E_TEST_접두사 적용 - DELETE 스텝 필수화
- 모든 CREATE 스텝에
2주 내 실행
-
expectedAPIs 전체 추가
- API 문서 기반 엔드포인트 정의
- API 호출 검증 로직 추가
-
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주: 핵심 업무 10개 시나리오 CRUD 완성
- 2주: 전체 시나리오 최소 B등급 달성
예상 효과:
- 실제 기능 오류 발견율 3배 증가
- 회귀 테스트 신뢰도 향상
- QA 시간 단축