# 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 시간 단축