refactor: 회계/생산/구매/자재 시나리오 B/A등급 개선

- accounting-ledger, accounting-payment, accounting-daily-report: C→B (조회/필터/다운로드)
- accounting-financial, accounting-cost: C→B (재무제표/원가 조회)
- production-dashboard, production-worker: C→B (현황판/작업자화면)
- production-item, production-work-result: C→A (CRUD 전체)
- purchase-status: C→B (구매현황 조회)
- purchase-client, purchase-pricing: C→A (거래처/단가 CRUD)
- material-stock: C→B (재고현황 조회)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
김보곤
2026-02-03 13:49:08 +09:00
parent 59bf6c48de
commit 5d7482a3e9
13 changed files with 2164 additions and 127 deletions

View File

@@ -5,12 +5,14 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "회계관리 > 원가관리 메뉴의 원가 관리 기능 테스트", "description": "회계관리 > 원가관리 메뉴의 원가 분석/조회/필터/다운로드 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "회계관리", "level1": "회계관리",
"level2": "원가관리", "level2": "원가관리",
"expectedUrl": "/accounting/cost-management" "expectedUrl": "/accounting/cost-management",
"searchWithinParent": true,
"closeOtherMenus": true
}, },
"auth": { "auth": {
"username": "TestUser5", "username": "TestUser5",
@@ -33,26 +35,178 @@
"name": "필수 검증 #5: 목업 페이지 감지", "name": "필수 검증 #5: 목업 페이지 감지",
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"원가 데이터 표시" "원가 데이터 표시 또는 조회 폼",
"기간 선택 가능",
"품목/제품 선택 가능"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "원가 기능 확인", "name": "원가관리 페이지 구조 확인",
"action": "verify_elements", "action": "verify_elements",
"checks": [ "checks": [
"품목/제품 선택",
"기간 선택 (시작일/종료일)",
"조회 버튼",
"원가 테이블 또는 차트" "원가 테이블 또는 차트"
], ],
"expected": "원가 기능 표시" "expected": "원가관리 페이지 정상 표시"
},
{
"id": 4,
"phase": "FILTER",
"name": "[FILTER] 품목/제품 선택",
"action": "click",
"target": "select[name*='item'], select[name*='product'], button:has-text('품목'), input[placeholder*='품목']",
"expected": "품목 선택 옵션 표시"
},
{
"id": 5,
"phase": "FILTER",
"name": "[FILTER] 기간 - 시작일",
"action": "fill",
"target": "input[type='date']:first-of-type, input[name*='start']",
"value": "2025-01-01",
"expected": "시작일 입력"
},
{
"id": 6,
"phase": "FILTER",
"name": "[FILTER] 기간 - 종료일",
"action": "fill",
"target": "input[type='date']:last-of-type, input[name*='end']",
"value": "2025-12-31",
"expected": "종료일 입력"
},
{
"id": 7,
"phase": "FILTER",
"name": "[FILTER] 조회 버튼 클릭",
"action": "click",
"target": "button:has-text('조회'), button:has-text('검색')",
"expected": {
"data_loaded": true,
"api_call": "GET /api/v1/accounting/cost"
}
},
{
"id": 8,
"phase": "READ",
"name": "[READ] 원가 테이블 구조 확인",
"action": "verify_table",
"checks": [
"품목명 컬럼",
"재료비 컬럼",
"노무비 컬럼",
"경비 컬럼",
"합계 컬럼"
],
"expected": "원가 테이블 정상 표시"
},
{
"id": 9,
"name": "원가 데이터 확인",
"action": "verify_detail",
"checks": [
"데이터 행 존재 또는 '데이터 없음' 메시지",
"금액 포맷 정상"
],
"expected": "원가 데이터 표시"
},
{
"id": 10,
"name": "원가 구성 비율 확인",
"action": "verify_elements",
"checks": [
"재료비 비율",
"노무비 비율",
"경비 비율"
],
"expected": "원가 구성 비율 표시"
},
{
"id": 11,
"name": "원가 차트 확인",
"action": "verify_elements",
"checks": [
"원가 추이 차트 또는 구성 차트"
],
"expected": "차트 시각화 표시"
},
{
"id": 12,
"name": "필수 검증 #1: 엑셀 다운로드",
"action": "click",
"target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')",
"critical": true,
"verify": {
"api_call": "GET /api/v1/accounting/cost/export",
"file_download": true
},
"expected": "엑셀 파일 다운로드"
},
{
"id": 13,
"name": "인쇄 기능 확인",
"action": "verify_elements",
"checks": [
"인쇄 버튼 존재"
],
"expected": "인쇄 기능 표시"
},
{
"id": 14,
"name": "원가율 표시 확인",
"action": "verify_detail",
"checks": [
"매출원가율 표시",
"목표 원가율 대비 현황"
],
"expected": "원가율 분석 표시"
},
{
"id": 15,
"name": "기간별 비교 기능",
"action": "verify_elements",
"checks": [
"전월/전년 대비 비교 기능"
],
"expected": "비교 분석 기능 확인"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/accounting/cost",
"description": "원가 데이터 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/accounting/cost/export",
"description": "원가 데이터 엑셀 다운로드"
},
{
"method": "GET",
"endpoint": "/api/v1/products",
"description": "품목 목록 조회"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 1,
"name": "엑셀 다운로드",
"steps": [12],
"criteria": "API 호출 + 파일 다운로드"
},
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "원가 관리 기능 확인" "criteria": "원가 데이터/조회 폼, 기간 선택, 품목 선택 존재"
} }
] ],
"rollbackPlan": {
"note": "조회 전용 페이지로 데이터 변경 없음"
}
} }

View File

@@ -5,12 +5,14 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "회계관리 > 일일 일보 메뉴의 일일 리포트 기능 테스트", "description": "회계관리 > 일일 일보 메뉴의 일일 리포트 조회/날짜선택/인쇄/다운로드 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "회계관리", "level1": "회계관리",
"level2": "일일 일보", "level2": "일일 일보",
"expectedUrl": "/accounting/daily-report" "expectedUrl": "/accounting/daily-report",
"searchWithinParent": true,
"closeOtherMenus": true
}, },
"auth": { "auth": {
"username": "TestUser5", "username": "TestUser5",
@@ -33,27 +35,167 @@
"name": "필수 검증 #5: 목업 페이지 감지", "name": "필수 검증 #5: 목업 페이지 감지",
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"일일 일보 데이터 표시" "일일 일보 리포트 영역 표시",
"날짜 선택 가능",
"조회 기능 존재"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "일일 일보 확인", "name": "일일 일보 페이지 구조 확인",
"action": "verify_elements", "action": "verify_elements",
"checks": [ "checks": [
"날짜 선택", "날짜 선택 (DatePicker)",
"일보 내용" "조회 버튼",
"리포트 표시 영역"
], ],
"expected": "일일 일보 기능 표시" "expected": "일일 일보 페이지 정상 표시"
},
{
"id": 4,
"phase": "READ",
"name": "[READ] 오늘 날짜 일보 확인",
"action": "verify_detail",
"checks": [
"현재 날짜 기준 일보 표시",
"리포트 데이터 또는 '데이터 없음' 메시지"
],
"expected": "오늘 일보 조회"
},
{
"id": 5,
"phase": "FILTER",
"name": "[FILTER] 날짜 선택",
"action": "click",
"target": "input[type='date'], [class*='datepicker'], button:has-text('날짜')",
"expected": "날짜 선택기 열림"
},
{
"id": 6,
"phase": "FILTER",
"name": "[FILTER] 특정 날짜 선택",
"action": "fill",
"target": "input[type='date'], input[name*='date']",
"value": "2025-01-15",
"expected": "날짜 입력"
},
{
"id": 7,
"phase": "FILTER",
"name": "[FILTER] 조회 버튼 클릭",
"action": "click",
"target": "button:has-text('조회'), button:has-text('검색'), button[type='submit']",
"expected": {
"data_loaded": true,
"api_call": "GET /api/v1/accounting/daily-report"
}
},
{
"id": 8,
"phase": "READ",
"name": "[READ] 일보 리포트 내용 확인",
"action": "verify_elements",
"checks": [
"입금 내역 영역",
"출금 내역 영역",
"잔액 현황"
],
"expected": "일보 리포트 상세 표시"
},
{
"id": 9,
"name": "입금 합계 확인",
"action": "verify_detail",
"checks": [
"입금 합계 금액 표시"
],
"expected": "입금 합계 표시"
},
{
"id": 10,
"name": "출금 합계 확인",
"action": "verify_detail",
"checks": [
"출금 합계 금액 표시"
],
"expected": "출금 합계 표시"
},
{
"id": 11,
"name": "잔액 계산 확인",
"action": "verify_detail",
"checks": [
"전일 잔액",
"금일 입금",
"금일 출금",
"금일 잔액"
],
"expected": "잔액 계산 정상"
},
{
"id": 12,
"name": "필수 검증 #1: 인쇄 기능",
"action": "click",
"target": "button:has-text('인쇄'), button:has-text('Print'), button[class*='print']",
"critical": true,
"expected": "인쇄 다이얼로그 표시"
},
{
"id": 13,
"name": "인쇄 창 닫기",
"action": "close_modal_if_open",
"expected": "인쇄 창 닫힘"
},
{
"id": 14,
"name": "엑셀 다운로드",
"action": "click",
"target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')",
"verify": {
"api_call": "GET /api/v1/accounting/daily-report/export",
"file_download": true
},
"expected": "엑셀 파일 다운로드"
},
{
"id": 15,
"name": "이전/다음 날짜 이동",
"action": "verify_elements",
"checks": [
"이전 날짜 버튼 또는 화살표",
"다음 날짜 버튼 또는 화살표"
],
"expected": "날짜 이동 버튼 표시"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/accounting/daily-report",
"description": "일일 일보 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/accounting/daily-report/export",
"description": "일일 일보 엑셀 다운로드"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 1,
"name": "인쇄 기능",
"steps": [12],
"criteria": "인쇄 다이얼로그 표시"
},
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "일일 일보 기능 확인" "criteria": "일보 리포트 영역, 날짜 선택, 조회 기능 존재"
} }
] ],
"rollbackPlan": {
"note": "조회 전용 페이지로 데이터 변경 없음"
}
} }

View File

@@ -5,12 +5,14 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "회계관리 > 재무제표 메뉴의 재무제표 조회 기능 테스트", "description": "회계관리 > 재무제표 메뉴의 재무상태표/손익계산서 조회/기간선택/다운로드 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "회계관리", "level1": "회계관리",
"level2": "재무제표", "level2": "재무제표",
"expectedUrl": "/accounting/financial-statements" "expectedUrl": "/accounting/financial-statements",
"searchWithinParent": true,
"closeOtherMenus": true
}, },
"auth": { "auth": {
"username": "TestUser5", "username": "TestUser5",
@@ -33,26 +35,178 @@
"name": "필수 검증 #5: 목업 페이지 감지", "name": "필수 검증 #5: 목업 페이지 감지",
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"재무제표 데이터 표시" "재무제표 영역 표시",
"기간 선택 가능",
"재무상태표 또는 손익계산서 탭"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "재무제표 기능 확인", "name": "재무제표 페이지 구조 확인",
"action": "verify_elements", "action": "verify_elements",
"checks": [ "checks": [
"손익계산서 또는 재무상태표" "재무상태표 탭/버튼",
"손익계산서 탭/버튼",
"기간 선택 (연도/분기)",
"조회 버튼"
], ],
"expected": "재무제표 기능 표시" "expected": "재무제표 페이지 정상 표시"
},
{
"id": 4,
"phase": "READ",
"name": "[READ] 재무상태표 조회",
"action": "click",
"target": "button:has-text('재무상태표'), [class*='tab']:has-text('재무상태표'), a:has-text('재무상태표')",
"expected": {
"api_call": "GET /api/v1/accounting/financial/balance-sheet"
}
},
{
"id": 5,
"name": "재무상태표 구조 확인",
"action": "verify_elements",
"checks": [
"자산 항목 표시",
"부채 항목 표시",
"자본 항목 표시",
"자산총계 = 부채총계 + 자본총계"
],
"expected": "재무상태표 정상 표시"
},
{
"id": 6,
"phase": "READ",
"name": "[READ] 손익계산서 조회",
"action": "click",
"target": "button:has-text('손익계산서'), [class*='tab']:has-text('손익계산서'), a:has-text('손익계산서')",
"expected": {
"api_call": "GET /api/v1/accounting/financial/income-statement"
}
},
{
"id": 7,
"name": "손익계산서 구조 확인",
"action": "verify_elements",
"checks": [
"매출액 표시",
"매출원가 표시",
"영업이익 표시",
"당기순이익 표시"
],
"expected": "손익계산서 정상 표시"
},
{
"id": 8,
"phase": "FILTER",
"name": "[FILTER] 연도 선택",
"action": "click",
"target": "select[name*='year'], [class*='year'], button:has-text('연도')",
"expected": "연도 선택 옵션 표시"
},
{
"id": 9,
"phase": "FILTER",
"name": "[FILTER] 분기 선택",
"action": "verify_elements",
"checks": [
"1분기/2분기/3분기/4분기 선택 가능"
],
"expected": "분기 선택 가능"
},
{
"id": 10,
"phase": "FILTER",
"name": "[FILTER] 조회 실행",
"action": "click",
"target": "button:has-text('조회'), button:has-text('검색')",
"expected": {
"data_loaded": true
}
},
{
"id": 11,
"name": "전년 동기 대비 확인",
"action": "verify_elements",
"checks": [
"전년 동기 대비 증감 표시 여부"
],
"expected": "비교 분석 기능 확인"
},
{
"id": 12,
"name": "필수 검증 #1: 엑셀 다운로드",
"action": "click",
"target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')",
"critical": true,
"verify": {
"api_call": "GET /api/v1/accounting/financial/export",
"file_download": true
},
"expected": "엑셀 파일 다운로드"
},
{
"id": 13,
"name": "인쇄 기능 확인",
"action": "verify_elements",
"checks": [
"인쇄 버튼 존재"
],
"expected": "인쇄 기능 표시"
},
{
"id": 14,
"name": "PDF 다운로드 확인",
"action": "verify_elements",
"checks": [
"PDF 다운로드 버튼 존재 여부"
],
"expected": "PDF 다운로드 기능 확인"
},
{
"id": 15,
"name": "금액 포맷 확인",
"action": "verify_detail",
"checks": [
"원화 포맷 정상 (천원 또는 원 단위)",
"음수 표시 (괄호 또는 마이너스)"
],
"expected": "금액 표시 정상"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/accounting/financial/balance-sheet",
"description": "재무상태표 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/accounting/financial/income-statement",
"description": "손익계산서 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/accounting/financial/export",
"description": "재무제표 엑셀 다운로드"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 1,
"name": "엑셀 다운로드",
"steps": [12],
"criteria": "API 호출 + 파일 다운로드"
},
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "재무제표 기능 확인" "criteria": "재무제표 영역, 기간 선택, 탭 전환 존재"
} }
] ],
"rollbackPlan": {
"note": "조회 전용 페이지로 데이터 변경 없음"
}
} }

View File

@@ -5,12 +5,14 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "회계관리 > 거래처원장 메뉴의 거래처별 원장 조회 기능 테스트", "description": "회계관리 > 거래처원장 메뉴의 거래처별 원장 조회/필터/검색/다운로드 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "회계관리", "level1": "회계관리",
"level2": "거래처원장", "level2": "거래처원장",
"expectedUrl": "/accounting/vendor-ledger" "expectedUrl": "/accounting/vendor-ledger",
"searchWithinParent": true,
"closeOtherMenus": true
}, },
"auth": { "auth": {
"username": "TestUser5", "username": "TestUser5",
@@ -25,7 +27,7 @@
"level2": "거래처원장", "level2": "거래처원장",
"expected": { "expected": {
"url_contains": "/accounting/vendor-ledger", "url_contains": "/accounting/vendor-ledger",
"visible": ["거래처원장"] "visible": ["거래처원장", "원장"]
} }
}, },
{ {
@@ -33,41 +35,180 @@
"name": "필수 검증 #5: 목업 페이지 감지", "name": "필수 검증 #5: 목업 페이지 감지",
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"원장 목록 표시", "원장 목록 또는 조회 영역 표시",
"거래처 선택 가능" "거래처 선택 가능",
"기간 필터 존재"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "원장 테이블 확인", "name": "거래처원장 페이지 구조 확인",
"action": "verify_table", "action": "verify_elements",
"checks": [ "checks": [
"날짜 컬럼", "거래처 선택 셀렉트박스 또는 검색창",
"거래내역 컬럼", "시작일 날짜 선택",
"차변 컬럼", "종료일 날짜 선택",
"대변 컬럼", "조회 버튼"
"잔액 컬럼"
], ],
"expected": "원장 테이블 표시" "expected": "거래처원장 조회 폼 정상 표시"
}, },
{ {
"id": 4, "id": 4,
"name": "기간 필터 확인", "phase": "READ",
"name": "[READ] 거래처 선택 기능 확인",
"action": "click",
"target": "select[name*='vendor'], input[placeholder*='거래처'], button:has-text('거래처 선택')",
"expected": {
"selectable": true,
"options_visible": true
}
},
{
"id": 5,
"phase": "READ",
"name": "[READ] 거래처 목록에서 선택",
"action": "select_or_click",
"target": "거래처 목록 첫 번째 항목",
"expected": "거래처 선택 완료"
},
{
"id": 6,
"phase": "FILTER",
"name": "[FILTER] 시작일 설정",
"action": "fill",
"target": "input[type='date']:first-of-type, input[name*='start'], input[placeholder*='시작']",
"value": "2025-01-01",
"expected": "시작일 입력"
},
{
"id": 7,
"phase": "FILTER",
"name": "[FILTER] 종료일 설정",
"action": "fill",
"target": "input[type='date']:last-of-type, input[name*='end'], input[placeholder*='종료']",
"value": "2025-12-31",
"expected": "종료일 입력"
},
{
"id": 8,
"phase": "FILTER",
"name": "[FILTER] 조회 버튼 클릭",
"action": "click",
"target": "button:has-text('조회'), button:has-text('검색'), button[type='submit']",
"expected": {
"data_loaded": true,
"api_call": "GET /api/v1/accounting/vendor-ledger"
}
},
{
"id": 9,
"phase": "READ",
"name": "[READ] 원장 테이블 구조 확인",
"action": "verify_table",
"checks": [
"날짜 컬럼 표시",
"거래내역/적요 컬럼 표시",
"차변 컬럼 표시",
"대변 컬럼 표시",
"잔액 컬럼 표시"
],
"expected": "원장 테이블 정상 표시"
},
{
"id": 10,
"phase": "READ",
"name": "[READ] 원장 데이터 표시 확인",
"action": "verify_detail",
"checks": [
"테이블에 데이터 행 존재 또는 '데이터 없음' 메시지",
"금액 포맷 정상 (원화 표시)"
],
"expected": "원장 데이터 정상 표시"
},
{
"id": 11,
"name": "잔액 합계 표시 확인",
"action": "verify_elements", "action": "verify_elements",
"checks": [ "checks": [
"시작일 선택", "차변 합계 표시",
"종료일 선택" "대변 합계 표시",
"잔액 합계 표시"
], ],
"expected": "기간 필터 표시" "expected": "합계 영역 표시"
},
{
"id": 12,
"name": "필수 검증 #1: 엑셀 다운로드",
"action": "click",
"target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드'), button:has-text('내보내기')",
"critical": true,
"verify": {
"api_call": "GET /api/v1/accounting/vendor-ledger/export",
"file_download": true
},
"expected": "엑셀 파일 다운로드"
},
{
"id": 13,
"name": "인쇄 버튼 확인",
"action": "verify_elements",
"checks": [
"인쇄 버튼 존재"
],
"expected": "인쇄 기능 표시"
},
{
"id": 14,
"name": "기간별 원장 조회 테스트",
"action": "verify_elements",
"checks": [
"월별/분기별 조회 가능 여부"
],
"expected": "기간별 조회 기능 확인"
},
{
"id": 15,
"name": "거래처 변경 후 재조회",
"action": "verify_detail",
"checks": [
"다른 거래처 선택 시 데이터 변경"
],
"expected": "거래처별 원장 조회 정상"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/vendors",
"description": "거래처 목록 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/accounting/vendor-ledger",
"description": "거래처원장 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/accounting/vendor-ledger/export",
"description": "거래처원장 엑셀 다운로드"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 1,
"name": "엑셀 다운로드",
"steps": [12],
"criteria": "API 호출 + 파일 다운로드"
},
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "원장 목록 확인" "criteria": "원장 조회 영역, 거래처 선택, 기간 필터 존재"
} }
] ],
"rollbackPlan": {
"note": "조회 전용 페이지로 데이터 변경 없음"
}
} }

View File

@@ -5,12 +5,14 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "회계관리 > 결제내역 메뉴의 결제 내역 조회 기능 테스트", "description": "회계관리 > 결제내역 메뉴의 결제 내역 조회/필터/검색/다운로드 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "회계관리", "level1": "회계관리",
"level2": "결제내역", "level2": "결제내역",
"expectedUrl": "/payment-history" "expectedUrl": "/payment-history",
"searchWithinParent": true,
"closeOtherMenus": true
}, },
"auth": { "auth": {
"username": "TestUser5", "username": "TestUser5",
@@ -33,29 +35,178 @@
"name": "필수 검증 #5: 목업 페이지 감지", "name": "필수 검증 #5: 목업 페이지 감지",
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"결제 내역 목록 표시" "결제 내역 목록 표시",
"기간 필터 존재",
"검색 기능 존재"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "결제 테이블 확인", "name": "결제내역 페이지 구조 확인",
"action": "verify_elements",
"checks": [
"시작일 선택",
"종료일 선택",
"결제방법 필터",
"조회 버튼"
],
"expected": "결제내역 조회 폼 정상 표시"
},
{
"id": 4,
"phase": "FILTER",
"name": "[FILTER] 기간 필터 - 시작일",
"action": "fill",
"target": "input[type='date']:first-of-type, input[name*='start']",
"value": "2025-01-01",
"expected": "시작일 입력"
},
{
"id": 5,
"phase": "FILTER",
"name": "[FILTER] 기간 필터 - 종료일",
"action": "fill",
"target": "input[type='date']:last-of-type, input[name*='end']",
"value": "2025-12-31",
"expected": "종료일 입력"
},
{
"id": 6,
"phase": "FILTER",
"name": "[FILTER] 조회 버튼 클릭",
"action": "click",
"target": "button:has-text('조회'), button:has-text('검색')",
"expected": {
"data_loaded": true,
"api_call": "GET /api/v1/payments"
}
},
{
"id": 7,
"phase": "READ",
"name": "[READ] 결제 테이블 구조 확인",
"action": "verify_table", "action": "verify_table",
"checks": [ "checks": [
"결제일 컬럼", "결제일 컬럼 표시",
"결제금액 컬럼", "결제금액 컬럼 표시",
"결제방법 컬럼", "결제방법 컬럼 표시",
"상태 컬럼" "상태 컬럼 표시"
], ],
"expected": "결제 테이블 표시" "expected": "결제 테이블 정상 표시"
},
{
"id": 8,
"phase": "READ",
"name": "[READ] 결제 데이터 표시 확인",
"action": "verify_detail",
"checks": [
"테이블에 데이터 행 존재 또는 '데이터 없음' 메시지",
"금액 포맷 정상"
],
"expected": "결제 데이터 정상 표시"
},
{
"id": 9,
"phase": "FILTER",
"name": "[FILTER] 결제방법 필터 테스트",
"action": "click",
"target": "select[name*='method'], button:has-text('결제방법'), [class*='filter']:has-text('방법')",
"expected": "결제방법 필터 옵션 표시"
},
{
"id": 10,
"phase": "FILTER",
"name": "[FILTER] 상태 필터 테스트",
"action": "verify_elements",
"checks": [
"완료/취소/대기 등 상태 필터 가능"
],
"expected": "상태 필터 기능 확인"
},
{
"id": 11,
"phase": "READ",
"name": "[READ] 결제 상세 조회",
"action": "click",
"target": "table tbody tr:first-child, [class*='list'] [class*='item']:first-child",
"expected": {
"detail_view": true
}
},
{
"id": 12,
"name": "결제 상세 정보 확인",
"action": "verify_detail",
"checks": [
"결제일시 상세",
"결제금액 상세",
"결제방법 상세",
"거래번호/승인번호"
],
"expected": "결제 상세 정보 표시"
},
{
"id": 13,
"name": "목록으로 돌아가기",
"action": "click_if_exists",
"target": "button:has-text('목록'), button:has-text('뒤로'), [class*='back']",
"expected": "목록 페이지로 복귀"
},
{
"id": 14,
"name": "필수 검증 #1: 엑셀 다운로드",
"action": "click",
"target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')",
"critical": true,
"verify": {
"api_call": "GET /api/v1/payments/export",
"file_download": true
},
"expected": "엑셀 파일 다운로드"
},
{
"id": 15,
"name": "합계 금액 표시 확인",
"action": "verify_elements",
"checks": [
"총 결제금액 합계 표시"
],
"expected": "합계 영역 표시"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/payments",
"description": "결제내역 목록 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/payments/:id",
"description": "결제 상세 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/payments/export",
"description": "결제내역 엑셀 다운로드"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 1,
"name": "엑셀 다운로드",
"steps": [14],
"criteria": "API 호출 + 파일 다운로드"
},
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "결제 내역 확인" "criteria": "결제 내역 목록, 기간 필터, 검색 기능 존재"
} }
] ],
"rollbackPlan": {
"note": "조회 전용 페이지로 데이터 변경 없음"
}
} }

View File

@@ -5,12 +5,14 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "자재관리 > 재고현황 메뉴의 재고 현황 조회 기능 테스트", "description": "자재관리 > 재고현황 메뉴의 재고 현황 조회/검색/필터/다운로드 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "자재관리", "level1": "자재관리",
"level2": "재고현황", "level2": "재고현황",
"expectedUrl": "/material/stock-status" "expectedUrl": "/material/stock-status",
"searchWithinParent": true,
"closeOtherMenus": true
}, },
"auth": { "auth": {
"username": "TestUser5", "username": "TestUser5",
@@ -34,49 +36,178 @@
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"재고 목록 표시", "재고 목록 표시",
"검색 기능 존재" "검색 기능 존재",
"필터 존재"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "재고 테이블 확인", "name": "재고현황 테이블 구조 확인",
"action": "verify_table", "action": "verify_table",
"checks": [ "checks": [
"품목 컬럼", "품목코드 컬럼",
"품목명 컬럼",
"현재고 컬럼", "현재고 컬럼",
"안전재고 컬럼" "안전재고 컬럼",
"위치/창고 컬럼"
], ],
"expected": "재고 테이블 표시" "expected": "재고 테이블 표시"
}, },
{ {
"id": 4, "id": 4,
"name": "검색 기능 테스트", "phase": "READ",
"action": "fill", "name": "[READ] 재고 데이터 확인",
"target": "input[placeholder*='검색']", "action": "verify_detail",
"value": "테스트", "checks": [
"expected": "검색어 입력됨" "재고 데이터 행 존재 또는 '데이터 없음' 메시지"
],
"expected": "재고 데이터 표시"
}, },
{ {
"id": 5, "id": 5,
"name": "검색 초기화", "phase": "SEARCH",
"action": "clear", "name": "[SEARCH] 품목 검색",
"target": "input[placeholder*='검색']", "action": "fill",
"expected": "검색어 삭제" "target": "input[type='search'], input[placeholder*='검색']",
"value": "테스트",
"submit": true
},
{
"id": 6,
"phase": "SEARCH",
"name": "[SEARCH] 검색 결과 확인",
"action": "verify_detail",
"checks": [
"검색 결과 표시 또는 결과 없음 메시지"
],
"expected": "검색 기능 동작"
},
{
"id": 7,
"phase": "SEARCH",
"name": "[SEARCH] 검색 초기화",
"action": "click",
"target": "button:has-text('초기화'), button:has-text('리셋'), button[class*='clear']",
"expected": "검색 초기화"
},
{
"id": 8,
"phase": "FILTER",
"name": "[FILTER] 창고/위치 필터",
"action": "click",
"target": "select[name*='warehouse'], select[name*='location'], button:has-text('창고')",
"expected": "창고 필터 옵션 표시"
},
{
"id": 9,
"phase": "FILTER",
"name": "[FILTER] 재고 상태 필터",
"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": "요약 정보 표시"
},
{
"id": 13,
"name": "필수 검증 #1: 엑셀 다운로드",
"action": "click",
"target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')",
"critical": true,
"verify": {
"api_call": "GET /api/v1/material/stock/export",
"file_download": true
},
"expected": "엑셀 파일 다운로드"
},
{
"id": 14,
"name": "인쇄 기능 확인",
"action": "verify_elements",
"checks": [
"인쇄 버튼 존재"
],
"expected": "인쇄 기능 표시"
},
{
"id": 15,
"name": "재고 조정 버튼 확인",
"action": "verify_elements",
"checks": [
"재고 조정 버튼 존재 여부"
],
"expected": "재고 조정 기능 확인"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/material/stock",
"description": "재고현황 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/material/stock/export",
"description": "재고현황 엑셀 다운로드"
},
{
"method": "GET",
"endpoint": "/api/v1/material/warehouses",
"description": "창고 목록 조회"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 1,
"name": "엑셀 다운로드",
"steps": [13],
"criteria": "API 호출 + 파일 다운로드"
},
{ {
"id": 3, "id": 3,
"name": "검색/필터", "name": "검색/필터",
"steps": [4, 5], "steps": [5, 6, 7],
"criteria": "검색 기능 확인" "criteria": "검색 + 필터 기능 동작"
}, },
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "재고 목록 확인" "criteria": "재고 목록, 검색 기능, 필터 존재"
} }
] ],
"rollbackPlan": {
"note": "조회 전용 페이지로 데이터 변경 없음"
}
} }

View File

@@ -5,12 +5,14 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "생산관리 > 생산 현황판 메뉴의 생산 현황 모니터링 기능 테스트", "description": "생산관리 > 생산 현황판 메뉴의 생산 현황 모니터링/필터/차트 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "생산관리", "level1": "생산관리",
"level2": "생산 현황판", "level2": "생산 현황판",
"expectedUrl": "/production/dashboard" "expectedUrl": "/production/dashboard",
"searchWithinParent": true,
"closeOtherMenus": true
}, },
"auth": { "auth": {
"username": "TestUser5", "username": "TestUser5",
@@ -33,19 +35,126 @@
"name": "필수 검증 #5: 목업 페이지 감지", "name": "필수 검증 #5: 목업 페이지 감지",
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"생산 현황 데이터 표시" "생산 현황 데이터 표시",
"통계 카드 또는 차트 존재",
"기간 필터 존재"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "현황판 기능 확인", "name": "현황판 구조 확인",
"action": "verify_elements", "action": "verify_elements",
"checks": [ "checks": [
"생산 통계", "생산 통계 카드",
"현황 차트 또는 테이블" "현황 차트",
"기간 선택 필터",
"라인/공정별 필터"
], ],
"expected": "현황판 기능 표시" "expected": "현황판 구조 정상 표시"
},
{
"id": 4,
"phase": "READ",
"name": "[READ] 생산 통계 카드 확인",
"action": "verify_detail",
"checks": [
"오늘 생산량",
"목표 대비 달성률",
"불량률"
],
"expected": "생산 통계 표시"
},
{
"id": 5,
"phase": "READ",
"name": "[READ] 생산 추이 차트 확인",
"action": "verify_elements",
"checks": [
"일별/주별/월별 생산 추이 차트",
"차트 데이터 표시"
],
"expected": "생산 추이 차트 표시"
},
{
"id": 6,
"phase": "FILTER",
"name": "[FILTER] 기간 필터 테스트",
"action": "click",
"target": "select[name*='period'], button:has-text('기간'), [class*='filter']",
"expected": "기간 필터 옵션 표시"
},
{
"id": 7,
"phase": "FILTER",
"name": "[FILTER] 라인/공정별 필터",
"action": "verify_elements",
"checks": [
"생산라인 선택 가능",
"공정별 필터 가능"
],
"expected": "라인/공정 필터 표시"
},
{
"id": 8,
"name": "실시간 현황 표시",
"action": "verify_elements",
"checks": [
"현재 가동 라인",
"실시간 생산량 또는 마지막 갱신 시간"
],
"expected": "실시간 현황 표시"
},
{
"id": 9,
"name": "불량률 현황 확인",
"action": "verify_detail",
"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/production/dashboard",
"description": "생산 현황판 데이터 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/production/statistics",
"description": "생산 통계 조회"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
@@ -53,7 +162,10 @@
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "생산 현황 기능 확인" "criteria": "생산 현황 데이터, 통계 카드/차트, 기간 필터 존재"
} }
] ],
"rollbackPlan": {
"note": "조회 전용 페이지로 데이터 변경 없음"
}
} }

View File

@@ -5,7 +5,7 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "품목관리 > 품목기준관리 메뉴의 품목 조회/관리 기능 테스트", "description": "품목관리 > 품목기준관리 메뉴의 품목 CRUD 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "품목관리", "level1": "품목관리",
@@ -18,6 +18,14 @@
"username": "TestUser5", "username": "TestUser5",
"password": "password123!" "password": "password123!"
}, },
"testData": {
"create": {
"itemCode": "E2E_TEST_ITEM_{timestamp}",
"itemName": "E2E_TEST_품목_{timestamp}",
"spec": "테스트 규격",
"unit": "EA"
}
},
"steps": [ "steps": [
{ {
"id": 1, "id": 1,
@@ -26,7 +34,7 @@
"level1": "품목관리", "level1": "품목관리",
"level2": "품목기준관리", "level2": "품목기준관리",
"expected": { "expected": {
"url_contains": "/production", "url_contains": "/master-data",
"visible": ["품목기준관리", "품목"] "visible": ["품목기준관리", "품목"]
} }
}, },
@@ -36,28 +44,217 @@
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"품목 목록 표시", "품목 목록 표시",
"품목 등록 버튼 존재" "품목 등록 버튼 존재",
"검색 기능 존재"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "품목 테이블 확인", "name": "품목 테이블 구조 확인",
"action": "verify_table", "action": "verify_table",
"checks": [ "checks": [
"품목코드 컬럼", "품목코드 컬럼",
"품목명 컬럼", "품목명 컬럼",
"규격 컬럼" "규격 컬럼",
"단위 컬럼"
], ],
"expected": "품목 테이블 표시" "expected": "품목 테이블 표시"
},
{
"id": 4,
"phase": "CREATE",
"name": "[CREATE] 품목 등록 버튼 클릭",
"action": "click",
"target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')",
"expected": {
"modal_open": true
}
},
{
"id": 5,
"phase": "CREATE",
"name": "[CREATE] 품목코드 입력",
"action": "fill",
"target": "input[name*='code'], input[placeholder*='코드']",
"value": "E2E_TEST_ITEM_{timestamp}",
"clear": true
},
{
"id": 6,
"phase": "CREATE",
"name": "[CREATE] 품목명 입력",
"action": "fill",
"target": "input[name*='name'], input[placeholder*='품목명']",
"value": "E2E_TEST_품목_{timestamp}",
"clear": true
},
{
"id": 7,
"phase": "CREATE",
"name": "[CREATE] 규격 입력",
"action": "fill",
"target": "input[name*='spec'], input[placeholder*='규격']",
"value": "테스트 규격",
"clear": true
},
{
"id": 8,
"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/items",
"toast": "등록|저장|완료|성공"
},
"expected": "품목 등록 완료"
},
{
"id": 9,
"phase": "READ",
"name": "[READ] 등록된 품목 검색",
"action": "fill",
"target": "input[type='search'], input[placeholder*='검색']",
"value": "E2E_TEST_품목",
"submit": true
},
{
"id": 10,
"phase": "READ",
"name": "[READ] 등록된 품목 확인",
"action": "verify_detail",
"checks": [
"E2E_TEST_품목 목록에 표시"
],
"expected": "등록된 품목 확인"
},
{
"id": 11,
"phase": "READ",
"name": "[READ] 품목 상세 조회",
"action": "click",
"target": "table tbody tr:has-text('E2E_TEST')",
"expected": {
"detail_view": true
}
},
{
"id": 12,
"phase": "UPDATE",
"name": "[UPDATE] 품목 수정 모드 진입",
"action": "click",
"target": "button:has-text('수정'), button:has-text('편집')",
"expected": {
"edit_mode": true
}
},
{
"id": 13,
"phase": "UPDATE",
"name": "[UPDATE] 규격 수정",
"action": "fill",
"target": "input[name*='spec'], input[placeholder*='규격']",
"value": "수정된 규격",
"clear": true
},
{
"id": 14,
"phase": "UPDATE",
"name": "[UPDATE] 품목 저장",
"action": "click",
"target": "button:has-text('저장'), button:has-text('확인')",
"verify": {
"api_call": "PUT /api/v1/items",
"toast": "수정|저장|완료|성공"
},
"expected": "품목 수정 완료"
},
{
"id": 15,
"phase": "DELETE",
"name": "[DELETE] 품목 삭제",
"action": "click",
"target": "button:has-text('삭제'), button:has-text('제거')",
"expected": {
"confirm_dialog": true
}
},
{
"id": 16,
"phase": "DELETE",
"name": "[DELETE] 삭제 확인",
"action": "click",
"target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')",
"verify": {
"api_call": "DELETE /api/v1/items",
"toast": "삭제|제거|완료|성공"
},
"expected": "품목 삭제 완료"
},
{
"id": 17,
"phase": "DELETE",
"name": "[DELETE] 삭제 확인",
"action": "verify_detail",
"checks": [
"E2E_TEST_품목 목록에서 제거"
],
"expected": "품목 삭제 반영"
},
{
"id": 18,
"name": "엑셀 다운로드 확인",
"action": "verify_elements",
"checks": [
"엑셀 다운로드 버튼 존재"
],
"expected": "엑셀 다운로드 기능 표시"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/items",
"description": "품목 목록 조회"
},
{
"method": "POST",
"endpoint": "/api/v1/items",
"description": "품목 등록"
},
{
"method": "PUT",
"endpoint": "/api/v1/items/:id",
"description": "품목 수정"
},
{
"method": "DELETE",
"endpoint": "/api/v1/items/:id",
"description": "품목 삭제"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 2,
"name": "저장 버튼",
"steps": [8, 14],
"criteria": "API 호출 + 성공 토스트 + 데이터 반영"
},
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "품목 목록 확인" "criteria": "품목 목록, 등록 버튼, 검색 기능 존재"
} }
] ],
"rollbackPlan": {
"onCreateFail": "등록 모달 닫고 재시도",
"onUpdateFail": "페이지 새로고침 후 재시도",
"onDeleteFail": "수동 삭제 필요",
"cleanupRequired": "E2E_TEST_ITEM_* 패턴 데이터 삭제"
}
} }

View File

@@ -5,17 +5,26 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "생산관리 > 작업실적 메뉴의 작업 실적 조회/등록 기능 테스트", "description": "생산관리 > 작업실적 메뉴의 작업 실적 CRUD 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "생산관리", "level1": "생산관리",
"level2": "작업실적", "level2": "작업실적",
"expectedUrl": "/production/work-results" "expectedUrl": "/production/work-results",
"searchWithinParent": true,
"closeOtherMenus": true
}, },
"auth": { "auth": {
"username": "TestUser5", "username": "TestUser5",
"password": "password123!" "password": "password123!"
}, },
"testData": {
"create": {
"description": "E2E_TEST_실적_{timestamp}",
"quantity": "100",
"defectQty": "5"
}
},
"steps": [ "steps": [
{ {
"id": 1, "id": 1,
@@ -34,29 +43,215 @@
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"작업실적 목록 표시", "작업실적 목록 표시",
"실적 등록 버튼 존재" "실적 등록 버튼 존재",
"기간 필터 존재"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "작업실적 테이블 확인", "name": "작업실적 테이블 구조 확인",
"action": "verify_table", "action": "verify_table",
"checks": [ "checks": [
"작업일 컬럼", "작업일 컬럼",
"품목 컬럼", "품목 컬럼",
"수량 컬럼", "지시 수량 컬럼",
"실적 수량 컬럼",
"작업자 컬럼" "작업자 컬럼"
], ],
"expected": "작업실적 테이블 표시" "expected": "작업실적 테이블 표시"
},
{
"id": 4,
"phase": "FILTER",
"name": "[FILTER] 기간 필터 - 시작일",
"action": "fill",
"target": "input[type='date']:first-of-type, input[name*='start']",
"value": "2025-01-01"
},
{
"id": 5,
"phase": "FILTER",
"name": "[FILTER] 기간 필터 - 종료일",
"action": "fill",
"target": "input[type='date']:last-of-type, input[name*='end']",
"value": "2025-12-31"
},
{
"id": 6,
"phase": "FILTER",
"name": "[FILTER] 조회 실행",
"action": "click",
"target": "button:has-text('조회'), button:has-text('검색')",
"expected": {
"api_call": "GET /api/v1/production/work-results"
}
},
{
"id": 7,
"phase": "CREATE",
"name": "[CREATE] 실적 등록 버튼 클릭",
"action": "click",
"target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')",
"expected": {
"modal_open": true
}
},
{
"id": 8,
"phase": "CREATE",
"name": "[CREATE] 작업 지시 선택",
"action": "click",
"target": "select[name*='order'], button:has-text('작업지시'), input[placeholder*='작업지시']",
"expected": "작업 지시 선택 가능"
},
{
"id": 9,
"phase": "CREATE",
"name": "[CREATE] 생산 수량 입력",
"action": "fill",
"target": "input[name*='quantity'], input[name*='qty'], input[placeholder*='수량']",
"value": "100",
"clear": true
},
{
"id": 10,
"phase": "CREATE",
"name": "[CREATE] 불량 수량 입력",
"action": "fill",
"target": "input[name*='defect'], input[placeholder*='불량']",
"value": "5",
"clear": true
},
{
"id": 11,
"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/production/work-results",
"toast": "등록|저장|완료|성공"
},
"expected": "실적 등록 완료"
},
{
"id": 12,
"phase": "READ",
"name": "[READ] 등록된 실적 확인",
"action": "verify_detail",
"checks": [
"등록한 실적 목록에 표시"
],
"expected": "등록된 실적 확인"
},
{
"id": 13,
"phase": "READ",
"name": "[READ] 실적 상세 조회",
"action": "click",
"target": "table tbody tr:first-child",
"expected": {
"detail_view": true
}
},
{
"id": 14,
"name": "실적 상세 정보 확인",
"action": "verify_detail",
"checks": [
"작업일시",
"품목 정보",
"생산 수량",
"불량 수량",
"작업자 정보"
],
"expected": "실적 상세 정보 표시"
},
{
"id": 15,
"phase": "UPDATE",
"name": "[UPDATE] 실적 수정",
"action": "click",
"target": "button:has-text('수정'), button:has-text('편집')",
"expected": {
"edit_mode": true
}
},
{
"id": 16,
"phase": "UPDATE",
"name": "[UPDATE] 수량 수정",
"action": "fill",
"target": "input[name*='quantity'], input[name*='qty']",
"value": "95",
"clear": true
},
{
"id": 17,
"phase": "UPDATE",
"name": "[UPDATE] 수정 저장",
"action": "click",
"target": "button:has-text('저장'), button:has-text('확인')",
"verify": {
"api_call": "PUT /api/v1/production/work-results",
"toast": "수정|저장|완료|성공"
},
"expected": "실적 수정 완료"
},
{
"id": 18,
"name": "엑셀 다운로드 확인",
"action": "click",
"target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')",
"verify": {
"file_download": true
},
"expected": "엑셀 파일 다운로드"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/production/work-results",
"description": "작업실적 목록 조회"
},
{
"method": "POST",
"endpoint": "/api/v1/production/work-results",
"description": "작업실적 등록"
},
{
"method": "PUT",
"endpoint": "/api/v1/production/work-results/:id",
"description": "작업실적 수정"
},
{
"method": "GET",
"endpoint": "/api/v1/production/work-results/export",
"description": "작업실적 엑셀 다운로드"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 2,
"name": "저장 버튼",
"steps": [11, 17],
"criteria": "API 호출 + 성공 토스트 + 데이터 반영"
},
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "작업실적 목록 확인" "criteria": "작업실적 목록, 등록 버튼, 기간 필터 존재"
} }
] ],
"rollbackPlan": {
"onCreateFail": "등록 모달 닫고 재시도",
"onUpdateFail": "페이지 새로고침 후 재시도",
"note": "작업실적은 작업지시와 연관되어 있어 주의 필요"
}
} }

View File

@@ -5,12 +5,14 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "생산관리 > 작업자 화면 메뉴의 작업자용 화면 기능 테스트", "description": "생산관리 > 작업자 화면 메뉴의 작업 조회/실적 입력 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "생산관리", "level1": "생산관리",
"level2": "작업자 화면", "level2": "작업자 화면",
"expectedUrl": "/production/worker-screen" "expectedUrl": "/production/worker-screen",
"searchWithinParent": true,
"closeOtherMenus": true
}, },
"auth": { "auth": {
"username": "TestUser5", "username": "TestUser5",
@@ -33,18 +35,134 @@
"name": "필수 검증 #5: 목업 페이지 감지", "name": "필수 검증 #5: 목업 페이지 감지",
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"작업자 화면 표시" "작업자 화면 표시",
"작업 목록 또는 작업 선택",
"실적 입력 가능"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "작업자 화면 기능 확인", "name": "작업자 화면 구조 확인",
"action": "verify_elements", "action": "verify_elements",
"checks": [ "checks": [
"작업 목록 또는 작업 입력" "오늘 작업 목록",
"작업 지시 정보",
"실적 입력 영역",
"완료 버튼"
], ],
"expected": "작업자 화면 기능 표시" "expected": "작업자 화면 구조 정상 표시"
},
{
"id": 4,
"phase": "READ",
"name": "[READ] 오늘 작업 목록 확인",
"action": "verify_detail",
"checks": [
"할당된 작업 표시",
"작업 지시 번호",
"품목 정보"
],
"expected": "오늘 작업 목록 표시"
},
{
"id": 5,
"phase": "READ",
"name": "[READ] 작업 지시 상세 확인",
"action": "click",
"target": "table tbody tr:first-child, [class*='list'] [class*='item']:first-child",
"expected": {
"detail_view": true
}
},
{
"id": 6,
"name": "작업 지시 상세 정보",
"action": "verify_detail",
"checks": [
"작업 지시 번호",
"품목명/규격",
"지시 수량",
"시작/종료 예정 시간"
],
"expected": "작업 지시 상세 표시"
},
{
"id": 7,
"name": "실적 입력 영역 확인",
"action": "verify_elements",
"checks": [
"생산 수량 입력",
"불량 수량 입력",
"작업 시간 입력"
],
"expected": "실적 입력 필드 표시"
},
{
"id": 8,
"name": "작업 상태 변경 버튼",
"action": "verify_elements",
"checks": [
"작업 시작 버튼",
"작업 완료 버튼",
"일시정지 버튼"
],
"expected": "상태 변경 버튼 표시"
},
{
"id": 9,
"name": "실시간 생산량 표시",
"action": "verify_detail",
"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/production/worker/tasks",
"description": "작업자 할당 작업 조회"
},
{
"method": "POST",
"endpoint": "/api/v1/production/work-results",
"description": "작업 실적 등록"
},
{
"method": "PUT",
"endpoint": "/api/v1/production/tasks/:id/status",
"description": "작업 상태 변경"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
@@ -52,7 +170,10 @@
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "작업자 화면 기능 확인" "criteria": "작업자 화면, 작업 목록, 실적 입력 기능 존재"
} }
] ],
"rollbackPlan": {
"note": "실적 입력 테스트는 실제 데이터에 영향을 줄 수 있으므로 주의"
}
} }

View File

@@ -5,7 +5,7 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "구매관리 > 거래처관리 메뉴의 구매 거래처 조회/관리 기능 테스트", "description": "구매관리 > 거래처관리 메뉴의 구매 거래처 CRUD 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "구매관리", "level1": "구매관리",
@@ -18,6 +18,13 @@
"username": "TestUser5", "username": "TestUser5",
"password": "password123!" "password": "password123!"
}, },
"testData": {
"create": {
"supplierName": "E2E_TEST_구매처_{timestamp}",
"businessNumber": "123-45-67890",
"representative": "테스트 대표"
}
},
"steps": [ "steps": [
{ {
"id": 1, "id": 1,
@@ -36,27 +43,217 @@
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"거래처 목록 표시", "거래처 목록 표시",
"거래처 등록 버튼 존재" "거래처 등록 버튼 존재",
"검색 기능 존재"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "거래처 테이블 확인", "name": "거래처 테이블 구조 확인",
"action": "verify_table", "action": "verify_table",
"checks": [ "checks": [
"거래처명 컬럼", "거래처명 컬럼",
"사업자번호 컬럼" "사업자번호 컬럼",
"대표자 컬럼",
"연락처 컬럼"
], ],
"expected": "거래처 테이블 표시" "expected": "거래처 테이블 표시"
},
{
"id": 4,
"phase": "CREATE",
"name": "[CREATE] 거래처 등록 버튼 클릭",
"action": "click",
"target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')",
"expected": {
"modal_open": true
}
},
{
"id": 5,
"phase": "CREATE",
"name": "[CREATE] 거래처명 입력",
"action": "fill",
"target": "input[name*='name'], input[placeholder*='거래처명']",
"value": "E2E_TEST_구매처_{timestamp}",
"clear": true
},
{
"id": 6,
"phase": "CREATE",
"name": "[CREATE] 사업자번호 입력",
"action": "fill",
"target": "input[name*='business'], input[placeholder*='사업자']",
"value": "123-45-67890",
"clear": true
},
{
"id": 7,
"phase": "CREATE",
"name": "[CREATE] 대표자명 입력",
"action": "fill",
"target": "input[name*='representative'], input[placeholder*='대표']",
"value": "테스트 대표",
"clear": true
},
{
"id": 8,
"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/purchase/suppliers",
"toast": "등록|저장|완료|성공"
},
"expected": "거래처 등록 완료"
},
{
"id": 9,
"phase": "READ",
"name": "[READ] 등록된 거래처 검색",
"action": "fill",
"target": "input[type='search'], input[placeholder*='검색']",
"value": "E2E_TEST_구매처",
"submit": true
},
{
"id": 10,
"phase": "READ",
"name": "[READ] 등록된 거래처 확인",
"action": "verify_detail",
"checks": [
"E2E_TEST_구매처 목록에 표시"
],
"expected": "등록된 거래처 확인"
},
{
"id": 11,
"phase": "READ",
"name": "[READ] 거래처 상세 조회",
"action": "click",
"target": "table tbody tr:has-text('E2E_TEST')",
"expected": {
"detail_view": true
}
},
{
"id": 12,
"phase": "UPDATE",
"name": "[UPDATE] 거래처 수정 모드 진입",
"action": "click",
"target": "button:has-text('수정'), button:has-text('편집')",
"expected": {
"edit_mode": true
}
},
{
"id": 13,
"phase": "UPDATE",
"name": "[UPDATE] 대표자명 수정",
"action": "fill",
"target": "input[name*='representative'], input[placeholder*='대표']",
"value": "수정된 대표",
"clear": true
},
{
"id": 14,
"phase": "UPDATE",
"name": "[UPDATE] 거래처 저장",
"action": "click",
"target": "button:has-text('저장'), button:has-text('확인')",
"verify": {
"api_call": "PUT /api/v1/purchase/suppliers",
"toast": "수정|저장|완료|성공"
},
"expected": "거래처 수정 완료"
},
{
"id": 15,
"phase": "DELETE",
"name": "[DELETE] 거래처 삭제",
"action": "click",
"target": "button:has-text('삭제'), button:has-text('제거')",
"expected": {
"confirm_dialog": true
}
},
{
"id": 16,
"phase": "DELETE",
"name": "[DELETE] 삭제 확인",
"action": "click",
"target": "[role='alertdialog'] button:has-text('확인'), [role='dialog'] button:has-text('삭제')",
"verify": {
"api_call": "DELETE /api/v1/purchase/suppliers",
"toast": "삭제|제거|완료|성공"
},
"expected": "거래처 삭제 완료"
},
{
"id": 17,
"phase": "DELETE",
"name": "[DELETE] 삭제 확인",
"action": "verify_detail",
"checks": [
"E2E_TEST_구매처 목록에서 제거"
],
"expected": "거래처 삭제 반영"
},
{
"id": 18,
"name": "엑셀 다운로드 확인",
"action": "verify_elements",
"checks": [
"엑셀 다운로드 버튼 존재"
],
"expected": "엑셀 다운로드 기능 표시"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/purchase/suppliers",
"description": "거래처 목록 조회"
},
{
"method": "POST",
"endpoint": "/api/v1/purchase/suppliers",
"description": "거래처 등록"
},
{
"method": "PUT",
"endpoint": "/api/v1/purchase/suppliers/:id",
"description": "거래처 수정"
},
{
"method": "DELETE",
"endpoint": "/api/v1/purchase/suppliers/:id",
"description": "거래처 삭제"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 2,
"name": "저장 버튼",
"steps": [8, 14],
"criteria": "API 호출 + 성공 토스트 + 데이터 반영"
},
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "거래처 목록 확인" "criteria": "거래처 목록, 등록 버튼, 검색 기능 존재"
} }
] ],
"rollbackPlan": {
"onCreateFail": "등록 모달 닫고 재시도",
"onUpdateFail": "페이지 새로고침 후 재시도",
"onDeleteFail": "수동 삭제 필요",
"cleanupRequired": "E2E_TEST_구매처_* 패턴 데이터 삭제"
}
} }

View File

@@ -5,12 +5,12 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "구매관리 > 단가관리 메뉴의 구매 단가 관리 기능 테스트", "description": "구매관리 > 단가관리 메뉴의 구매 단가 CRUD 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "구매관리", "level1": "구매관리",
"level2": "단가관리", "level2": "단가관리",
"expectedUrl": "/sales/pricing-management", "expectedUrl": "/purchase/pricing-management",
"searchWithinParent": true, "searchWithinParent": true,
"closeOtherMenus": true "closeOtherMenus": true
}, },
@@ -18,6 +18,13 @@
"username": "TestUser5", "username": "TestUser5",
"password": "password123!" "password": "password123!"
}, },
"testData": {
"create": {
"itemName": "E2E_TEST_품목_{timestamp}",
"price": "10000",
"unit": "EA"
}
},
"steps": [ "steps": [
{ {
"id": 1, "id": 1,
@@ -26,7 +33,7 @@
"level1": "구매관리", "level1": "구매관리",
"level2": "단가관리", "level2": "단가관리",
"expected": { "expected": {
"url_contains": "/sales", "url_contains": "/purchase",
"visible": ["단가관리", "단가"] "visible": ["단가관리", "단가"]
} }
}, },
@@ -35,27 +42,214 @@
"name": "필수 검증 #5: 목업 페이지 감지", "name": "필수 검증 #5: 목업 페이지 감지",
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"단가 목록 표시" "단가 목록 표시",
"단가 등록 버튼 존재",
"검색 기능 존재"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "단가 목록 확인", "name": "단가 테이블 구조 확인",
"action": "verify_table", "action": "verify_table",
"checks": [ "checks": [
"품목 컬럼", "품목 컬럼",
"단가 컬럼" "거래처 컬럼",
"단가 컬럼",
"적용기간 컬럼"
], ],
"expected": "단가 목록 표시" "expected": "단가 테이블 표시"
},
{
"id": 4,
"phase": "CREATE",
"name": "[CREATE] 단가 등록 버튼 클릭",
"action": "click",
"target": "button:has-text('등록'), button:has-text('추가'), button:has-text('신규')",
"expected": {
"modal_open": true
}
},
{
"id": 5,
"phase": "CREATE",
"name": "[CREATE] 품목 선택",
"action": "click",
"target": "select[name*='item'], button:has-text('품목'), input[placeholder*='품목']",
"expected": "품목 선택 가능"
},
{
"id": 6,
"phase": "CREATE",
"name": "[CREATE] 거래처 선택",
"action": "click",
"target": "select[name*='supplier'], button:has-text('거래처'), input[placeholder*='거래처']",
"expected": "거래처 선택 가능"
},
{
"id": 7,
"phase": "CREATE",
"name": "[CREATE] 단가 입력",
"action": "fill",
"target": "input[name*='price'], input[placeholder*='단가']",
"value": "10000",
"clear": true
},
{
"id": 8,
"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/purchase/pricing",
"toast": "등록|저장|완료|성공"
},
"expected": "단가 등록 완료"
},
{
"id": 9,
"phase": "READ",
"name": "[READ] 등록된 단가 확인",
"action": "verify_detail",
"checks": [
"등록한 단가 목록에 표시"
],
"expected": "등록된 단가 확인"
},
{
"id": 10,
"phase": "READ",
"name": "[READ] 단가 상세 조회",
"action": "click",
"target": "table tbody tr:first-child",
"expected": {
"detail_view": true
}
},
{
"id": 11,
"name": "단가 상세 정보 확인",
"action": "verify_detail",
"checks": [
"품목 정보",
"거래처 정보",
"단가",
"적용기간"
],
"expected": "단가 상세 정보 표시"
},
{
"id": 12,
"phase": "UPDATE",
"name": "[UPDATE] 단가 수정 모드 진입",
"action": "click",
"target": "button:has-text('수정'), button:has-text('편집')",
"expected": {
"edit_mode": true
}
},
{
"id": 13,
"phase": "UPDATE",
"name": "[UPDATE] 단가 수정",
"action": "fill",
"target": "input[name*='price'], input[placeholder*='단가']",
"value": "12000",
"clear": true
},
{
"id": 14,
"phase": "UPDATE",
"name": "[UPDATE] 단가 저장",
"action": "click",
"target": "button:has-text('저장'), button:has-text('확인')",
"verify": {
"api_call": "PUT /api/v1/purchase/pricing",
"toast": "수정|저장|완료|성공"
},
"expected": "단가 수정 완료"
},
{
"id": 15,
"name": "단가 이력 조회",
"action": "verify_elements",
"checks": [
"단가 변동 이력 조회 가능"
],
"expected": "단가 이력 기능 확인"
},
{
"id": 16,
"name": "엑셀 다운로드",
"action": "click",
"target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')",
"verify": {
"file_download": true
},
"expected": "엑셀 파일 다운로드"
},
{
"id": 17,
"name": "단가 비교 기능",
"action": "verify_elements",
"checks": [
"거래처별 단가 비교 기능"
],
"expected": "단가 비교 기능 확인"
},
{
"id": 18,
"name": "일괄 등록 기능",
"action": "verify_elements",
"checks": [
"엑셀 일괄 등록 버튼 존재 여부"
],
"expected": "일괄 등록 기능 확인"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/purchase/pricing",
"description": "단가 목록 조회"
},
{
"method": "POST",
"endpoint": "/api/v1/purchase/pricing",
"description": "단가 등록"
},
{
"method": "PUT",
"endpoint": "/api/v1/purchase/pricing/:id",
"description": "단가 수정"
},
{
"method": "GET",
"endpoint": "/api/v1/purchase/pricing/history",
"description": "단가 이력 조회"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 2,
"name": "저장 버튼",
"steps": [8, 14],
"criteria": "API 호출 + 성공 토스트 + 데이터 반영"
},
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "단가 관리 기능 확인" "criteria": "단가 목록, 등록 버튼, 검색 기능 존재"
} }
] ],
"rollbackPlan": {
"onCreateFail": "등록 모달 닫고 재시도",
"onUpdateFail": "페이지 새로고침 후 재시도",
"note": "단가 삭제는 일반적으로 비활성화 처리"
}
} }

View File

@@ -5,12 +5,14 @@
"onErrorOnly": true, "onErrorOnly": true,
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"] "captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
}, },
"description": "구매관리 > 구매현황 메뉴의 구매 현황 조회 기능 테스트", "description": "구매관리 > 구매현황 메뉴의 구매 현황 조회/필터/통계 기능 테스트",
"baseUrl": "https://dev.codebridge-x.com", "baseUrl": "https://dev.codebridge-x.com",
"menuNavigation": { "menuNavigation": {
"level1": "구매관리", "level1": "구매관리",
"level2": "구매현황", "level2": "구매현황",
"expectedUrl": "/purchase/status" "expectedUrl": "/purchase/status",
"searchWithinParent": true,
"closeOtherMenus": true
}, },
"auth": { "auth": {
"username": "TestUser5", "username": "TestUser5",
@@ -34,27 +36,173 @@
"action": "verify_not_mockup", "action": "verify_not_mockup",
"checks": [ "checks": [
"구매 현황 표시", "구매 현황 표시",
"필터 존재" "기간 필터 존재",
"통계 또는 차트 존재"
], ],
"expected": "정상 페이지 (목업 아님)" "expected": "정상 페이지 (목업 아님)"
}, },
{ {
"id": 3, "id": 3,
"name": "구매 현황 확인", "name": "구매현황 페이지 구조 확인",
"action": "verify_elements", "action": "verify_elements",
"checks": [ "checks": [
"구매 통계 카드", "구매 통계 카드",
"구매 목록 테이블" "기간 선택 필터",
"구매 목록 테이블 또는 차트"
], ],
"expected": "구매 현황 표시" "expected": "구매현황 페이지 정상 표시"
},
{
"id": 4,
"phase": "READ",
"name": "[READ] 구매 통계 확인",
"action": "verify_detail",
"checks": [
"총 구매금액",
"구매 건수",
"평균 구매금액"
],
"expected": "구매 통계 표시"
},
{
"id": 5,
"phase": "FILTER",
"name": "[FILTER] 기간 필터 - 시작일",
"action": "fill",
"target": "input[type='date']:first-of-type, input[name*='start']",
"value": "2025-01-01"
},
{
"id": 6,
"phase": "FILTER",
"name": "[FILTER] 기간 필터 - 종료일",
"action": "fill",
"target": "input[type='date']:last-of-type, input[name*='end']",
"value": "2025-12-31"
},
{
"id": 7,
"phase": "FILTER",
"name": "[FILTER] 조회 실행",
"action": "click",
"target": "button:has-text('조회'), button:has-text('검색')",
"expected": {
"data_loaded": true,
"api_call": "GET /api/v1/purchase/status"
}
},
{
"id": 8,
"name": "구매 현황 테이블 확인",
"action": "verify_table",
"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": "추이 차트 표시"
},
{
"id": 13,
"name": "필수 검증 #1: 엑셀 다운로드",
"action": "click",
"target": "button:has-text('엑셀'), button:has-text('Excel'), button:has-text('다운로드')",
"critical": true,
"verify": {
"api_call": "GET /api/v1/purchase/status/export",
"file_download": true
},
"expected": "엑셀 파일 다운로드"
},
{
"id": 14,
"name": "인쇄 기능 확인",
"action": "verify_elements",
"checks": [
"인쇄 버튼 존재"
],
"expected": "인쇄 기능 표시"
},
{
"id": 15,
"name": "전년 대비 비교 확인",
"action": "verify_elements",
"checks": [
"전년 동기 대비 증감 표시"
],
"expected": "비교 분석 표시"
}
],
"expectedAPIs": [
{
"method": "GET",
"endpoint": "/api/v1/purchase/status",
"description": "구매현황 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/purchase/statistics",
"description": "구매 통계 조회"
},
{
"method": "GET",
"endpoint": "/api/v1/purchase/status/export",
"description": "구매현황 엑셀 다운로드"
} }
], ],
"requiredVerifications": [ "requiredVerifications": [
{
"id": 1,
"name": "엑셀 다운로드",
"steps": [13],
"criteria": "API 호출 + 파일 다운로드"
},
{ {
"id": 5, "id": 5,
"name": "목업 페이지 감지", "name": "목업 페이지 감지",
"steps": [2], "steps": [2],
"criteria": "구매 현황 확인" "criteria": "구매 현황, 기간 필터, 통계/차트 존재"
} }
] ],
"rollbackPlan": {
"note": "조회 전용 페이지로 데이터 변경 없음"
}
} }