1043 lines
31 KiB
JSON
1043 lines
31 KiB
JSON
{
|
|
"id": "item-management",
|
|
"name": "품목관리 (Item Management)",
|
|
"screenshotPolicy": {
|
|
"onErrorOnly": true,
|
|
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
|
|
},
|
|
"description": "생산관리 - 품목관리 메뉴의 전체 기능 테스트: 품목 조회, 검색, 필터, 등록(제품/부품/소모품), 상세보기, 수정, 삭제, 페이지네이션",
|
|
"priority": "High",
|
|
"tags": ["production", "item-management", "crud", "pagination", "search", "filter"],
|
|
"baseUrl": "https://dev.codebridge-x.com",
|
|
"url": "/ko/production/screen-production",
|
|
"navigation": {
|
|
"targetUrl": "/production/screen-production",
|
|
"urlPattern": "/production/screen-production|/ko/production/screen-production",
|
|
"menuHints": ["품목관리", "품목 관리", "생산관리"]
|
|
},
|
|
"menuNavigation": {
|
|
"level1": "생산관리",
|
|
"level2": "품목관리",
|
|
"expectedUrl": "/ko/production/screen-production",
|
|
"searchWithinParent": true,
|
|
"closeOtherMenus": true
|
|
},
|
|
"auth": {
|
|
"username": "TestUser5",
|
|
"password": "password123!"
|
|
},
|
|
"menuNavigationEnhanced": {
|
|
"strategy": "scroll-and-search",
|
|
"description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지",
|
|
"level1": "생산관리",
|
|
"level2": "품목관리",
|
|
"alternativeLevel1Names": ["생산관리", "생산 관리", "Production", "제조관리"],
|
|
"alternativeLevel2Names": ["품목관리", "품목 관리", "Item Management", "품목", "자재관리"],
|
|
"scrollConfig": {
|
|
"sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar",
|
|
"menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']",
|
|
"scrollStep": 200,
|
|
"maxScrollAttempts": 10,
|
|
"scrollDelay": 300
|
|
}
|
|
},
|
|
"testData": {
|
|
"testProduct": {
|
|
"상품명": "테스트 프리미엄 스크린",
|
|
"품목명": "TEST-SCREEN-001",
|
|
"로트약자": "TSC",
|
|
"품목상태": "활성",
|
|
"비고": "E2E 테스트용 제품",
|
|
"인정번호": "TEST-CERT-2026-001"
|
|
},
|
|
"testConsumable": {
|
|
"품목명": "테스트 라벨",
|
|
"규격": "100x50mm",
|
|
"단위": "EA",
|
|
"비고": "E2E 테스트용 소모품"
|
|
},
|
|
"searchKeyword": "CS-001000"
|
|
},
|
|
"expectedAPIs": [
|
|
{
|
|
"method": "GET",
|
|
"endpoint": "/api/items",
|
|
"description": "품목 목록 조회",
|
|
"expectedStatus": 200
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"endpoint": "/api/items",
|
|
"description": "품목 등록",
|
|
"expectedStatus": 201
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"endpoint": "/api/items/:id",
|
|
"description": "품목 상세 조회",
|
|
"expectedStatus": 200
|
|
},
|
|
{
|
|
"method": "PATCH",
|
|
"endpoint": "/api/items/:id",
|
|
"description": "품목 수정",
|
|
"expectedStatus": 200
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"endpoint": "/api/items/:id",
|
|
"description": "품목 삭제",
|
|
"expectedStatus": 200
|
|
}
|
|
],
|
|
"steps": [
|
|
{
|
|
"step": 0,
|
|
"name": "사이드바 메뉴 전체 펼치기",
|
|
"description": "모두 펼치기 버튼을 클릭하여 전체 메뉴를 펼친 후 메뉴 탐색 준비",
|
|
"actions": [
|
|
{
|
|
"type": "evaluate",
|
|
"script": "document.querySelector('.sidebar-scroll')?.scrollTo({top:0,behavior:'instant'})"
|
|
},
|
|
{ "type": "wait", "duration": 300 },
|
|
{
|
|
"type": "evaluate",
|
|
"script": "Array.from(document.querySelectorAll('button')).find(b => b.innerText?.includes('모두 펼치기'))?.click()"
|
|
},
|
|
{ "type": "wait", "duration": 2000 }
|
|
]
|
|
},
|
|
{
|
|
"step": 1,
|
|
"name": "2단계 메뉴 진입: 생산관리 > 품목관리",
|
|
"description": "사이드바를 스크롤하며 생산관리 > 품목관리 메뉴를 찾아 클릭",
|
|
"actions": [
|
|
{
|
|
"type": "scrollAndFind",
|
|
"target": "생산관리",
|
|
"alternativeTexts": ["생산관리", "생산 관리", "Production", "제조관리"],
|
|
"scrollContainer": "sidebar",
|
|
"maxAttempts": 10,
|
|
"description": "스크롤하며 생산관리 메뉴 찾기"
|
|
},
|
|
{ "type": "click_if_exists", "target": "생산관리", "description": "생산관리 메뉴 클릭" },
|
|
{ "type": "wait", "duration": 500, "description": "서브메뉴 펼쳐지기 대기" },
|
|
{
|
|
"type": "scrollAndFind",
|
|
"target": "품목관리",
|
|
"alternativeTexts": ["품목관리", "품목 관리", "Item Management", "품목"],
|
|
"scrollContainer": "submenu",
|
|
"maxAttempts": 5,
|
|
"description": "서브메뉴에서 품목관리 찾기"
|
|
},
|
|
{ "type": "click_if_exists", "target": "품목관리", "description": "품목관리 메뉴 클릭" },
|
|
{ "type": "wait", "target": "페이지 로드 완료", "timeout": 10000 }
|
|
],
|
|
"expected": {
|
|
"url": "/ko/production/screen-production",
|
|
"title": "품목 관리",
|
|
"authenticated": true
|
|
},
|
|
"validation": {
|
|
"pageTitle": "품목 관리",
|
|
"pageDescription": "제품, 부품, 부자재, 원자재, 소모품 등록 및 관리"
|
|
},
|
|
"verification": [
|
|
"생산관리 메뉴가 펼쳐졌는지 확인",
|
|
"품목관리 서브메뉴 클릭 성공",
|
|
"404 에러 없이 페이지 로드 완료"
|
|
]
|
|
},
|
|
{
|
|
"step": 2,
|
|
"name": "통계 카드 표시 확인",
|
|
"action": "verify",
|
|
"target": "statistics-cards",
|
|
"expected": "6개 통계 카드가 올바른 데이터와 함께 표시됨",
|
|
"validation": {
|
|
"cards": [
|
|
"전체 품목",
|
|
"제품",
|
|
"부품",
|
|
"부자재",
|
|
"원자재",
|
|
"소모품"
|
|
],
|
|
"hasNumbers": true
|
|
}
|
|
},
|
|
{
|
|
"step": 3,
|
|
"name": "품목 등록 버튼 표시 확인",
|
|
"action": "verify",
|
|
"target": "button:품목 등록",
|
|
"expected": "품목 등록 버튼이 표시됨"
|
|
},
|
|
{
|
|
"step": 4,
|
|
"name": "검색 입력 필드 표시 확인",
|
|
"action": "verify",
|
|
"target": "textbox:품목코드, 품목명, 규격 검색...",
|
|
"expected": "검색 입력 필드가 표시됨"
|
|
},
|
|
{
|
|
"step": 5,
|
|
"name": "탭 필터 버튼 표시 확인",
|
|
"action": "verify",
|
|
"target": "tab-buttons",
|
|
"expected": "6개 탭 필터 버튼이 표시됨",
|
|
"validation": {
|
|
"tabs": [
|
|
"전체",
|
|
"제품",
|
|
"부품",
|
|
"부자재",
|
|
"원자재",
|
|
"소모품"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"step": 6,
|
|
"name": "데이터 테이블 헤더 확인",
|
|
"action": "verify",
|
|
"target": "table-headers",
|
|
"expected": "테이블 헤더가 올바르게 표시됨",
|
|
"validation": {
|
|
"columns": [
|
|
"체크박스",
|
|
"번호",
|
|
"품목코드",
|
|
"품목유형",
|
|
"품목명",
|
|
"규격",
|
|
"단위",
|
|
"품목상태",
|
|
"액션"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"step": 7,
|
|
"name": "데이터 행 표시 확인",
|
|
"action": "verify",
|
|
"target": "table-rows",
|
|
"expected": "20개 데이터 행이 표시됨",
|
|
"validation": {
|
|
"minRows": 20,
|
|
"maxRows": 20
|
|
}
|
|
},
|
|
{
|
|
"step": 8,
|
|
"name": "페이지네이션 표시 확인",
|
|
"action": "verify",
|
|
"target": "pagination",
|
|
"expected": "페이지네이션 정보가 표시됨: '전체 10425개 중 1-20개 표시'"
|
|
},
|
|
{
|
|
"step": 9,
|
|
"name": "액션 버튼 표시 확인 (첫 번째 행)",
|
|
"action": "verify",
|
|
"target": "row[1]:action-buttons",
|
|
"expected": "각 행에 '상세 보기', '수정', '삭제' 버튼이 표시됨"
|
|
},
|
|
{
|
|
"step": 10,
|
|
"name": "⚠️ 필수 검증: 검색 기능 테스트",
|
|
"actions": [
|
|
{
|
|
"type": "capture",
|
|
"variable": "beforeSearchCount",
|
|
"selector": "table tbody tr",
|
|
"extract": "count",
|
|
"description": "검색 전 행 수 저장"
|
|
},
|
|
{
|
|
"type": "fill",
|
|
"target": "textbox:품목코드, 품목명, 규격 검색...",
|
|
"value": "{testData.searchKeyword}",
|
|
"description": "검색어 CS-001000 입력"
|
|
},
|
|
{
|
|
"type": "wait",
|
|
"duration": 1000,
|
|
"description": "검색 결과 로딩 대기"
|
|
},
|
|
{
|
|
"type": "capture",
|
|
"variable": "afterSearchCount",
|
|
"selector": "table tbody tr",
|
|
"extract": "count",
|
|
"description": "검색 후 행 수 저장"
|
|
}
|
|
],
|
|
"verify": {
|
|
"searchApplied": true,
|
|
"tableContains": "{testData.searchKeyword}",
|
|
"dataChanged": "beforeSearchCount may differ from afterSearchCount"
|
|
},
|
|
"expected": "검색어가 입력되고 필터링됨"
|
|
},
|
|
{
|
|
"step": 11,
|
|
"name": "검색 결과 확인",
|
|
"action": "wait",
|
|
"duration": 1000,
|
|
"expected": "검색 결과가 필터링되어 표시됨 (자동 검색 또는 Enter 키)"
|
|
},
|
|
{
|
|
"step": 12,
|
|
"name": "검색 결과 데이터 검증",
|
|
"description": "검색 결과의 모든 행이 검색어를 포함하는지 확인",
|
|
"action": "verify",
|
|
"target": "table-rows",
|
|
"expected": "검색어와 일치하는 품목만 표시됨",
|
|
"validation": {
|
|
"containsKeyword": "CS-001000"
|
|
},
|
|
"verify": {
|
|
"allRowsContain": "{testData.searchKeyword}",
|
|
"columnToCheck": "품목코드"
|
|
}
|
|
},
|
|
{
|
|
"step": 13,
|
|
"name": "검색 초기화",
|
|
"actions": [
|
|
{
|
|
"type": "clear",
|
|
"target": "textbox:품목코드, 품목명, 규격 검색..."
|
|
},
|
|
{
|
|
"type": "wait",
|
|
"duration": 500
|
|
},
|
|
{
|
|
"type": "capture",
|
|
"variable": "afterClearCount",
|
|
"selector": "table tbody tr",
|
|
"extract": "count"
|
|
}
|
|
],
|
|
"verify": {
|
|
"dataRestored": "afterClearCount should equal beforeSearchCount"
|
|
},
|
|
"expected": "검색어가 지워지고 전체 목록이 다시 표시됨"
|
|
},
|
|
{
|
|
"step": 14,
|
|
"name": "탭 필터 테스트 - 제품 탭 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:제품",
|
|
"expected": "제품 탭이 활성화됨"
|
|
},
|
|
{
|
|
"step": 15,
|
|
"name": "제품 탭 필터 결과 확인",
|
|
"action": "verify",
|
|
"target": "table-rows",
|
|
"expected": "품목유형이 '제품'인 항목만 표시됨",
|
|
"validation": {
|
|
"itemType": "제품"
|
|
}
|
|
},
|
|
{
|
|
"step": 16,
|
|
"name": "탭 필터 테스트 - 소모품 탭 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:소모품",
|
|
"expected": "소모품 탭이 활성화됨"
|
|
},
|
|
{
|
|
"step": 17,
|
|
"name": "소모품 탭 필터 결과 확인",
|
|
"action": "verify",
|
|
"target": "table-rows",
|
|
"expected": "품목유형이 '소모품'인 항목만 표시됨",
|
|
"validation": {
|
|
"itemType": "소모품"
|
|
}
|
|
},
|
|
{
|
|
"step": 18,
|
|
"name": "탭 필터 초기화 - 전체 탭 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:전체",
|
|
"expected": "전체 탭이 활성화되고 모든 품목이 표시됨"
|
|
},
|
|
{
|
|
"step": 19,
|
|
"name": "페이지네이션 테스트 - 2페이지 이동",
|
|
"action": "click_if_exists",
|
|
"target": "button:2",
|
|
"expected": "2페이지로 이동됨"
|
|
},
|
|
{
|
|
"step": 20,
|
|
"name": "2페이지 데이터 확인",
|
|
"action": "verify",
|
|
"target": "pagination",
|
|
"expected": "페이지네이션 정보가 '전체 10425개 중 21-40개 표시'로 변경됨"
|
|
},
|
|
{
|
|
"step": 21,
|
|
"name": "다음 페이지 버튼 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:다음",
|
|
"expected": "3페이지로 이동됨"
|
|
},
|
|
{
|
|
"step": 22,
|
|
"name": "3페이지 데이터 확인",
|
|
"action": "verify",
|
|
"target": "pagination",
|
|
"expected": "페이지네이션 정보가 '전체 10425개 중 41-60개 표시'로 변경됨"
|
|
},
|
|
{
|
|
"step": 23,
|
|
"name": "1페이지로 복귀",
|
|
"action": "click_if_exists",
|
|
"target": "button:1",
|
|
"expected": "1페이지로 복귀됨"
|
|
},
|
|
{
|
|
"step": 24,
|
|
"name": "품목 등록 페이지 이동",
|
|
"action": "click_if_exists",
|
|
"target": "button:품목 등록",
|
|
"expected": "품목 등록 페이지(/items/create)로 이동됨"
|
|
},
|
|
{
|
|
"step": 25,
|
|
"name": "품목 등록 페이지 로딩 확인",
|
|
"action": "verify",
|
|
"target": "heading:품목 등록",
|
|
"expected": "품목 등록 페이지가 표시됨",
|
|
"validation": {
|
|
"pageTitle": "품목 등록",
|
|
"pageDescription": "품목 정보를 입력하세요"
|
|
}
|
|
},
|
|
{
|
|
"step": 26,
|
|
"name": "초기 버튼 상태 확인",
|
|
"action": "verify",
|
|
"target": "buttons",
|
|
"expected": "'취소' 버튼은 활성화, '저장' 버튼은 비활성화 상태",
|
|
"validation": {
|
|
"cancelEnabled": true,
|
|
"saveDisabled": true
|
|
}
|
|
},
|
|
{
|
|
"step": 27,
|
|
"name": "품목 유형 선택 전 경고 메시지 확인",
|
|
"action": "verify",
|
|
"target": "alert",
|
|
"expected": "'⚠️ 품목 유형을 먼저 선택해주세요' 경고 메시지가 표시됨"
|
|
},
|
|
{
|
|
"step": 28,
|
|
"name": "품목 유형 필드 확인",
|
|
"action": "verify",
|
|
"target": "combobox:품목 유형",
|
|
"expected": "품목 유형 콤보박스가 필수 필드(*)로 표시됨"
|
|
},
|
|
{
|
|
"step": 29,
|
|
"name": "제품(Finished Goods) 등록 테스트 시작",
|
|
"action": "click_if_exists",
|
|
"target": "combobox:품목 유형",
|
|
"expected": "품목 유형 드롭다운이 열림"
|
|
},
|
|
{
|
|
"step": 30,
|
|
"name": "제품 옵션 선택",
|
|
"action": "click_if_exists",
|
|
"target": "option:제품 (Finished Goods)",
|
|
"expected": "제품 유형이 선택되고 제품 전용 입력 필드가 표시됨"
|
|
},
|
|
{
|
|
"step": 31,
|
|
"name": "제품 입력 필드 표시 확인",
|
|
"action": "verify",
|
|
"target": "form-fields",
|
|
"expected": "제품 유형에 맞는 입력 필드들이 표시됨",
|
|
"validation": {
|
|
"fields": [
|
|
"상품명*",
|
|
"품목명*",
|
|
"품목코드(자동생성)",
|
|
"로트 약자",
|
|
"품목상태",
|
|
"비고",
|
|
"인정번호",
|
|
"인정 유효기간 시작일",
|
|
"인정 유효기간 종료일",
|
|
"시방서 (PDF)",
|
|
"인정서 (PDF)",
|
|
"부품구성 (BOM) 필요"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"step": 32,
|
|
"name": "상품명 입력",
|
|
"action": "type",
|
|
"target": "textbox:상품명",
|
|
"value": "테스트 프리미엄 스크린",
|
|
"expected": "상품명이 입력됨"
|
|
},
|
|
{
|
|
"step": 33,
|
|
"name": "품목명 입력",
|
|
"action": "type",
|
|
"target": "textbox:품목명",
|
|
"value": "TEST-SCREEN-001",
|
|
"expected": "품목명이 입력됨"
|
|
},
|
|
{
|
|
"step": 34,
|
|
"name": "품목코드 자동생성 확인",
|
|
"action": "verify",
|
|
"target": "textbox:품목코드",
|
|
"expected": "품목코드가 품목명과 동일하게 'TEST-SCREEN-001'로 자동 생성됨",
|
|
"validation": {
|
|
"isDisabled": true,
|
|
"value": "TEST-SCREEN-001"
|
|
}
|
|
},
|
|
{
|
|
"step": 35,
|
|
"name": "로트 약자 입력",
|
|
"action": "type",
|
|
"target": "textbox:로트 약자",
|
|
"value": "TSC",
|
|
"expected": "로트 약자가 입력됨"
|
|
},
|
|
{
|
|
"step": 36,
|
|
"name": "품목상태 선택",
|
|
"action": "click_if_exists",
|
|
"target": "combobox:품목상태",
|
|
"expected": "품목상태 드롭다운이 열림"
|
|
},
|
|
{
|
|
"step": 37,
|
|
"name": "품목상태 '활성' 선택",
|
|
"action": "click_if_exists",
|
|
"target": "option:활성",
|
|
"expected": "'활성' 상태가 선택됨"
|
|
},
|
|
{
|
|
"step": 38,
|
|
"name": "비고 입력",
|
|
"action": "type",
|
|
"target": "textbox:비고",
|
|
"value": "E2E 테스트용 제품",
|
|
"expected": "비고가 입력됨"
|
|
},
|
|
{
|
|
"step": 39,
|
|
"name": "인정번호 입력",
|
|
"action": "type",
|
|
"target": "textbox:인정번호",
|
|
"value": "TEST-CERT-2026-001",
|
|
"expected": "인정번호가 입력됨"
|
|
},
|
|
{
|
|
"step": 40,
|
|
"name": "저장 버튼 활성화 확인",
|
|
"action": "verify",
|
|
"target": "button:저장",
|
|
"expected": "필수 필드 입력 완료 후 저장 버튼이 활성화됨",
|
|
"validation": {
|
|
"isEnabled": true
|
|
}
|
|
},
|
|
{
|
|
"step": 41,
|
|
"name": "제품 등록 - URL 저장 (라우팅 오류 감지용)",
|
|
"action": "getCurrentUrl",
|
|
"expected": "현재 URL 저장: /items/create"
|
|
},
|
|
{
|
|
"step": 42,
|
|
"name": "제품 등록 - 저장 버튼 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:저장",
|
|
"expected": "제품 등록 API 호출 및 성공 메시지 표시"
|
|
},
|
|
{
|
|
"step": 43,
|
|
"name": "제품 등록 - URL 변경 여부 확인 (필수 검증 #2)",
|
|
"action": "verifyUrl",
|
|
"expected": "URL이 /production/screen-production으로 복귀 (404 에러 페이지 아님)",
|
|
"validation": {
|
|
"notContains": ["404", "not-found", "error"]
|
|
}
|
|
},
|
|
{
|
|
"step": 44,
|
|
"name": "제품 등록 - 에러 페이지 텍스트 감지 (필수 검증 #2)",
|
|
"action": "verifyNoErrorPage",
|
|
"expected": "에러 텍스트가 없음",
|
|
"validation": {
|
|
"noErrorText": [
|
|
"페이지를 찾을 수 없습니다",
|
|
"404",
|
|
"Not Found",
|
|
"서버 에러",
|
|
"500"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"step": 45,
|
|
"name": "제품 등록 - 성공 토스트 메시지 확인 (필수 검증 #2)",
|
|
"action": "verify",
|
|
"target": "toast-message",
|
|
"expected": "'등록되었습니다' 또는 유사한 성공 메시지가 표시됨"
|
|
},
|
|
{
|
|
"step": 46,
|
|
"name": "제품 등록 - 목록 페이지 복귀 확인",
|
|
"action": "verify",
|
|
"target": "heading:품목 관리",
|
|
"expected": "품목 관리 목록 페이지로 정상 복귀됨"
|
|
},
|
|
{
|
|
"step": 47,
|
|
"name": "제품 등록 - 신규 품목 검색",
|
|
"action": "type",
|
|
"target": "textbox:품목코드, 품목명, 규격 검색...",
|
|
"value": "TEST-SCREEN-001",
|
|
"expected": "등록한 제품 검색"
|
|
},
|
|
{
|
|
"step": 48,
|
|
"name": "제품 등록 - 신규 품목 표시 확인",
|
|
"action": "wait",
|
|
"duration": 1000,
|
|
"expected": "등록한 제품이 목록에 표시됨"
|
|
},
|
|
{
|
|
"step": 49,
|
|
"name": "제품 등록 - 데이터 검증",
|
|
"action": "verify",
|
|
"target": "table-row:TEST-SCREEN-001",
|
|
"expected": "등록한 제품 정보가 올바르게 표시됨",
|
|
"validation": {
|
|
"품목코드": "TEST-SCREEN-001",
|
|
"품목유형": "제품",
|
|
"품목상태": "활성"
|
|
}
|
|
},
|
|
{
|
|
"step": 50,
|
|
"name": "소모품(Consumables) 등록 테스트 시작",
|
|
"action": "click_if_exists",
|
|
"target": "button:품목 등록",
|
|
"expected": "품목 등록 페이지로 이동됨"
|
|
},
|
|
{
|
|
"step": 51,
|
|
"name": "품목 유형에서 소모품 선택",
|
|
"action": "click_if_exists",
|
|
"target": "combobox:품목 유형",
|
|
"expected": "품목 유형 드롭다운이 열림"
|
|
},
|
|
{
|
|
"step": 52,
|
|
"name": "소모품 옵션 선택",
|
|
"action": "click_if_exists",
|
|
"target": "option:소모품 (Consumables)",
|
|
"expected": "소모품 유형이 선택되고 소모품 전용 입력 필드가 표시됨"
|
|
},
|
|
{
|
|
"step": 53,
|
|
"name": "소모품 입력 필드 표시 확인",
|
|
"action": "verify",
|
|
"target": "form-fields",
|
|
"expected": "소모품 유형에 맞는 입력 필드들이 표시됨",
|
|
"validation": {
|
|
"fields": [
|
|
"품목명*",
|
|
"규격(사양)*",
|
|
"품목코드(자동생성)",
|
|
"단위*",
|
|
"비고"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"step": 54,
|
|
"name": "소모품 품목명 입력",
|
|
"action": "type",
|
|
"target": "textbox:품목명",
|
|
"value": "테스트 라벨",
|
|
"expected": "품목명이 입력됨"
|
|
},
|
|
{
|
|
"step": 55,
|
|
"name": "소모품 규격 입력",
|
|
"action": "type",
|
|
"target": "textbox:규격(사양)",
|
|
"value": "100x50mm",
|
|
"expected": "규격이 입력됨"
|
|
},
|
|
{
|
|
"step": 56,
|
|
"name": "소모품 품목코드 자동생성 확인",
|
|
"action": "verify",
|
|
"target": "textbox:품목코드",
|
|
"expected": "품목코드가 '테스트 라벨-100x50mm' 형식으로 자동 생성됨",
|
|
"validation": {
|
|
"isDisabled": true,
|
|
"contains": "테스트 라벨-100x50mm"
|
|
}
|
|
},
|
|
{
|
|
"step": 57,
|
|
"name": "소모품 단위 선택",
|
|
"action": "click_if_exists",
|
|
"target": "combobox:단위",
|
|
"expected": "단위 드롭다운이 열림"
|
|
},
|
|
{
|
|
"step": 58,
|
|
"name": "단위 'EA' 선택",
|
|
"action": "click_if_exists",
|
|
"target": "option:EA",
|
|
"expected": "'EA' 단위가 선택됨"
|
|
},
|
|
{
|
|
"step": 59,
|
|
"name": "소모품 비고 입력",
|
|
"action": "type",
|
|
"target": "textbox:비고",
|
|
"value": "E2E 테스트용 소모품",
|
|
"expected": "비고가 입력됨"
|
|
},
|
|
{
|
|
"step": 60,
|
|
"name": "소모품 등록 - URL 저장 (라우팅 오류 감지용)",
|
|
"action": "getCurrentUrl",
|
|
"expected": "현재 URL 저장: /items/create"
|
|
},
|
|
{
|
|
"step": 61,
|
|
"name": "소모품 등록 - 저장 버튼 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:저장",
|
|
"expected": "소모품 등록 API 호출 및 성공 메시지 표시"
|
|
},
|
|
{
|
|
"step": 62,
|
|
"name": "소모품 등록 - URL 변경 여부 확인 (필수 검증 #2)",
|
|
"action": "verifyUrl",
|
|
"expected": "URL이 /production/screen-production으로 복귀 (404 에러 페이지 아님)",
|
|
"validation": {
|
|
"notContains": ["404", "not-found", "error"]
|
|
}
|
|
},
|
|
{
|
|
"step": 63,
|
|
"name": "소모품 등록 - 에러 페이지 텍스트 감지 (필수 검증 #2)",
|
|
"action": "verifyNoErrorPage",
|
|
"expected": "에러 텍스트가 없음"
|
|
},
|
|
{
|
|
"step": 64,
|
|
"name": "소모품 등록 - 성공 토스트 메시지 확인",
|
|
"action": "verify",
|
|
"target": "toast-message",
|
|
"expected": "'등록되었습니다' 성공 메시지가 표시됨"
|
|
},
|
|
{
|
|
"step": 65,
|
|
"name": "소모품 등록 - 신규 품목 검색",
|
|
"action": "type",
|
|
"target": "textbox:품목코드, 품목명, 규격 검색...",
|
|
"value": "테스트 라벨",
|
|
"expected": "등록한 소모품 검색"
|
|
},
|
|
{
|
|
"step": 66,
|
|
"name": "소모품 등록 - 신규 품목 표시 확인",
|
|
"action": "wait",
|
|
"duration": 1000,
|
|
"expected": "등록한 소모품이 목록에 표시됨"
|
|
},
|
|
{
|
|
"step": 67,
|
|
"name": "상세 보기 기능 테스트 - 첫 번째 품목 선택",
|
|
"action": "clearSearch",
|
|
"target": "textbox:품목코드, 품목명, 규격 검색...",
|
|
"expected": "검색어 초기화 및 전체 목록 표시"
|
|
},
|
|
{
|
|
"step": 68,
|
|
"name": "상세 보기 버튼 클릭 (첫 번째 행)",
|
|
"action": "click_if_exists",
|
|
"target": "button:상세 보기[row=1]",
|
|
"expected": "품목 상세 모달 또는 페이지가 열림"
|
|
},
|
|
{
|
|
"step": 69,
|
|
"name": "상세 정보 표시 확인",
|
|
"action": "verify",
|
|
"target": "detail-modal-or-page",
|
|
"expected": "품목 상세 정보가 표시됨",
|
|
"validation": {
|
|
"hasItemCode": true,
|
|
"hasItemType": true,
|
|
"hasItemName": true
|
|
}
|
|
},
|
|
{
|
|
"step": 70,
|
|
"name": "상세 보기 닫기",
|
|
"action": "click_if_exists",
|
|
"target": "button:닫기 or ESC",
|
|
"expected": "상세 모달/페이지가 닫히고 목록으로 복귀"
|
|
},
|
|
{
|
|
"step": 71,
|
|
"name": "수정 기능 테스트 - 등록한 제품 검색",
|
|
"action": "type",
|
|
"target": "textbox:품목코드, 품목명, 규격 검색...",
|
|
"value": "TEST-SCREEN-001",
|
|
"expected": "등록한 제품 검색"
|
|
},
|
|
{
|
|
"step": 72,
|
|
"name": "수정 버튼 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:수정[row=TEST-SCREEN-001]",
|
|
"expected": "품목 수정 페이지(/items/:id?mode=edit)로 이동됨"
|
|
},
|
|
{
|
|
"step": 73,
|
|
"name": "수정 페이지 로딩 확인",
|
|
"action": "verify",
|
|
"target": "heading:품목 수정",
|
|
"expected": "품목 수정 페이지가 표시되고 기존 데이터가 로드됨"
|
|
},
|
|
{
|
|
"step": 74,
|
|
"name": "기존 데이터 로드 확인",
|
|
"action": "verify",
|
|
"target": "form-fields",
|
|
"expected": "등록했던 데이터가 폼에 채워져 있음",
|
|
"validation": {
|
|
"상품명": "테스트 프리미엄 스크린",
|
|
"품목명": "TEST-SCREEN-001",
|
|
"로트약자": "TSC"
|
|
}
|
|
},
|
|
{
|
|
"step": 75,
|
|
"name": "비고 필드 수정",
|
|
"action": "clear-and-type",
|
|
"target": "textbox:비고",
|
|
"value": "E2E 테스트용 제품 - 수정됨",
|
|
"expected": "비고 내용이 수정됨"
|
|
},
|
|
{
|
|
"step": 76,
|
|
"name": "수정 저장 - URL 저장",
|
|
"action": "getCurrentUrl",
|
|
"expected": "현재 URL 저장: /items/:id?mode=edit"
|
|
},
|
|
{
|
|
"step": 77,
|
|
"name": "수정 저장 버튼 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:저장",
|
|
"expected": "수정 API 호출 및 성공 메시지 표시"
|
|
},
|
|
{
|
|
"step": 78,
|
|
"name": "수정 저장 - URL 변경 여부 확인 (필수 검증 #2)",
|
|
"action": "verifyUrl",
|
|
"expected": "URL이 /production/screen-production으로 복귀",
|
|
"validation": {
|
|
"notContains": ["404", "not-found", "error"]
|
|
}
|
|
},
|
|
{
|
|
"step": 79,
|
|
"name": "수정 저장 - 성공 토스트 메시지 확인",
|
|
"action": "verify",
|
|
"target": "toast-message",
|
|
"expected": "'수정되었습니다' 성공 메시지가 표시됨"
|
|
},
|
|
{
|
|
"step": 80,
|
|
"name": "수정된 데이터 확인 - 제품 검색",
|
|
"action": "type",
|
|
"target": "textbox:품목코드, 품목명, 규격 검색...",
|
|
"value": "TEST-SCREEN-001",
|
|
"expected": "수정한 제품 검색"
|
|
},
|
|
{
|
|
"step": 81,
|
|
"name": "수정된 데이터 확인 - 상세보기",
|
|
"action": "click_if_exists",
|
|
"target": "button:상세 보기[row=TEST-SCREEN-001]",
|
|
"expected": "상세 정보 표시"
|
|
},
|
|
{
|
|
"step": 82,
|
|
"name": "수정된 비고 내용 확인",
|
|
"action": "verify",
|
|
"target": "detail-modal:비고",
|
|
"expected": "비고가 'E2E 테스트용 제품 - 수정됨'으로 변경되었음을 확인"
|
|
},
|
|
{
|
|
"step": 83,
|
|
"name": "상세 모달 닫기",
|
|
"action": "click_if_exists",
|
|
"target": "button:닫기",
|
|
"expected": "상세 모달이 닫힘"
|
|
},
|
|
{
|
|
"step": 84,
|
|
"name": "삭제 기능 테스트 - 소모품 검색",
|
|
"action": "clear-and-type",
|
|
"target": "textbox:품목코드, 품목명, 규격 검색...",
|
|
"value": "테스트 라벨",
|
|
"expected": "등록한 소모품 검색"
|
|
},
|
|
{
|
|
"step": 85,
|
|
"name": "삭제 버튼 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:삭제[row=테스트 라벨]",
|
|
"expected": "삭제 확인 다이얼로그가 표시됨"
|
|
},
|
|
{
|
|
"step": 86,
|
|
"name": "삭제 확인 다이얼로그 검증",
|
|
"action": "verify",
|
|
"target": "dialog:confirm-delete",
|
|
"expected": "'정말 삭제하시겠습니까?' 메시지가 표시됨"
|
|
},
|
|
{
|
|
"step": 87,
|
|
"name": "삭제 취소 테스트 - 취소 버튼 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:취소[dialog]",
|
|
"expected": "다이얼로그가 닫히고 삭제되지 않음"
|
|
},
|
|
{
|
|
"step": 88,
|
|
"name": "삭제 취소 확인 - 품목이 여전히 존재함",
|
|
"action": "verify",
|
|
"target": "table-row:테스트 라벨",
|
|
"expected": "소모품이 목록에 여전히 존재함"
|
|
},
|
|
{
|
|
"step": 89,
|
|
"name": "삭제 재시도 - 삭제 버튼 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:삭제[row=테스트 라벨]",
|
|
"expected": "삭제 확인 다이얼로그가 다시 표시됨"
|
|
},
|
|
{
|
|
"step": 90,
|
|
"name": "삭제 확인 버튼 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:확인[dialog]",
|
|
"expected": "삭제 API 호출 및 성공 메시지 표시"
|
|
},
|
|
{
|
|
"step": 91,
|
|
"name": "소모품 삭제 - URL 변경 여부 확인 (필수 검증 #2)",
|
|
"action": "verifyUrl",
|
|
"expected": "URL이 /production/screen-production 유지",
|
|
"validation": {
|
|
"notContains": ["404", "not-found", "error"]
|
|
}
|
|
},
|
|
{
|
|
"step": 92,
|
|
"name": "소모품 삭제 - 성공 토스트 메시지 확인",
|
|
"action": "verify",
|
|
"target": "toast-message",
|
|
"expected": "'삭제되었습니다' 성공 메시지가 표시됨"
|
|
},
|
|
{
|
|
"step": 93,
|
|
"name": "소모품 삭제 확인 - 목록에서 사라짐",
|
|
"action": "verify",
|
|
"target": "table-rows",
|
|
"expected": "삭제한 소모품이 목록에서 사라짐",
|
|
"validation": {
|
|
"notContains": "테스트 라벨"
|
|
}
|
|
},
|
|
{
|
|
"step": 94,
|
|
"name": "제품 삭제 - 제품 검색",
|
|
"action": "clear-and-type",
|
|
"target": "textbox:품목코드, 품목명, 규격 검색...",
|
|
"value": "TEST-SCREEN-001",
|
|
"expected": "등록한 제품 검색"
|
|
},
|
|
{
|
|
"step": 95,
|
|
"name": "제품 삭제 버튼 클릭",
|
|
"action": "click_if_exists",
|
|
"target": "button:삭제[row=TEST-SCREEN-001]",
|
|
"expected": "삭제 확인 다이얼로그가 표시됨"
|
|
},
|
|
{
|
|
"step": 96,
|
|
"name": "제품 삭제 확인",
|
|
"action": "click_if_exists",
|
|
"target": "button:확인[dialog]",
|
|
"expected": "삭제 API 호출 및 성공 메시지 표시"
|
|
},
|
|
{
|
|
"step": 97,
|
|
"name": "제품 삭제 - URL 변경 여부 확인",
|
|
"action": "verifyUrl",
|
|
"expected": "URL이 /production/screen-production 유지"
|
|
},
|
|
{
|
|
"step": 98,
|
|
"name": "제품 삭제 - 성공 토스트 메시지 확인",
|
|
"action": "verify",
|
|
"target": "toast-message",
|
|
"expected": "'삭제되었습니다' 성공 메시지가 표시됨"
|
|
},
|
|
{
|
|
"step": 99,
|
|
"name": "제품 삭제 확인 - 목록에서 사라짐",
|
|
"action": "verify",
|
|
"target": "table-rows",
|
|
"expected": "삭제한 제품이 목록에서 사라짐",
|
|
"validation": {
|
|
"notContains": "TEST-SCREEN-001"
|
|
}
|
|
},
|
|
{
|
|
"step": 100,
|
|
"name": "최종 테스트 완료 확인",
|
|
"action": "verify",
|
|
"target": "page",
|
|
"expected": "품목 관리 페이지가 정상 상태로 유지됨",
|
|
"validation": {
|
|
"pageTitle": "품목 관리",
|
|
"hasStatistics": true,
|
|
"hasTable": true,
|
|
"hasPagination": true
|
|
}
|
|
}
|
|
]
|
|
}
|