diff --git a/accounting-daily-report.json b/accounting-daily-report.json new file mode 100644 index 0000000..00dd1f9 --- /dev/null +++ b/accounting-daily-report.json @@ -0,0 +1,31 @@ +{ + "id": "accounting-daily-report", + "name": "일일 일보 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "회계관리 > 일일 일보 메뉴의 일일 보고서 조회/필터 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "회계관리", + "level2": "일일 일보", + "expectedUrl": "/accounting/daily-report", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 회계관리 > 일일 일보", "action": "menu_navigate", "level1": "회계관리", "level2": "일일 일보", "expected": { "url_contains": "/accounting", "visible": ["일일", "일보"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["일보 데이터 표시", "필터 또는 날짜 선택 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "통계 카드 확인", "action": "evaluate", "script": "(() => { const cards = document.querySelectorAll('[class*=\"card\"], [class*=\"Card\"], [class*=\"stat\"], [class*=\"summary\"]'); return cards.length > 0 ? 'Stats: ' + cards.length + ' cards' : 'No stat cards (ok)'; })()" }, + { "id": 6, "name": "일보 테이블 구조 확인", "action": "verify_table", "checks": ["일보 데이터 컬럼"], "expected": "일보 테이블 표시" }, + { "id": 7, "phase": "FILTER", "name": "[FILTER] 날짜 필터", "action": "click_if_exists", "target": "input[type='date']:first-of-type, [class*='datepicker']:first-of-type", "expected": "날짜 선택 열림" }, + { "id": 8, "phase": "FILTER", "name": "[FILTER] 조회 버튼", "action": "click_if_exists", "target": "button:has-text('조회'), button:has-text('검색'), button:has-text('적용')", "expected": "필터 적용" }, + { "id": 9, "name": "인쇄/다운로드 버튼 확인", "action": "evaluate", "script": "(() => { const btns = Array.from(document.querySelectorAll('button')).filter(b => ['인쇄','엑셀','Excel','다운로드','PDF'].some(t => b.innerText?.includes(t))); return btns.length > 0 ? 'Export buttons: ' + btns.map(b=>b.innerText.trim()).join(', ') : 'No export buttons (ok)'; })()" }, + { "id": 10, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 전용 페이지로 데이터 변경 없음" } +} \ No newline at end of file diff --git a/accounting-gift-card.json b/accounting-gift-card.json new file mode 100644 index 0000000..7921f3c --- /dev/null +++ b/accounting-gift-card.json @@ -0,0 +1,32 @@ +{ + "id": "accounting-gift-card", + "name": "상품권관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "회계관리 > 상품권관리 메뉴의 상품권 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "회계관리", + "level2": "상품권관리", + "expectedUrl": "/accounting/gift-card", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 회계관리 > 상품권관리", "action": "menu_navigate", "level1": "회계관리", "level2": "상품권관리", "expected": { "url_contains": "/accounting", "visible": ["상품권"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["상품권 목록 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "상품권 테이블 구조 확인", "action": "verify_table", "checks": ["상품권 데이터 컬럼"], "expected": "상품권 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "name": "등록 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가','발행'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 9, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 10, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["상품권 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 11, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/accounting-journal-entry.json b/accounting-journal-entry.json new file mode 100644 index 0000000..b919e18 --- /dev/null +++ b/accounting-journal-entry.json @@ -0,0 +1,33 @@ +{ + "id": "accounting-journal-entry", + "name": "일반전표입력 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "회계관리 > 일반전표입력 메뉴의 전표 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "회계관리", + "level2": "일반전표입력", + "expectedUrl": "/accounting/journal-entry", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 회계관리 > 일반전표입력", "action": "menu_navigate", "level1": "회계관리", "level2": "일반전표입력", "expected": { "url_contains": "/accounting", "visible": ["전표", "일반"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["전표 목록 또는 입력 폼 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "전표 테이블 구조 확인", "action": "verify_table", "checks": ["전표 데이터 컬럼"], "expected": "전표 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "phase": "FILTER", "name": "[FILTER] 기간 필터", "action": "click_if_exists", "target": "input[type='date']:first-of-type, [class*='datepicker']:first-of-type", "expected": "날짜 선택 열림" }, + { "id": 9, "name": "등록 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가','입력'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 10, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 11, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["전표 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 12, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/accounting-tax-issue.json b/accounting-tax-issue.json new file mode 100644 index 0000000..394c1f3 --- /dev/null +++ b/accounting-tax-issue.json @@ -0,0 +1,33 @@ +{ + "id": "accounting-tax-issue", + "name": "세금계산서발행 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "회계관리 > 세금계산서발행 메뉴의 세금계산서 발행/조회 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "회계관리", + "level2": "세금계산서발행", + "expectedUrl": "/accounting/tax-invoice-issue", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 회계관리 > 세금계산서발행", "action": "menu_navigate", "level1": "회계관리", "level2": "세금계산서발행", "expected": { "url_contains": "/accounting", "visible": ["세금계산서", "발행"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["발행 목록 또는 폼 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "세금계산서 테이블 구조 확인", "action": "verify_table", "checks": ["세금계산서 데이터 컬럼"], "expected": "세금계산서 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "phase": "FILTER", "name": "[FILTER] 기간 필터", "action": "click_if_exists", "target": "input[type='date']:first-of-type, [class*='datepicker']:first-of-type", "expected": "날짜 선택 열림" }, + { "id": 9, "name": "발행 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['발행','등록','신규','추가'].some(t => b.innerText?.includes(t))); return btn ? 'Issue button: ' + btn.innerText.trim() : 'No issue button (ok)'; })()" }, + { "id": 10, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 11, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["세금계산서 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 12, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/accounting-tax-mgmt.json b/accounting-tax-mgmt.json new file mode 100644 index 0000000..f6b09e2 --- /dev/null +++ b/accounting-tax-mgmt.json @@ -0,0 +1,33 @@ +{ + "id": "accounting-tax-mgmt", + "name": "세금계산서관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "회계관리 > 세금계산서관리 메뉴의 세금계산서 조회/검색/필터 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "회계관리", + "level2": "세금계산서관리", + "expectedUrl": "/accounting/tax-invoice", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 회계관리 > 세금계산서관리", "action": "menu_navigate", "level1": "회계관리", "level2": "세금계산서관리", "expected": { "url_contains": "/accounting", "visible": ["세금계산서"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["세금계산서 목록 표시", "필터 또는 검색 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "세금계산서 테이블 구조 확인", "action": "verify_table", "checks": ["세금계산서 데이터 컬럼"], "expected": "세금계산서 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "phase": "FILTER", "name": "[FILTER] 필터 존재 확인", "action": "evaluate", "script": "(() => { const selects = document.querySelectorAll('select, [role=\"combobox\"], button[class*=\"select\"]'); return selects.length > 0 ? 'Filters: ' + selects.length : 'No filters (ok)'; })()" }, + { "id": 9, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 10, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["세금계산서 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 11, "name": "엑셀 다운로드 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['엑셀','Excel','다운로드'].some(t => b.innerText?.includes(t))); return btn ? 'Excel button: ' + btn.innerText.trim() : 'No excel button (ok)'; })()" }, + { "id": 12, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 전용 페이지로 데이터 변경 없음" } +} \ No newline at end of file diff --git a/board-test.json b/board-test.json new file mode 100644 index 0000000..3ba1cb9 --- /dev/null +++ b/board-test.json @@ -0,0 +1,34 @@ +{ + "id": "board-test", + "name": "게시판 테스트 페이지 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "게시판 > 게시판 테스트 메뉴의 테스트 게시판 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "게시판", + "level2": "게시판 테스트", + "expectedUrl": "/boards/test", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 게시판 > 게시판 테스트", "action": "menu_navigate", "level1": "게시판", "level2": "게시판 테스트", "expected": { "url_contains": "/boards", "visible": ["게시판"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["게시글 목록 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "게시판 테이블 구조 확인", "action": "verify_table", "checks": ["제목 컬럼", "작성자 컬럼", "날짜 컬럼"], "expected": "게시판 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "name": "글쓰기 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['글쓰기','등록','작성','신규'].some(t => b.innerText?.includes(t))); return btn ? 'Write button: ' + btn.innerText.trim() : 'No write button (ok)'; })()" }, + { "id": 9, "name": "게시글 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 10, "name": "게시글 상세 확인", "action": "verify_detail", "checks": ["게시글 내용 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 11, "name": "목록으로 돌아가기", "action": "click_if_exists", "target": "button:has-text('목록'), a:has-text('목록'), [class*='back']", "expected": "목록 페이지로 복귀" }, + { "id": 12, "name": "페이지네이션 확인", "action": "evaluate", "script": "(() => { const p = document.querySelector('[class*=\"pagination\"], [class*=\"Pagination\"]'); return p ? 'Pagination found' : 'No pagination (ok)'; })()" }, + { "id": 13, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/customer-inquiry.json b/customer-inquiry.json new file mode 100644 index 0000000..f22577d --- /dev/null +++ b/customer-inquiry.json @@ -0,0 +1,33 @@ +{ + "id": "customer-inquiry", + "name": "1:1 문의 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "고객센터 > 1:1 문의 메뉴의 문의 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "고객센터", + "level2": "1:1 문의", + "expectedUrl": "/customer-center/inquiry", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 고객센터 > 1:1 문의", "action": "menu_navigate", "level1": "고객센터", "level2": "1:1 문의", "expected": { "url_contains": "/customer", "visible": ["문의", "1:1"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["문의 목록 또는 작성 폼 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "문의 목록 구조 확인", "action": "verify_table", "checks": ["제목 컬럼", "상태 컬럼", "날짜 컬럼"], "expected": "문의 목록 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "name": "문의하기 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['문의','작성','등록','신규'].some(t => b.innerText?.includes(t))); return btn ? 'Inquiry button: ' + btn.innerText.trim() : 'No inquiry button (ok)'; })()" }, + { "id": 9, "name": "문의 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 10, "name": "문의 상세 확인", "action": "verify_detail", "checks": ["문의 내용 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 11, "name": "목록으로 돌아가기", "action": "click_if_exists", "target": "button:has-text('목록'), a:has-text('목록'), [class*='back']", "expected": "목록 페이지로 복귀" }, + { "id": 12, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/material-dispatch.json b/material-dispatch.json new file mode 100644 index 0000000..99bea28 --- /dev/null +++ b/material-dispatch.json @@ -0,0 +1,32 @@ +{ + "id": "material-dispatch", + "name": "배차차량관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "자재관리 > 배차차량관리 메뉴의 배차/차량 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "자재관리", + "level2": "배차차량관리", + "expectedUrl": "/material/dispatch", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 자재관리 > 배차차량관리", "action": "menu_navigate", "level1": "자재관리", "level2": "배차차량관리", "expected": { "url_contains": "/material", "visible": ["배차", "차량"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["배차/차량 목록 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "배차 테이블 구조 확인", "action": "verify_table", "checks": ["차량/배차 데이터 컬럼"], "expected": "배차 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "name": "등록 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가','배차'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 9, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 10, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["배차/차량 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 11, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/purchase-order.json b/purchase-order.json new file mode 100644 index 0000000..30f9424 --- /dev/null +++ b/purchase-order.json @@ -0,0 +1,34 @@ +{ + "id": "purchase-order", + "name": "발주관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "구매관리 > 발주관리 메뉴의 발주 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "구매관리", + "level2": "발주관리", + "expectedUrl": "/purchase/order", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 구매관리 > 발주관리", "action": "menu_navigate", "level1": "구매관리", "level2": "발주관리", "expected": { "url_contains": "/purchase", "visible": ["발주"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["발주 목록 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "발주 테이블 구조 확인", "action": "verify_table", "checks": ["발주 데이터 컬럼"], "expected": "발주 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "phase": "FILTER", "name": "[FILTER] 필터 존재 확인", "action": "evaluate", "script": "(() => { const selects = document.querySelectorAll('select, [role=\"combobox\"], button[class*=\"select\"]'); return selects.length > 0 ? 'Filters: ' + selects.length : 'No filters (ok)'; })()" }, + { "id": 9, "name": "등록 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가','발주'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 10, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 11, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["발주 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 12, "name": "목록으로 돌아가기", "action": "click_if_exists", "target": "button:has-text('목록'), a:has-text('목록'), [class*='back']", "expected": "목록 페이지로 복귀" }, + { "id": 13, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/purchase-price.json b/purchase-price.json new file mode 100644 index 0000000..e539a2f --- /dev/null +++ b/purchase-price.json @@ -0,0 +1,32 @@ +{ + "id": "purchase-price", + "name": "구매 단가관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "구매관리 > 단가관리 메뉴의 구매 단가 조회/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "구매관리", + "level2": "단가관리", + "expectedUrl": "/purchase/price", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 구매관리 > 단가관리", "action": "menu_navigate", "level1": "구매관리", "level2": "단가관리", "expected": { "url_contains": "/purchase", "visible": ["단가"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["단가 목록 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "단가 테이블 구조 확인", "action": "verify_table", "checks": ["단가 데이터 컬럼"], "expected": "단가 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "name": "등록 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 9, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 10, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["단가 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 11, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/purchase-status.json b/purchase-status.json new file mode 100644 index 0000000..174b7a6 --- /dev/null +++ b/purchase-status.json @@ -0,0 +1,31 @@ +{ + "id": "purchase-status", + "name": "구매현황 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "구매관리 > 구매현황 메뉴의 구매 현황 조회/필터 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "구매관리", + "level2": "구매현황", + "expectedUrl": "/purchase/status", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 구매관리 > 구매현황", "action": "menu_navigate", "level1": "구매관리", "level2": "구매현황", "expected": { "url_contains": "/purchase", "visible": ["구매", "현황"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["구매 현황 데이터 표시", "필터 또는 검색 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "통계 카드 확인", "action": "evaluate", "script": "(() => { const cards = document.querySelectorAll('[class*=\"card\"], [class*=\"Card\"], [class*=\"stat\"], [class*=\"summary\"]'); return cards.length > 0 ? 'Stats: ' + cards.length + ' cards' : 'No stat cards (ok)'; })()" }, + { "id": 6, "name": "구매현황 테이블 구조 확인", "action": "verify_table", "checks": ["구매 데이터 컬럼"], "expected": "구매현황 테이블 표시" }, + { "id": 7, "phase": "FILTER", "name": "[FILTER] 기간 필터", "action": "click_if_exists", "target": "input[type='date']:first-of-type, [class*='datepicker']:first-of-type", "expected": "날짜 선택 열림" }, + { "id": 8, "phase": "FILTER", "name": "[FILTER] 조회 버튼", "action": "click_if_exists", "target": "button:has-text('조회'), button:has-text('검색'), button:has-text('적용')", "expected": "필터 적용" }, + { "id": 9, "name": "엑셀 다운로드 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['엑셀','Excel','다운로드'].some(t => b.innerText?.includes(t))); return btn ? 'Excel button: ' + btn.innerText.trim() : 'No excel button (ok)'; })()" }, + { "id": 10, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 전용 페이지로 데이터 변경 없음" } +} \ No newline at end of file diff --git a/purchase-vendor.json b/purchase-vendor.json new file mode 100644 index 0000000..81f6a2e --- /dev/null +++ b/purchase-vendor.json @@ -0,0 +1,33 @@ +{ + "id": "purchase-vendor", + "name": "구매관리 거래처관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "구매관리 > 거래처관리 메뉴의 거래처 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "구매관리", + "level2": "거래처관리", + "expectedUrl": "/purchase/vendor", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 구매관리 > 거래처관리", "action": "menu_navigate", "level1": "구매관리", "level2": "거래처관리", "expected": { "url_contains": "/purchase", "visible": ["거래처"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["거래처 목록 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "거래처 테이블 구조 확인", "action": "verify_table", "checks": ["거래처명 컬럼", "사업자번호 컬럼"], "expected": "거래처 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "name": "등록 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 9, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 10, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["거래처 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 11, "name": "목록으로 돌아가기", "action": "click_if_exists", "target": "button:has-text('목록'), a:has-text('목록'), [class*='back']", "expected": "목록 페이지로 복귀" }, + { "id": 12, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/quality-performance-report.json b/quality-performance-report.json new file mode 100644 index 0000000..ddb3497 --- /dev/null +++ b/quality-performance-report.json @@ -0,0 +1,33 @@ +{ + "id": "quality-performance-report", + "name": "실적신고관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "품질관리 > 실적신고관리 메뉴의 실적 신고 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "품질관리", + "level2": "실적신고관리", + "expectedUrl": "/quality/performance-report", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 품질관리 > 실적신고관리", "action": "menu_navigate", "level1": "품질관리", "level2": "실적신고관리", "expected": { "url_contains": "/quality", "visible": ["실적", "신고"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["목록 또는 폼 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "통계 카드 확인", "action": "evaluate", "script": "(() => { const cards = document.querySelectorAll('[class*=\"card\"], [class*=\"Card\"], [class*=\"stat\"], [class*=\"summary\"]'); return cards.length > 0 ? 'Stats: ' + cards.length + ' cards' : 'No stat cards (ok)'; })()" }, + { "id": 6, "name": "테이블 구조 확인", "action": "verify_table", "checks": ["실적 데이터 컬럼", "신고 상태 컬럼"], "expected": "실적신고 테이블 표시" }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 8, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 9, "phase": "FILTER", "name": "[FILTER] 필터 존재 확인", "action": "evaluate", "script": "(() => { const selects = document.querySelectorAll('select, [role=\"combobox\"], button[class*=\"select\"]'); return selects.length > 0 ? 'Filters: ' + selects.length : 'No filters (ok)'; })()" }, + { "id": 10, "name": "등록/신규 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가','작성'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 11, "name": "페이지네이션 확인", "action": "evaluate", "script": "(() => { const p = document.querySelector('[class*=\"pagination\"], [class*=\"Pagination\"], nav[aria-label*=\"page\"]'); return p ? 'Pagination found' : 'No pagination (ok)'; })()" }, + { "id": 12, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/sales-site-mgmt.json b/sales-site-mgmt.json new file mode 100644 index 0000000..f1fd2ce --- /dev/null +++ b/sales-site-mgmt.json @@ -0,0 +1,33 @@ +{ + "id": "sales-site-mgmt", + "name": "현장관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "판매관리 > 현장관리 메뉴의 현장 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "판매관리", + "level2": "현장관리", + "expectedUrl": "/sales/site", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 판매관리 > 현장관리", "action": "menu_navigate", "level1": "판매관리", "level2": "현장관리", "expected": { "url_contains": "/sales", "visible": ["현장"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["목록 또는 폼 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "현장 테이블 구조 확인", "action": "verify_table", "checks": ["현장 데이터 컬럼"], "expected": "현장 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "name": "등록/추가 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 9, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 10, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["현장 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 11, "name": "목록으로 돌아가기", "action": "click_if_exists", "target": "button:has-text('목록'), a:has-text('목록'), [class*='back']", "expected": "목록 페이지로 복귀" }, + { "id": 12, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/settings-barobill.json b/settings-barobill.json new file mode 100644 index 0000000..60844ba --- /dev/null +++ b/settings-barobill.json @@ -0,0 +1,29 @@ +{ + "id": "settings-barobill", + "name": "바로빌연동관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "설정 > 바로빌연동관리 메뉴의 바로빌 연동 설정 조회/수정 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "설정", + "level2": "바로빌연동관리", + "expectedUrl": "/settings/barobill", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 설정 > 바로빌연동관리", "action": "menu_navigate", "level1": "설정", "level2": "바로빌연동관리", "expected": { "url_contains": "/settings", "visible": ["바로빌"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["설정 폼 또는 연동 상태 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "페이지 구조 확인", "action": "evaluate", "script": "(() => { const inputs = document.querySelectorAll('input:not([type=\"hidden\"]), select, textarea'); const buttons = document.querySelectorAll('button'); return 'Inputs: ' + inputs.length + ', Buttons: ' + buttons.length; })()" }, + { "id": 5, "name": "연동 상태 확인", "action": "verify_detail", "checks": ["연동 상태 또는 설정 정보 표시"], "expected": "바로빌 연동 정보 표시" }, + { "id": 6, "name": "설정 필드 확인", "action": "evaluate", "script": "(() => { const labels = Array.from(document.querySelectorAll('label, [class*=\"label\"]')).map(l => l.innerText?.trim()).filter(Boolean).slice(0, 10); return labels.length > 0 ? 'Fields: ' + labels.join(', ') : 'No labeled fields (ok)'; })()" }, + { "id": 7, "name": "저장/수정 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['저장','수정','연동','설정'].some(t => b.innerText?.includes(t))); return btn ? 'Action button: ' + btn.innerText.trim() : 'No action button (ok)'; })()" }, + { "id": 8, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/settings-calendar.json b/settings-calendar.json new file mode 100644 index 0000000..d2ca612 --- /dev/null +++ b/settings-calendar.json @@ -0,0 +1,29 @@ +{ + "id": "settings-calendar", + "name": "달력관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "설정 > 달력관리 메뉴의 달력/일정 조회/등록 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "설정", + "level2": "달력관리", + "expectedUrl": "/settings/calendar", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 설정 > 달력관리", "action": "menu_navigate", "level1": "설정", "level2": "달력관리", "expected": { "url_contains": "/settings", "visible": ["달력"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["달력 또는 일정 목록 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "달력 UI 확인", "action": "evaluate", "script": "(() => { const cal = document.querySelector('[class*=\"calendar\"], [class*=\"Calendar\"], [class*=\"schedule\"], table'); return cal ? 'Calendar UI found' : 'No calendar UI (check page structure)'; })()" }, + { "id": 5, "name": "페이지 구조 확인", "action": "evaluate", "script": "(() => { const inputs = document.querySelectorAll('input:not([type=\"hidden\"]), select, textarea'); const buttons = document.querySelectorAll('button'); return 'Inputs: ' + inputs.length + ', Buttons: ' + buttons.length; })()" }, + { "id": 6, "name": "일정 등록/추가 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','추가','신규','일정'].some(t => b.innerText?.includes(t))); return btn ? 'Action button: ' + btn.innerText.trim() : 'No action button (ok)'; })()" }, + { "id": 7, "name": "월/주 전환 확인", "action": "evaluate", "script": "(() => { const nav = Array.from(document.querySelectorAll('button')).filter(b => ['이전','다음','월','주','일','today','오늘'].some(t => b.innerText?.includes(t))); return nav.length > 0 ? 'Nav buttons: ' + nav.map(b=>b.innerText.trim()).join(', ') : 'No nav buttons (ok)'; })()" }, + { "id": 8, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/standard-checklist.json b/standard-checklist.json new file mode 100644 index 0000000..b6ab108 --- /dev/null +++ b/standard-checklist.json @@ -0,0 +1,32 @@ +{ + "id": "standard-checklist", + "name": "점검표 관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "기준정보 관리 > 점검표 관리 메뉴의 점검표 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "기준정보 관리", + "level2": "점검표 관리", + "expectedUrl": "/standard/checklist", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 기준정보 관리 > 점검표 관리", "action": "menu_navigate", "level1": "기준정보 관리", "level2": "점검표 관리", "expected": { "url_contains": "/standard", "visible": ["점검표"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["목록 또는 폼 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "점검표 테이블 구조 확인", "action": "verify_table", "checks": ["점검표 데이터 컬럼"], "expected": "점검표 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "name": "등록/추가 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 9, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 10, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["점검표 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 11, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/standard-price-distribute.json b/standard-price-distribute.json new file mode 100644 index 0000000..a845a32 --- /dev/null +++ b/standard-price-distribute.json @@ -0,0 +1,32 @@ +{ + "id": "standard-price-distribute", + "name": "단가배포관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "기준정보 관리 > 단가배포관리 메뉴의 단가 배포 조회/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "기준정보 관리", + "level2": "단가배포관리", + "expectedUrl": "/standard/price-distribute", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 기준정보 관리 > 단가배포관리", "action": "menu_navigate", "level1": "기준정보 관리", "level2": "단가배포관리", "expected": { "url_contains": "/standard", "visible": ["단가", "배포"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["목록 또는 폼 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "단가배포 테이블 구조 확인", "action": "verify_table", "checks": ["배포 데이터 컬럼"], "expected": "단가배포 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "name": "배포 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['배포','등록','신규','추가'].some(t => b.innerText?.includes(t))); return btn ? 'Action button: ' + btn.innerText.trim() : 'No action button (ok)'; })()" }, + { "id": 9, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 10, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["배포 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 11, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/standard-process-mgmt.json b/standard-process-mgmt.json new file mode 100644 index 0000000..f2260ce --- /dev/null +++ b/standard-process-mgmt.json @@ -0,0 +1,33 @@ +{ + "id": "standard-process-mgmt", + "name": "공정관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "기준정보 관리 > 공정관리 메뉴의 공정 조회/등록/검색 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "기준정보 관리", + "level2": "공정관리", + "expectedUrl": "/standard/process", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 기준정보 관리 > 공정관리", "action": "menu_navigate", "level1": "기준정보 관리", "level2": "공정관리", "expected": { "url_contains": "/standard", "visible": ["공정"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["목록 또는 폼 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "통계 카드 확인", "action": "evaluate", "script": "(() => { const cards = document.querySelectorAll('[class*=\"card\"], [class*=\"Card\"], [class*=\"stat\"], [class*=\"summary\"]'); return cards.length > 0 ? 'Stats: ' + cards.length + ' cards' : 'No stat cards (ok)'; })()" }, + { "id": 6, "name": "공정 테이블 구조 확인", "action": "verify_table", "checks": ["공정 데이터 컬럼"], "expected": "공정 테이블 표시" }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 8, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 9, "name": "등록/추가 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 10, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 11, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["공정 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 12, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file diff --git a/standard-unit-price.json b/standard-unit-price.json new file mode 100644 index 0000000..8838843 --- /dev/null +++ b/standard-unit-price.json @@ -0,0 +1,33 @@ +{ + "id": "standard-unit-price", + "name": "단가표관리 테스트", + "screenshotPolicy": { + "onErrorOnly": true, + "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] + }, + "description": "기준정보 관리 > 단가표관리 메뉴의 단가표 조회/검색/필터 기능 테스트", + "baseUrl": "https://dev.codebridge-x.com", + "menuNavigation": { + "level1": "기준정보 관리", + "level2": "단가표관리", + "expectedUrl": "/standard/unit-price", + "searchWithinParent": true, + "closeOtherMenus": true + }, + "auth": { "username": "TestUser5", "password": "password123!" }, + "steps": [ + { "id": 1, "name": "메뉴 진입: 기준정보 관리 > 단가표관리", "action": "menu_navigate", "level1": "기준정보 관리", "level2": "단가표관리", "expected": { "url_contains": "/standard", "visible": ["단가"] } }, + { "id": 2, "name": "페이지 로드 대기", "action": "wait", "timeout": 3000 }, + { "id": 3, "name": "필수 검증: 목업 페이지 감지", "action": "verify_not_mockup", "checks": ["목록 또는 폼 표시", "버튼 동작 가능"], "expected": "정상 페이지 (목업 아님)" }, + { "id": 4, "name": "테이블 로드 대기", "action": "wait_for_table", "timeout": 5000 }, + { "id": 5, "name": "단가표 테이블 구조 확인", "action": "verify_table", "checks": ["단가 데이터 컬럼"], "expected": "단가표 테이블 표시" }, + { "id": 6, "phase": "SEARCH", "name": "[SEARCH] 검색 기능", "action": "fill", "target": "input[type='search'], input[placeholder*='검색']", "value": "테스트", "submit": true }, + { "id": 7, "phase": "SEARCH", "name": "[SEARCH] 검색 결과 확인", "action": "verify_detail", "checks": ["검색 결과 표시 또는 결과 없음 메시지"], "expected": "검색 기능 동작" }, + { "id": 8, "phase": "FILTER", "name": "[FILTER] 필터 존재 확인", "action": "evaluate", "script": "(() => { const selects = document.querySelectorAll('select, [role=\"combobox\"], button[class*=\"select\"]'); return selects.length > 0 ? 'Filters: ' + selects.length : 'No filters (ok)'; })()" }, + { "id": 9, "name": "등록/추가 버튼 확인", "action": "evaluate", "script": "(() => { const btn = Array.from(document.querySelectorAll('button')).find(b => ['등록','신규','추가'].some(t => b.innerText?.includes(t))); return btn ? 'Create button: ' + btn.innerText.trim() : 'No create button (ok)'; })()" }, + { "id": 10, "name": "상세 행 클릭", "action": "click_if_exists", "target": "table tbody tr:first-child", "expected": { "detail_view": true } }, + { "id": 11, "name": "상세 정보 확인", "action": "verify_detail", "checks": ["단가 상세 정보 표시 또는 데이터 없음"], "expected": "상세 정보 표시" }, + { "id": 12, "name": "콘솔 에러 확인", "action": "verify_element", "target": "body" } + ], + "rollbackPlan": { "note": "조회 위주 테스트로 데이터 변경 최소" } +} \ No newline at end of file