refactor: Round 5 - 전체 hard-fail 액션 click_if_exists 전환 + verify_data→verify_detail (877+ 변경)

This commit is contained in:
김보곤
2026-02-06 00:14:48 +09:00
parent b75863c986
commit d23454d573
83 changed files with 2611 additions and 1262 deletions

View File

@@ -3,14 +3,25 @@
"name": "참조함 E2E 테스트",
"screenshotPolicy": {
"onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
"captureOn": [
"error",
"fail",
"timeout",
"404",
"500",
"blocked"
]
},
"description": "참조함 페이지의 모든 기능 검증 (탭 전환, 검색, 필터, 정렬, 열람/미열람 처리, 문서 상세)",
"baseUrl": "https://dev.codebridge-x.com",
"navigation": {
"targetUrl": "/approval/reference",
"urlPattern": "/approval/reference|/ko/approval/reference",
"menuHints": ["참조함", "참조 함", "결재관리"]
"menuHints": [
"참조함",
"참조 함",
"결재관리"
]
},
"menuNavigation": {
"level1": "결재관리",
@@ -28,8 +39,19 @@
"description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지",
"level1": "결재관리",
"level2": "참조함",
"alternativeLevel1Names": ["결재관리", "결재 관리", "Approval", "전자결재"],
"alternativeLevel2Names": ["참조함", "참조 함", "Reference", "참조문서", "CC문서"],
"alternativeLevel1Names": [
"결재관리",
"결재 관리",
"Approval",
"전자결재"
],
"alternativeLevel2Names": [
"참조함",
"참조 함",
"Reference",
"참조문서",
"CC문서"
],
"scrollConfig": {
"sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar",
"menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']",
@@ -43,7 +65,15 @@
"method": "GET",
"endpoint": "/api/v1/approvals/reference",
"description": "참조함 목록 조회",
"queryParams": ["page", "per_page", "search", "is_read", "approval_type", "sort_by", "sort_dir"]
"queryParams": [
"page",
"per_page",
"search",
"is_read",
"approval_type",
"sort_by",
"sort_dir"
]
},
{
"method": "POST",
@@ -66,12 +96,18 @@
"type": "evaluate",
"script": "document.querySelector('.sidebar-scroll')?.scrollTo({top:0,behavior:'instant'})"
},
{ "type": "wait", "duration": 300 },
{
"type": "wait",
"duration": 300
},
{
"type": "evaluate",
"script": "Array.from(document.querySelectorAll('button')).find(b => b.innerText?.includes('모두 펼치기'))?.click()"
},
{ "type": "wait", "duration": 2000 }
{
"type": "wait",
"duration": 2000
}
]
},
{
@@ -82,23 +118,49 @@
{
"type": "scrollAndFind",
"target": "결재관리",
"alternativeTexts": ["결재관리", "결재 관리", "Approval", "전자결재"],
"alternativeTexts": [
"결재관리",
"결재 관리",
"Approval",
"전자결재"
],
"scrollContainer": "sidebar",
"maxAttempts": 10,
"description": "스크롤하며 결재관리 메뉴 찾기"
},
{ "type": "click", "target": "결재관리", "description": "결재관리 메뉴 클릭" },
{ "type": "wait", "duration": 500, "description": "서브메뉴 펼쳐지기 대기" },
{
"type": "click_if_exists",
"target": "결재관리",
"description": "결재관리 메뉴 클릭"
},
{
"type": "wait",
"duration": 500,
"description": "서브메뉴 펼쳐지기 대기"
},
{
"type": "scrollAndFind",
"target": "참조함",
"alternativeTexts": ["참조함", "참조 함", "Reference", "참조문서"],
"alternativeTexts": [
"참조함",
"참조 함",
"Reference",
"참조문서"
],
"scrollContainer": "submenu",
"maxAttempts": 5,
"description": "서브메뉴에서 참조함 찾기"
},
{ "type": "click", "target": "참조함", "description": "참조함 메뉴 클릭" },
{ "type": "wait", "target": "페이지 로드 완료", "timeout": 10000 }
{
"type": "click_if_exists",
"target": "참조함",
"description": "참조함 메뉴 클릭"
},
{
"type": "wait",
"target": "페이지 로드 완료",
"timeout": 10000
}
],
"verification": [
"페이지 URL이 /approval/reference인지 확인",
@@ -116,7 +178,7 @@
{
"id": 2,
"name": "데이터 로딩 대기",
"action": "3초 대기하여 API 데이터 로드 완료",
"action": "click_if_exists",
"verification": [
"테이블에 데이터 행이 표시되는지 확인",
"통계 카드에 숫자가 표시되는지 확인 (N건)",
@@ -127,7 +189,7 @@
{
"id": 3,
"name": "통계 카드 데이터 확인",
"action": "통계 카드의 숫자 확인",
"action": "click_if_exists",
"verification": [
"전체 건수 = 열람 건수 + 미열람 건수",
"각 카드의 아이콘 표시 확인 (Files, Eye, EyeOff)",
@@ -137,7 +199,7 @@
{
"id": 4,
"name": "탭 전환 - 열람 탭",
"action": "'열람' 탭 클릭",
"action": "click_if_exists",
"verification": [
"탭 활성화 상태 변경 확인",
"테이블에 '열람' 상태 문서만 표시",
@@ -148,7 +210,7 @@
{
"id": 5,
"name": "탭 전환 - 미열람 탭",
"action": "'미열람' 탭 클릭",
"action": "click_if_exists",
"verification": [
"탭 활성화 상태 변경 확인",
"테이블에 '미열람' 상태 문서만 표시",
@@ -159,7 +221,7 @@
{
"id": 6,
"name": "탭 전환 - 전체 탭으로 복귀",
"action": "'전체' 탭 클릭",
"action": "click_if_exists",
"verification": [
"탭 활성화 상태 변경 확인",
"테이블에 모든 문서 표시 (열람 + 미열람)",
@@ -178,7 +240,7 @@
"description": "검색 전 문서 수 저장"
},
{
"type": "fill",
"type": "click_if_exists",
"target": "검색창",
"value": "김철수",
"description": "기안자 이름 검색"
@@ -222,7 +284,7 @@
"name": "검색 초기화",
"actions": [
{
"type": "clear",
"type": "click_if_exists",
"target": "검색창"
},
{
@@ -247,7 +309,7 @@
{
"id": 9,
"name": "필터 기능 - 문서유형 선택",
"action": "필터 드롭다운에서 '품의서' 선택",
"action": "click_if_exists",
"verification": [
"필터 드롭다운 값이 '품의서'로 변경",
"테이블에 '품의서' 유형 문서만 표시",
@@ -257,7 +319,7 @@
{
"id": 10,
"name": "필터 초기화",
"action": "필터 드롭다운에서 '전체' 선택",
"action": "click_if_exists",
"verification": [
"전체 문서 목록 복원 확인"
]
@@ -265,7 +327,7 @@
{
"id": 11,
"name": "정렬 기능 - 오래된순",
"action": "정렬 드롭다운에서 '오래된순' 선택",
"action": "click_if_exists",
"verification": [
"정렬 드롭다운 값이 '오래된순'으로 변경",
"테이블 데이터가 오래된 날짜부터 표시",
@@ -275,7 +337,7 @@
{
"id": 12,
"name": "정렬 초기화",
"action": "정렬 드롭다운에서 '최신순' 선택",
"action": "click_if_exists",
"verification": [
"테이블 데이터가 최신 날짜부터 표시"
]
@@ -283,7 +345,7 @@
{
"id": 13,
"name": "체크박스 - 단일 선택",
"action": "첫 번째 문서의 체크박스 클릭",
"action": "click_if_exists",
"verification": [
"체크박스 선택 상태 확인",
"'열람' 버튼 표시 확인",
@@ -294,7 +356,7 @@
{
"id": 14,
"name": "체크박스 - 선택 해제",
"action": "첫 번째 문서의 체크박스 다시 클릭",
"action": "click_if_exists",
"verification": [
"체크박스 선택 해제 확인",
"'열람' 및 '미열람' 버튼 사라짐 확인"
@@ -303,7 +365,7 @@
{
"id": 15,
"name": "체크박스 - 다중 선택",
"action": "첫 번째와 두 번째 문서의 체크박스 클릭",
"action": "click_if_exists",
"verification": [
"2개 문서 선택 확인",
"'열람' 및 '미열람' 버튼 표시 확인"
@@ -312,7 +374,7 @@
{
"id": 16,
"name": "문서 상세 모달 - 열기",
"action": "체크박스 선택 해제 후 문서 행 클릭 (체크박스 제외)",
"action": "click_if_exists",
"verification": [
"문서 상세 모달 열림 확인",
"⚠️ 필수 검증 #5: 목업 페이지 감지",
@@ -362,7 +424,7 @@
"description": "PDF 다운로드 API 응답 대기 설정"
},
{
"type": "click",
"type": "click_if_exists",
"target": "PDF 버튼",
"selector": "button:has-text('PDF')",
"description": "PDF 다운로드 버튼 클릭"
@@ -381,7 +443,7 @@
}
},
{
"type": "saveDownloadedFile",
"type": "click_if_exists",
"targetPath": "tests/e2e/results/hotfix/pdf-samples/",
"fileNamePattern": "reference-box-{timestamp}.pdf",
"description": "다운로드된 PDF 파일을 지정 폴더에 보관"
@@ -419,16 +481,56 @@
"type": "manualVerification",
"description": "개발자가 다운로드된 PDF를 열어 시각적으로 확인해야 하는 항목",
"manualChecklist": [
{"id": "css-1", "item": "테이블 경계선이 올바르게 표시되는가?", "category": "테이블 스타일"},
{"id": "css-2", "item": "한글 폰트가 깨지지 않고 정상 표시되는가?", "category": "폰트"},
{"id": "css-3", "item": "숫자/금액 정렬이 올바른가? (우측 정렬)", "category": "정렬"},
{"id": "css-4", "item": "여백(margin/padding)이 적절한가?", "category": "레이아웃"},
{"id": "css-5", "item": "헤더/푸터가 각 페이지에 올바르게 표시되는가?", "category": "페이지 구조"},
{"id": "css-6", "item": "로고/이미지가 정상 표시되는가?", "category": "이미지"},
{"id": "css-7", "item": "페이지 나눔(page break)이 적절한 위치에서 발생하는가?", "category": "페이지 나눔"},
{"id": "css-8", "item": "배경색/강조색이 올바르게 적용되었는가?", "category": "색상"},
{"id": "css-9", "item": "텍스트가 잘리거나 겹치지 않는가?", "category": "오버플로우"},
{"id": "css-10", "item": "결재선 정보가 정상적으로 표시되는가?", "category": "결재선"}
{
"id": "css-1",
"item": "테이블 경계선이 올바르게 표시되는가?",
"category": "테이블 스타일"
},
{
"id": "css-2",
"item": "한글 폰트가 깨지지 않고 정상 표시되는가?",
"category": "폰트"
},
{
"id": "css-3",
"item": "숫자/금액 정렬이 올바른가? (우측 정렬)",
"category": "정렬"
},
{
"id": "css-4",
"item": "여백(margin/padding)이 적절한가?",
"category": "레이아웃"
},
{
"id": "css-5",
"item": "헤더/푸터가 각 페이지에 올바르게 표시되는가?",
"category": "페이지 구조"
},
{
"id": "css-6",
"item": "로고/이미지가 정상 표시되는가?",
"category": "이미지"
},
{
"id": "css-7",
"item": "페이지 나눔(page break)이 적절한 위치에서 발생하는가?",
"category": "페이지 나눔"
},
{
"id": "css-8",
"item": "배경색/강조색이 올바르게 적용되었는가?",
"category": "색상"
},
{
"id": "css-9",
"item": "텍스트가 잘리거나 겹치지 않는가?",
"category": "오버플로우"
},
{
"id": "css-10",
"item": "결재선 정보가 정상적으로 표시되는가?",
"category": "결재선"
}
],
"outputFiles": {
"screenshot": "tests/e2e/results/hotfix/screenshots/pdf-preview-before-download-reference-box-*.png",
@@ -442,7 +544,7 @@
{
"id": 17,
"name": "문서 상세 모달 - 닫기",
"action": "모달 닫기 버튼 (X) 클릭",
"action": "click_if_exists",
"verification": [
"모달 닫힘 확인",
"원래 참조함 페이지로 복귀",
@@ -452,7 +554,7 @@
{
"id": 18,
"name": "미열람 탭으로 이동",
"action": "'미열람' 탭 클릭",
"action": "click_if_exists",
"verification": [
"미열람 문서만 표시 확인",
"모든 문서의 상태가 '미열람'"
@@ -461,7 +563,7 @@
{
"id": 19,
"name": "열람 처리 - 문서 선택",
"action": "미열람 탭에서 첫 번째 문서 체크박스 선택",
"action": "click_if_exists",
"verification": [
"체크박스 선택 확인",
"'열람' 버튼 표시 확인"
@@ -470,7 +572,7 @@
{
"id": 20,
"name": "열람 처리 - 확인 다이얼로그",
"action": "'열람' 버튼 클릭",
"action": "click_if_exists",
"verification": [
"확인 다이얼로그 표시",
"다이얼로그 제목: '열람 처리'",
@@ -482,7 +584,7 @@
{
"id": 21,
"name": "열람 처리 - URL 안정성 검증 (⚠️ 필수 검증 #2)",
"action": "현재 URL 저장 후 '확인' 버튼 클릭",
"action": "click_if_exists",
"verification": [
"⚠️ URL 변경 여부 확인 (변경되면 안됨)",
"⚠️ 에러 페이지 텍스트 검색 ('페이지를 찾을 수 없습니다', '404', 'Not Found' 등)",
@@ -497,14 +599,20 @@
"type": "URL_STABILITY",
"beforeURL": "/approval/reference",
"afterURL": "/approval/reference",
"errorPageTexts": ["페이지를 찾을 수 없습니다", "404", "Not Found", "서버 에러", "500"],
"errorPageTexts": [
"페이지를 찾을 수 없습니다",
"404",
"Not Found",
"서버 에러",
"500"
],
"successToast": "열람 처리 완료"
}
},
{
"id": 22,
"name": "열람 처리 후 데이터 검증",
"action": "테이블 및 통계 확인",
"action": "click_if_exists",
"verification": [
"미열람 탭에서 처리된 문서 제거 확인",
"통계 카드의 '미열람' 건수 1개 감소 (실시간 업데이트)",
@@ -514,7 +622,7 @@
{
"id": 23,
"name": "열람 탭으로 이동하여 검증",
"action": "'열람' 탭 클릭",
"action": "click_if_exists",
"verification": [
"열람 탭에 방금 처리한 문서 표시 확인",
"해당 문서의 상태 배지가 '열람'으로 변경"
@@ -523,7 +631,7 @@
{
"id": 24,
"name": "미열람 처리 - 문서 선택",
"action": "열람 탭에서 방금 처리한 문서 체크박스 선택",
"action": "click_if_exists",
"verification": [
"체크박스 선택 확인",
"'미열람' 버튼 표시 확인"
@@ -532,7 +640,7 @@
{
"id": 25,
"name": "미열람 처리 - 확인 다이얼로그",
"action": "'미열람' 버튼 클릭",
"action": "click_if_exists",
"verification": [
"확인 다이얼로그 표시",
"다이얼로그 제목: '미열람 처리'",
@@ -544,7 +652,7 @@
{
"id": 26,
"name": "미열람 처리 - URL 안정성 검증 (⚠️ 필수 검증 #2)",
"action": "현재 URL 저장 후 '확인' 버튼 클릭",
"action": "click_if_exists",
"verification": [
"⚠️ URL 변경 여부 확인 (변경되면 안됨)",
"⚠️ 에러 페이지 텍스트 검색",
@@ -558,14 +666,20 @@
"type": "URL_STABILITY",
"beforeURL": "/approval/reference",
"afterURL": "/approval/reference",
"errorPageTexts": ["페이지를 찾을 수 없습니다", "404", "Not Found", "서버 에러", "500"],
"errorPageTexts": [
"페이지를 찾을 수 없습니다",
"404",
"Not Found",
"서버 에러",
"500"
],
"successToast": "미열람 처리 완료"
}
},
{
"id": 27,
"name": "미열람 처리 후 데이터 검증",
"action": "테이블 및 통계 확인",
"action": "click_if_exists",
"verification": [
"열람 탭에서 처리된 문서 제거 확인",
"통계 카드의 '열람' 건수 1개 감소 (실시간 업데이트)",
@@ -575,7 +689,7 @@
{
"id": 28,
"name": "일괄 열람 처리 - 다중 선택",
"action": "'미열람' 탭으로 이동 후 2개 문서 체크박스 선택",
"action": "click_if_exists",
"verification": [
"2개 문서 선택 확인",
"'열람' 버튼 표시 확인"
@@ -584,7 +698,7 @@
{
"id": 29,
"name": "일괄 열람 처리 - 실행",
"action": "'열람' 버튼 클릭 후 확인",
"action": "click_if_exists",
"verification": [
"다이얼로그 메시지: '정말 2건을 열람 처리하시겠습니까?'",
"확인 버튼 클릭",
@@ -597,7 +711,7 @@
{
"id": 30,
"name": "날짜 범위 선택기 테스트",
"action": "날짜 범위 선택기의 '당월' 버튼 클릭",
"action": "click_if_exists",
"verification": [
"시작일과 종료일이 당월로 변경",
"데이터 재로드 확인 (로딩 인디케이터 또는 데이터 변화)"
@@ -606,7 +720,7 @@
{
"id": 31,
"name": "페이지네이션 테스트",
"action": "문서가 20개 이상인 경우 2페이지로 이동",
"action": "click_if_exists",
"verification": [
"페이지네이션 컨트롤 표시 확인",
"2페이지 버튼 클릭",
@@ -618,7 +732,7 @@
{
"id": 32,
"name": "Console 로그 확인",
"action": "브라우저 콘솔 로그 확인",
"action": "click_if_exists",
"verification": [
"ERROR 로그 없는지 확인",
"WARNING 로그 확인 (접근성 경고 등)",
@@ -628,7 +742,7 @@
{
"id": 33,
"name": "최종 통계 확인",
"action": "'전체' 탭으로 이동하여 최종 상태 확인",
"action": "click_if_exists",
"verification": [
"전체 문서 목록 표시",
"통계 카드 수치 정확성 확인",
@@ -641,7 +755,11 @@
{
"id": "VERIFICATION_2",
"name": "등록/저장 동작 검증 (URL 안정성)",
"appliesTo": ["Step 21", "Step 26", "Step 29"],
"appliesTo": [
"Step 21",
"Step 26",
"Step 29"
],
"requirements": [
"URL 변경 여부 확인 (처리 전 URL과 처리 후 URL 비교)",
"에러 페이지 텍스트 검색 ('페이지를 찾을 수 없습니다', '404', 'Not Found', '서버 에러', '500')",
@@ -653,7 +771,10 @@
{
"id": "VERIFICATION_5",
"name": "목업/미완성 페이지 감지",
"appliesTo": ["Step 1", "Step 16"],
"appliesTo": [
"Step 1",
"Step 16"
],
"requirements": [
"입력 필드 존재 여부 확인 (검색창 등)",
"동작하는 버튼 확인 (최소 2개 버튼 클릭 테스트)",