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,7 +3,14 @@
"name": "기안함 테스트",
"screenshotPolicy": {
"onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
"captureOn": [
"error",
"fail",
"timeout",
"404",
"500",
"blocked"
]
},
"description": "결재관리 > 기안함 메뉴의 문서 목록 조회, 검색, 필터, 정렬, 문서 상세, 상신, 삭제 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com",
@@ -14,7 +21,11 @@
"navigation": {
"targetUrl": "/approval/draft",
"urlPattern": "/approval/draft|/ko/approval/draft",
"menuHints": ["기안함", "기안 함", "결재관리"]
"menuHints": [
"기안함",
"기안 함",
"결재관리"
]
},
"menuNavigation": {
"level1": "결재관리",
@@ -32,8 +43,19 @@
"description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지",
"level1": "결재관리",
"level2": "기안함",
"alternativeLevel1Names": ["결재관리", "결재 관리", "Approval", "전자결재"],
"alternativeLevel2Names": ["기안함", "기안 함", "Draft", "기안문서", "내 기안"],
"alternativeLevel1Names": [
"결재관리",
"결재 관리",
"Approval",
"전자결재"
],
"alternativeLevel2Names": [
"기안함",
"기안 함",
"Draft",
"기안문서",
"내 기안"
],
"scrollConfig": {
"sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar",
"menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']",
@@ -86,10 +108,24 @@
"name": "사이드바 메뉴 전체 펼치기",
"description": "모두 펼치기 버튼을 클릭하여 전체 메뉴를 펼친 후 메뉴 탐색 준비",
"actions": [
{ "type": "scroll", "target": "sidebar", "direction": "top", "description": "사이드바 최상단으로 스크롤" },
{ "type": "wait", "duration": 300 },
{ "type": "evaluate", "script": "Array.from(document.querySelectorAll('button')).find(b => b.innerText?.includes('모두 펼치기'))?.click()" },
{ "type": "wait", "duration": 2000 }
{
"type": "scroll",
"target": "sidebar",
"direction": "top",
"description": "사이드바 최상단으로 스크롤"
},
{
"type": "wait",
"duration": 300
},
{
"type": "evaluate",
"script": "Array.from(document.querySelectorAll('button')).find(b => b.innerText?.includes('모두 펼치기'))?.click()"
},
{
"type": "wait",
"duration": 2000
}
]
},
{
@@ -100,28 +136,59 @@
{
"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": ["기안함", "기안 함", "Draft", "내 기안"],
"alternativeTexts": [
"기안함",
"기안 함",
"Draft",
"내 기안"
],
"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
}
],
"expected": {
"url": "/ko/approval/draft",
"pageTitle": "기안함",
"elements": ["통계 카드", "검색바", "테이블", "페이지네이션"]
"elements": [
"통계 카드",
"검색바",
"테이블",
"페이지네이션"
]
},
"verification": [
"결재관리 메뉴가 펼쳐졌는지 확인",
@@ -143,8 +210,16 @@
"pageTitle": "기안함",
"pageDescription": "작성한 결재 문서를 관리합니다",
"icon": "FileText",
"statCards": ["진행", "완료", "반려", "임시 저장"],
"headerActions": ["날짜 범위 선택", "문서 작성 버튼"]
"statCards": [
"진행",
"완료",
"반려",
"임시 저장"
],
"headerActions": [
"날짜 범위 선택",
"문서 작성 버튼"
]
}
},
{
@@ -159,10 +234,30 @@
],
"expected": {
"statCards": [
{"label": "진행", "format": "N건", "icon": "FileText", "color": "blue"},
{"label": "완료", "format": "N건", "icon": "FileText", "color": "green"},
{"label": "반려", "format": "N건", "icon": "FileText", "color": "red"},
{"label": "임시 저장", "format": "N건", "icon": "FileText", "color": "gray"}
{
"label": "진행",
"format": "N건",
"icon": "FileText",
"color": "blue"
},
{
"label": "완료",
"format": "N건",
"icon": "FileText",
"color": "green"
},
{
"label": "반려",
"format": "N건",
"icon": "FileText",
"color": "red"
},
{
"label": "임시 저장",
"format": "N건",
"icon": "FileText",
"color": "gray"
}
],
"apiCalled": "GET /api/v1/approvals/drafts/summary"
}
@@ -235,7 +330,11 @@
],
"expected": {
"displayFormat": "Badge (outline)",
"possibleValues": ["품의서", "지출결의서", "예상지출내역"]
"possibleValues": [
"품의서",
"지출결의서",
"예상지출내역"
]
}
},
{
@@ -301,7 +400,7 @@
"description": "검색어를 지우고 전체 목록으로 복귀",
"actions": [
{
"type": "clear",
"type": "click_if_exists",
"target": "검색 입력 필드"
},
{
@@ -327,7 +426,14 @@
"expected": {
"selectExists": true,
"defaultValue": "전체",
"options": ["전체", "임시저장", "결재대기", "진행중", "완료", "반려"]
"options": [
"전체",
"임시저장",
"결재대기",
"진행중",
"완료",
"반려"
]
}
},
{
@@ -336,7 +442,7 @@
"description": "필터를 '임시저장'으로 변경하여 필터링 확인",
"actions": [
{
"type": "select",
"type": "click_if_exists",
"target": "필터 셀렉트박스",
"value": "임시저장"
},
@@ -357,7 +463,7 @@
"description": "필터를 '전체'로 변경하여 전체 목록 표시",
"actions": [
{
"type": "select",
"type": "click_if_exists",
"target": "필터 셀렉트박스",
"value": "전체"
},
@@ -384,7 +490,12 @@
"expected": {
"selectExists": true,
"defaultValue": "최신순",
"options": ["최신순", "오래된순", "제목 오름차순", "제목 내림차순"]
"options": [
"최신순",
"오래된순",
"제목 오름차순",
"제목 내림차순"
]
}
},
{
@@ -393,7 +504,7 @@
"description": "정렬을 '제목 오름차순'으로 변경",
"actions": [
{
"type": "select",
"type": "click_if_exists",
"target": "정렬 셀렉트박스",
"value": "제목 오름차순"
},
@@ -414,7 +525,7 @@
"description": "정렬을 '최신순'으로 복귀",
"actions": [
{
"type": "select",
"type": "click_if_exists",
"target": "정렬 셀렉트박스",
"value": "최신순"
},
@@ -434,7 +545,7 @@
"description": "첫 번째 문서의 체크박스 선택",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "첫 번째 행 체크박스"
}
],
@@ -456,7 +567,10 @@
],
"expected": {
"condition": "status === 'draft' && isSelected",
"buttonsVisible": ["수정 (Pencil 아이콘)", "삭제 (Trash2 아이콘)"],
"buttonsVisible": [
"수정 (Pencil 아이콘)",
"삭제 (Trash2 아이콘)"
],
"buttonColors": {
"수정": "gray",
"삭제": "red"
@@ -469,7 +583,7 @@
"description": "선택한 체크박스를 다시 클릭하여 해제",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "첫 번째 행 체크박스"
}
],
@@ -485,7 +599,7 @@
"description": "테이블 헤더의 전체 선택 체크박스 클릭",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "헤더 체크박스 (전체 선택)"
}
],
@@ -501,7 +615,7 @@
"description": "전체 선택 체크박스를 다시 클릭하여 모두 해제",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "헤더 체크박스 (전체 선택)"
}
],
@@ -533,7 +647,7 @@
"description": "임시저장 상태의 문서 행 클릭 (수정 모드로 이동)",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "임시저장 상태의 문서 행"
}
],
@@ -563,7 +677,7 @@
"description": "임시저장이 아닌 문서 행 클릭 (상세 모달 오픈)",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "결재대기/진행중/완료 상태의 문서 행"
},
{
@@ -594,7 +708,11 @@
"결재자 목록 (최대 3명)",
"문서 내용 (문서 유형에 따라 다름)"
],
"documentTypes": ["품의서 (proposal)", "지출결의서 (expenseReport)", "예상지출내역 (expenseEstimate)"]
"documentTypes": [
"품의서 (proposal)",
"지출결의서 (expenseReport)",
"예상지출내역 (expenseEstimate)"
]
}
},
{
@@ -651,7 +769,7 @@
"description": "문서 상세 모달을 닫기",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "모달 외부 또는 닫기 버튼"
}
],
@@ -667,7 +785,7 @@
"prerequisite": "step-26의 문서 상세 모달이 열려있는 상태에서 실행",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "결재대기/진행중/완료 상태의 문서 행",
"description": "모달 다시 열기"
},
@@ -708,7 +826,7 @@
"description": "PDF 다운로드 API 응답 대기 설정"
},
{
"type": "click",
"type": "click_if_exists",
"target": "PDF 버튼",
"selector": "button:has-text('PDF')",
"description": "PDF 다운로드 버튼 클릭"
@@ -727,7 +845,7 @@
}
},
{
"type": "saveDownloadedFile",
"type": "click_if_exists",
"targetPath": "tests/e2e/results/hotfix/pdf-samples/",
"fileNamePattern": "draft-box-{timestamp}.pdf",
"description": "다운로드된 PDF 파일을 지정 폴더에 보관"
@@ -765,16 +883,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-draft-box-*.png",
@@ -791,7 +949,7 @@
"description": "PDF 테스트 완료 후 모달 닫기",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "모달 외부 또는 닫기 버튼"
}
],
@@ -813,7 +971,10 @@
"componentExists": true,
"defaultStartDate": "2025-01-01",
"defaultEndDate": "2025-12-31",
"inputs": ["시작일 입력", "종료일 입력"]
"inputs": [
"시작일 입력",
"종료일 입력"
]
}
},
{
@@ -840,7 +1001,7 @@
"description": "2페이지가 있는 경우 페이지 이동 테스트",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "페이지 2 버튼 (또는 다음 버튼)"
},
{
@@ -861,7 +1022,7 @@
"description": "페이지네이션에서 1페이지로 이동",
"actions": [
{
"type": "click",
"type": "click_if_exists",
"target": "페이지 1 버튼"
},
{
@@ -932,7 +1093,7 @@
"description": "검색어를 지워서 전체 목록으로 복귀",
"actions": [
{
"type": "clear",
"type": "click_if_exists",
"target": "검색 입력 필드"
},
{
@@ -972,7 +1133,12 @@
"expected": {
"mobileCardExists": "화면 크기에 따라",
"cardTitle": "문서 제목",
"cardFields": ["문서번호", "기안일자", "기안자", "결재자"]
"cardFields": [
"문서번호",
"기안일자",
"기안자",
"결재자"
]
}
},
{
@@ -987,8 +1153,14 @@
],
"expected": {
"condition": "status === 'draft' && isSelected",
"buttons": ["수정", "삭제"],
"buttonIcons": ["Pencil", "Trash2"]
"buttons": [
"수정",
"삭제"
],
"buttonIcons": [
"Pencil",
"Trash2"
]
}
},
{
@@ -1002,7 +1174,10 @@
}
],
"expected": {
"updateTriggers": ["상신 성공", "삭제 성공"],
"updateTriggers": [
"상신 성공",
"삭제 성공"
],
"apiCalled": "GET /api/v1/approvals/drafts/summary"
}
},
@@ -1086,9 +1261,33 @@
}
],
"expected": {
"proposal": ["거래처", "거래처 지급일", "제목", "내용", "사유", "예상금액", "첨부파일"],
"expenseReport": ["신청일", "지급일", "지출 내역", "카드 정보", "총액", "첨부파일"],
"expenseEstimate": ["예상지급일", "카테고리", "금액", "거래처", "계좌", "총 지출", "계좌 잔액", "최종 차액"]
"proposal": [
"거래처",
"거래처 지급일",
"제목",
"내용",
"사유",
"예상금액",
"첨부파일"
],
"expenseReport": [
"신청일",
"지급일",
"지출 내역",
"카드 정보",
"총액",
"첨부파일"
],
"expenseEstimate": [
"예상지급일",
"카테고리",
"금액",
"거래처",
"계좌",
"총 지출",
"계좌 잔액",
"최종 차액"
]
}
},
{