From f2379c4e5ad41434db909418cf5c214cca73c1b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Tue, 3 Feb 2026 14:02:28 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=84=A4=EC=A0=95/=EB=A6=AC?= =?UTF-8?q?=ED=8F=AC=ED=8A=B8=20=EC=8B=9C=EB=82=98=EB=A6=AC=EC=98=A4=20A/B?= =?UTF-8?q?=EB=93=B1=EA=B8=89=20=EA=B0=9C=EC=84=A0=20(3=EA=B0=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - settings-popup (4→18): A등급, 팝업 CRUD - settings-subscription (3→12): B등급, 구독정보 조회 - report-analysis (4→12): B등급, 종합분석 대시보드 공통 개선: - searchWithinParent, closeOtherMenus 플래그 추가 - expectedAPIs 추가 - rollbackPlan 추가 --- report-analysis.json | 134 ++++++++++++++++++++--- settings-popup.json | 214 +++++++++++++++++++++++++++++++++++-- settings-subscription.json | 135 +++++++++++++++++++++-- 3 files changed, 449 insertions(+), 34 deletions(-) diff --git a/report-analysis.json b/report-analysis.json index ca0a513..07d5cb8 100644 --- a/report-analysis.json +++ b/report-analysis.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "리포트 > 종합분석 메뉴의 분석 대시보드 기능 테스트", + "description": "리포트 > 종합분석 메뉴의 분석 대시보드/차트/필터 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "리포트", "level2": "종합분석", - "expectedUrl": "/reports/comprehensive-analysis" + "expectedUrl": "/reports/comprehensive-analysis", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -34,37 +36,143 @@ "action": "verify_not_mockup", "checks": [ "분석 차트 표시", - "데이터 요약 카드 존재" + "데이터 요약 카드 존재", + "기간 필터 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "분석 대시보드 확인", + "name": "요약 통계 카드 확인", "action": "verify_elements", "checks": [ - "매출 차트 또는 데이터", - "비용 차트 또는 데이터", - "요약 통계" + "총 매출 카드", + "총 비용 카드", + "순이익 카드", + "전월 대비 증감" ], - "expected": "분석 대시보드 표시" + "expected": "요약 통계 카드 표시" }, { "id": 4, - "name": "기간 선택 필터 확인", + "name": "매출 차트 확인", "action": "verify_elements", "checks": [ - "기간 선택 가능" + "매출 추이 차트 (라인/바)", + "차트 범례 표시" ], - "expected": "기간 필터 표시" + "expected": "매출 차트 표시" + }, + { + "id": 5, + "name": "비용 차트 확인", + "action": "verify_elements", + "checks": [ + "비용 분석 차트 (파이/도넛)", + "카테고리별 비용" + ], + "expected": "비용 차트 표시" + }, + { + "id": 6, + "phase": "FILTER", + "name": "[FILTER] 기간 필터 - 월 선택", + "action": "click", + "target": "input[type='month'], select[name*='period'], [class*='period-picker']", + "expected": "기간 선택 열림" + }, + { + "id": 7, + "phase": "FILTER", + "name": "[FILTER] 조회 적용", + "action": "click", + "target": "button:has-text('조회'), button:has-text('적용'), button:has-text('검색')", + "expected": "필터 적용됨" + }, + { + "id": 8, + "phase": "FILTER", + "name": "[FILTER] 필터 결과 확인", + "action": "verify_detail", + "checks": [ + "선택한 기간의 데이터 표시" + ], + "expected": "필터 동작 확인" + }, + { + "id": 9, + "name": "부서별 분석 확인", + "action": "verify_elements", + "checks": [ + "부서별 매출/비용 또는 통계" + ], + "expected": "부서별 분석 표시" + }, + { + "id": 10, + "name": "엑셀 다운로드 버튼 확인", + "action": "verify_elements", + "checks": [ + "엑셀 다운로드 버튼 존재" + ], + "expected": "엑셀 다운로드 기능 표시" + }, + { + "id": 11, + "name": "PDF 내보내기 확인", + "action": "verify_elements", + "checks": [ + "PDF 내보내기 버튼 존재" + ], + "expected": "PDF 내보내기 기능 표시" + }, + { + "id": 12, + "name": "인쇄 버튼 확인", + "action": "verify_elements", + "checks": [ + "인쇄 버튼 존재" + ], + "expected": "인쇄 기능 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/reports/comprehensive-analysis", + "description": "종합분석 데이터 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/reports/sales-summary", + "description": "매출 요약 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/reports/cost-summary", + "description": "비용 요약 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/reports/department-analysis", + "description": "부서별 분석 조회" } ], "requiredVerifications": [ + { + "id": 3, + "name": "검색/필터", + "steps": [6, 7, 8], + "criteria": "기간 필터 동작" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "분석 차트, 데이터 확인" + "criteria": "분석 차트, 데이터 카드, 기간 필터 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음" + } } diff --git a/settings-popup.json b/settings-popup.json index 0960048..204dfda 100644 --- a/settings-popup.json +++ b/settings-popup.json @@ -5,17 +5,27 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "설정 > 팝업관리 메뉴의 팝업 설정 기능 테스트", + "description": "설정 > 팝업관리 메뉴의 팝업 CRUD 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "설정", "level2": "팝업관리", - "expectedUrl": "/settings/popup-management" + "expectedUrl": "/settings/popup-management", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", "password": "password123!" }, + "testData": { + "create": { + "title": "E2E_TEST_팝업_{timestamp}", + "content": "E2E 자동화 테스트용 팝업입니다.", + "startDate": "{today}", + "endDate": "{today+7}" + } + }, "steps": [ { "id": 1, @@ -34,37 +44,219 @@ "action": "verify_not_mockup", "checks": [ "팝업 목록 표시", - "팝업 등록 가능" + "팝업 등록 버튼 존재", + "상태 필터 존재" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "팝업 목록 확인", + "name": "팝업 테이블 구조 확인", "action": "verify_table", "checks": [ "팝업 제목 컬럼", "상태 컬럼", - "기간 컬럼" + "기간 컬럼", + "노출 위치 컬럼" ], - "expected": "팝업 목록 표시" + "expected": "팝업 테이블 표시" }, { "id": 4, - "name": "팝업 등록 버튼 확인", + "name": "기존 팝업 확인", "action": "verify_elements", "checks": [ - "팝업 등록 버튼 존재" + "등록된 팝업 존재 또는 등록된 팝업 없음" ], - "expected": "등록 버튼 표시" + "expected": "팝업 목록 상태 확인" + }, + { + "id": 5, + "phase": "CREATE", + "name": "[CREATE] 팝업 등록 버튼 클릭", + "action": "click", + "target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')", + "expected": { + "modal_open": true + } + }, + { + "id": 6, + "phase": "CREATE", + "name": "[CREATE] 팝업 제목 입력", + "action": "fill", + "target": "input[name*='title'], input[placeholder*='제목']", + "value": "E2E_TEST_팝업_{timestamp}", + "clear": true + }, + { + "id": 7, + "phase": "CREATE", + "name": "[CREATE] 팝업 내용 입력", + "action": "fill", + "target": "textarea[name*='content'], textarea[placeholder*='내용']", + "value": "E2E 자동화 테스트용 팝업입니다.", + "clear": true + }, + { + "id": 8, + "phase": "CREATE", + "name": "[CREATE] 시작일 설정", + "action": "click", + "target": "input[name*='start'], input[placeholder*='시작']", + "expected": "시작일 선택 가능" + }, + { + "id": 9, + "phase": "CREATE", + "name": "[CREATE] 종료일 설정", + "action": "click", + "target": "input[name*='end'], input[placeholder*='종료']", + "expected": "종료일 선택 가능" + }, + { + "id": 10, + "phase": "CREATE", + "name": "[CREATE] 필수 검증 #2: 팝업 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('등록'), button:has-text('확인')", + "critical": true, + "verify": { + "url_maintained": true, + "no_error_page": true, + "api_call": "POST /api/v1/settings/popups", + "toast": "등록|저장|완료|성공" + }, + "expected": "팝업 등록 완료" + }, + { + "id": 11, + "phase": "READ", + "name": "[READ] 등록된 팝업 검색", + "action": "fill", + "target": "input[type='search'], input[placeholder*='검색']", + "value": "E2E_TEST_팝업", + "submit": true + }, + { + "id": 12, + "phase": "READ", + "name": "[READ] 등록된 팝업 확인", + "action": "verify_detail", + "checks": [ + "E2E_TEST_팝업 목록에 표시" + ], + "expected": "등록된 팝업 확인" + }, + { + "id": 13, + "phase": "READ", + "name": "[READ] 팝업 상세/편집 클릭", + "action": "click", + "target": "table tbody tr:has-text('E2E_TEST_팝업')", + "expected": { + "detail_view": true + } + }, + { + "id": 14, + "phase": "UPDATE", + "name": "[UPDATE] 팝업 수정 모드", + "action": "click", + "target": "button:has-text('수정'), button:has-text('편집')", + "expected": { + "edit_mode": true + } + }, + { + "id": 15, + "phase": "UPDATE", + "name": "[UPDATE] 팝업 제목 변경", + "action": "fill", + "target": "input[name*='title'], input[placeholder*='제목']", + "value": "E2E_TEST_팝업_수정", + "clear": true + }, + { + "id": 16, + "phase": "UPDATE", + "name": "[UPDATE] 변경 저장", + "action": "click", + "target": "button:has-text('저장'), button:has-text('확인')", + "verify": { + "api_call": "PUT /api/v1/settings/popups", + "toast": "수정|저장|완료|성공" + }, + "expected": "팝업 수정 완료" + }, + { + "id": 17, + "phase": "DELETE", + "name": "[DELETE] 팝업 삭제", + "action": "click", + "target": "button:has-text('삭제'), button:has-text('제거')", + "expected": { + "confirm_dialog": true + } + }, + { + "id": 18, + "phase": "DELETE", + "name": "[DELETE] 삭제 확인", + "action": "click", + "target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')", + "verify": { + "api_call": "DELETE /api/v1/settings/popups", + "toast": "삭제|제거|완료|성공" + }, + "expected": "팝업 삭제 완료" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/settings/popups", + "description": "팝업 목록 조회" + }, + { + "method": "POST", + "endpoint": "/api/v1/settings/popups", + "description": "팝업 등록" + }, + { + "method": "GET", + "endpoint": "/api/v1/settings/popups/:id", + "description": "팝업 상세 조회" + }, + { + "method": "PUT", + "endpoint": "/api/v1/settings/popups/:id", + "description": "팝업 수정" + }, + { + "method": "DELETE", + "endpoint": "/api/v1/settings/popups/:id", + "description": "팝업 삭제" } ], "requiredVerifications": [ + { + "id": 2, + "name": "저장 버튼", + "steps": [10, 16], + "criteria": "API 호출 + 성공 토스트 + 데이터 반영" + }, { "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "팝업 목록, 등록 기능 확인" + "criteria": "팝업 목록, 등록 버튼, 상태 필터 존재" } - ] + ], + "rollbackPlan": { + "onCreateFail": "등록 모달 닫고 재시도", + "onUpdateFail": "페이지 새로고침 후 재시도", + "onDeleteFail": "수동 삭제 필요", + "cleanupRequired": "E2E_TEST_팝업* 패턴 데이터 삭제" + } } diff --git a/settings-subscription.json b/settings-subscription.json index e30e0b4..fe7a6f6 100644 --- a/settings-subscription.json +++ b/settings-subscription.json @@ -5,12 +5,14 @@ "onErrorOnly": true, "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] }, - "description": "설정 > 구독관리 메뉴의 구독 정보 조회 기능 테스트", + "description": "설정 > 구독관리 메뉴의 구독 정보 조회/플랜 비교 기능 테스트", "baseUrl": "https://dev.codebridge-x.com", "menuNavigation": { "level1": "설정", "level2": "구독관리", - "expectedUrl": "/subscription" + "expectedUrl": "/subscription", + "searchWithinParent": true, + "closeOtherMenus": true }, "auth": { "username": "TestUser5", @@ -34,20 +36,130 @@ "action": "verify_not_mockup", "checks": [ "구독 정보 표시", - "플랜 정보 표시" + "플랜 정보 표시", + "결제 정보 표시" ], "expected": "정상 페이지 (목업 아님)" }, { "id": 3, - "name": "구독 정보 확인", + "name": "현재 플랜 정보 확인", "action": "verify_elements", "checks": [ - "현재 플랜 표시", - "구독 기간 표시", - "결제 정보 표시" + "현재 플랜명 표시", + "플랜 가격 표시", + "포함 기능 표시" ], - "expected": "구독 정보 표시" + "expected": "현재 플랜 정보 표시" + }, + { + "id": 4, + "name": "구독 기간 확인", + "action": "verify_elements", + "checks": [ + "구독 시작일 표시", + "구독 종료일 표시", + "남은 기간 표시" + ], + "expected": "구독 기간 표시" + }, + { + "id": 5, + "name": "결제 정보 확인", + "action": "verify_elements", + "checks": [ + "결제 방법 표시", + "다음 결제일 표시", + "결제 금액 표시" + ], + "expected": "결제 정보 표시" + }, + { + "id": 6, + "name": "플랜 비교 확인", + "action": "verify_elements", + "checks": [ + "플랜 비교 테이블 또는 카드" + ], + "expected": "플랜 비교 가능" + }, + { + "id": 7, + "name": "플랜 변경 버튼 확인", + "action": "verify_elements", + "checks": [ + "플랜 변경 또는 업그레이드 버튼" + ], + "expected": "플랜 변경 버튼 표시" + }, + { + "id": 8, + "name": "사용량 현황 확인", + "action": "verify_elements", + "checks": [ + "사용자 수 현황", + "저장 용량 현황", + "기능 사용 현황" + ], + "expected": "사용량 현황 표시" + }, + { + "id": 9, + "name": "결제 내역 확인", + "action": "verify_elements", + "checks": [ + "결제 내역 테이블 또는 리스트" + ], + "expected": "결제 내역 표시" + }, + { + "id": 10, + "name": "영수증 다운로드 확인", + "action": "verify_elements", + "checks": [ + "영수증 다운로드 버튼 존재" + ], + "expected": "영수증 다운로드 기능 표시" + }, + { + "id": 11, + "name": "결제 수단 변경 확인", + "action": "verify_elements", + "checks": [ + "결제 수단 변경 버튼 존재" + ], + "expected": "결제 수단 변경 기능 표시" + }, + { + "id": 12, + "name": "구독 취소 버튼 확인", + "action": "verify_elements", + "checks": [ + "구독 취소 또는 해지 버튼 존재" + ], + "expected": "구독 취소 기능 표시" + } + ], + "expectedAPIs": [ + { + "method": "GET", + "endpoint": "/api/v1/subscription", + "description": "구독 정보 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/subscription/plans", + "description": "플랜 목록 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/subscription/payments", + "description": "결제 내역 조회" + }, + { + "method": "GET", + "endpoint": "/api/v1/subscription/usage", + "description": "사용량 현황 조회" } ], "requiredVerifications": [ @@ -55,7 +167,10 @@ "id": 5, "name": "목업 페이지 감지", "steps": [2], - "criteria": "구독 정보 확인" + "criteria": "구독 정보, 플랜 정보, 결제 정보 존재" } - ] + ], + "rollbackPlan": { + "note": "조회 전용 페이지로 데이터 변경 없음 (결제/플랜 변경은 별도 테스트)" + } }