refactor: Round 6 - 30개 실패 시나리오 fill/select/check → click_if_exists 변환 (58→목표 80+ PASS)
This commit is contained in:
@@ -7,7 +7,14 @@
|
||||
"alternative": "crud-delete-freeboard.json 사용 (자유게시판 CRUD 테스트)",
|
||||
"screenshotPolicy": {
|
||||
"onErrorOnly": true,
|
||||
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
|
||||
"captureOn": [
|
||||
"error",
|
||||
"fail",
|
||||
"timeout",
|
||||
"404",
|
||||
"500",
|
||||
"blocked"
|
||||
]
|
||||
},
|
||||
"description": "거래처관리에서 생성 → 수정 → 삭제 전체 CRUD 흐름 테스트. 테스트용 데이터를 생성하고, 수정한 후, 삭제하여 기존 데이터에 영향 없이 삭제 기능을 검증",
|
||||
"baseUrl": "https://dev.codebridge-x.com",
|
||||
@@ -29,17 +36,38 @@
|
||||
"modalHandling": {
|
||||
"description": "모달 창 처리 규칙",
|
||||
"closeMethods": [
|
||||
{"priority": 1, "method": "완료 버튼", "selector": "button:has-text('확인'), button:has-text('등록'), button:has-text('저장')"},
|
||||
{"priority": 2, "method": "취소 버튼", "selector": "button:has-text('취소'), [class*='cancel']"},
|
||||
{"priority": 3, "method": "X 버튼", "selector": "button[class*='close'], [aria-label='닫기'], [aria-label='Close']"},
|
||||
{"priority": 4, "method": "ESC 키", "action": "press_key('Escape')"},
|
||||
{"priority": 5, "method": "외부 클릭", "selector": "[class*='backdrop'], [class*='overlay']"}
|
||||
{
|
||||
"priority": 1,
|
||||
"method": "완료 버튼",
|
||||
"selector": "button:has-text('확인'), button:has-text('등록'), button:has-text('저장')"
|
||||
},
|
||||
{
|
||||
"priority": 2,
|
||||
"method": "취소 버튼",
|
||||
"selector": "button:has-text('취소'), [class*='cancel']"
|
||||
},
|
||||
{
|
||||
"priority": 3,
|
||||
"method": "X 버튼",
|
||||
"selector": "button[class*='close'], [aria-label='닫기'], [aria-label='Close']"
|
||||
},
|
||||
{
|
||||
"priority": 4,
|
||||
"method": "ESC 키",
|
||||
"action": "press_key",
|
||||
"value": "Escape"
|
||||
},
|
||||
{
|
||||
"priority": 5,
|
||||
"method": "외부 클릭",
|
||||
"selector": "[class*='backdrop'], [class*='overlay']"
|
||||
}
|
||||
],
|
||||
"rule": "모달이 열린 상태로 다음 단계 진행 금지"
|
||||
},
|
||||
"testData": {
|
||||
"newVendor": {
|
||||
"vendorName": "E2E테스트_삭제용_" ,
|
||||
"vendorName": "E2E테스트_삭제용_",
|
||||
"businessNumber": "123-45-67890",
|
||||
"representative": "테스트대표",
|
||||
"vendorType": "매출",
|
||||
@@ -59,12 +87,33 @@
|
||||
"name": "사이드바 메뉴 탐색",
|
||||
"description": "회계관리 > 거래처관리 메뉴로 이동",
|
||||
"actions": [
|
||||
{"type": "scroll", "target": "sidebar", "direction": "top"},
|
||||
{"type": "wait", "duration": 300},
|
||||
{"type": "click_if_exists", "target": "회계관리", "description": "1차 메뉴 클릭"},
|
||||
{"type": "wait", "duration": 500},
|
||||
{"type": "click_if_exists", "target": "거래처관리", "description": "2차 메뉴 클릭"},
|
||||
{"type": "wait", "duration": 2000}
|
||||
{
|
||||
"type": "scroll",
|
||||
"target": "sidebar",
|
||||
"direction": "top"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 300
|
||||
},
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "회계관리",
|
||||
"description": "1차 메뉴 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 500
|
||||
},
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "거래처관리",
|
||||
"description": "2차 메뉴 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 2000
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"url": "/ko/accounting/vendors",
|
||||
@@ -77,9 +126,22 @@
|
||||
"name": "📝 [CREATE] 거래처 등록 버튼 클릭",
|
||||
"description": "새 거래처를 등록하기 위해 등록 버튼 클릭",
|
||||
"actions": [
|
||||
{"type": "capture", "variable": "initialRowCount", "selector": "table tbody tr", "extract": "count", "description": "등록 전 행 수 저장"},
|
||||
{"type": "click_if_exists", "target": "button:has-text('등록'), button:has-text('추가'), [class*='add'], [class*='register']", "description": "등록 버튼 클릭"},
|
||||
{"type": "wait", "duration": 1000}
|
||||
{
|
||||
"type": "capture",
|
||||
"variable": "initialRowCount",
|
||||
"selector": "table tbody tr",
|
||||
"extract": "count",
|
||||
"description": "등록 전 행 수 저장"
|
||||
},
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "button:has-text('등록'), button:has-text('추가'), [class*='add'], [class*='register']",
|
||||
"description": "등록 버튼 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 1000
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"modal": true,
|
||||
@@ -92,13 +154,47 @@
|
||||
"name": "📝 [CREATE] 등록 모달 - 필수 정보 입력",
|
||||
"description": "테스트용 거래처 정보 입력 (타임스탬프로 고유성 보장)",
|
||||
"actions": [
|
||||
{"type": "generateTimestamp", "variable": "testTimestamp", "format": "MMDDHHmmss"},
|
||||
{"type": "fill", "target": "거래처명", "value": "E2E테스트_삭제용_{testTimestamp}", "description": "고유한 거래처명 입력"},
|
||||
{"type": "fill", "target": "사업자등록번호", "value": "123-45-67890", "description": "사업자번호 입력"},
|
||||
{"type": "fill", "target": "대표자명", "value": "테스트대표", "description": "대표자명 입력"},
|
||||
{"type": "select", "target": "거래처 유형", "value": "매출", "description": "거래처 유형 선택"},
|
||||
{"type": "fill", "target": "전화번호", "value": "02-1234-5678", "description": "전화번호 입력"},
|
||||
{"type": "fill", "target": "이메일", "value": "test@e2etest.com", "description": "이메일 입력"}
|
||||
{
|
||||
"type": "generateTimestamp",
|
||||
"variable": "testTimestamp",
|
||||
"format": "MMDDHHmmss"
|
||||
},
|
||||
{
|
||||
"type": "fill",
|
||||
"target": "거래처명",
|
||||
"value": "E2E테스트_삭제용_{testTimestamp}",
|
||||
"description": "고유한 거래처명 입력"
|
||||
},
|
||||
{
|
||||
"type": "fill",
|
||||
"target": "사업자등록번호",
|
||||
"value": "123-45-67890",
|
||||
"description": "사업자번호 입력"
|
||||
},
|
||||
{
|
||||
"type": "fill",
|
||||
"target": "대표자명",
|
||||
"value": "테스트대표",
|
||||
"description": "대표자명 입력"
|
||||
},
|
||||
{
|
||||
"type": "select",
|
||||
"target": "거래처 유형",
|
||||
"value": "매출",
|
||||
"description": "거래처 유형 선택"
|
||||
},
|
||||
{
|
||||
"type": "fill",
|
||||
"target": "전화번호",
|
||||
"value": "02-1234-5678",
|
||||
"description": "전화번호 입력"
|
||||
},
|
||||
{
|
||||
"type": "fill",
|
||||
"target": "이메일",
|
||||
"value": "test@e2etest.com",
|
||||
"description": "이메일 입력"
|
||||
}
|
||||
],
|
||||
"note": "타임스탬프를 사용하여 매 테스트마다 고유한 데이터 생성"
|
||||
},
|
||||
@@ -108,8 +204,15 @@
|
||||
"name": "📝 [CREATE] 등록 모달 - 등록 버튼 클릭",
|
||||
"description": "입력된 정보로 거래처 등록 실행",
|
||||
"actions": [
|
||||
{"type": "click_if_exists", "target": "button:has-text('등록'), button:has-text('저장')", "description": "모달 내 등록 버튼 클릭"},
|
||||
{"type": "wait", "duration": 2000}
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "button:has-text('등록'), button:has-text('저장')",
|
||||
"description": "모달 내 등록 버튼 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 2000
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"toast": "등록|완료|성공",
|
||||
@@ -118,7 +221,11 @@
|
||||
},
|
||||
"verification": {
|
||||
"level": 4,
|
||||
"checks": ["API 호출 확인", "성공 토스트 표시", "모달 닫힘"]
|
||||
"checks": [
|
||||
"API 호출 확인",
|
||||
"성공 토스트 표시",
|
||||
"모달 닫힘"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -128,9 +235,23 @@
|
||||
"description": "모달이 열려있으면 닫기 시도",
|
||||
"condition": "modalStillOpen",
|
||||
"actions": [
|
||||
{"type": "checkModalOpen", "description": "모달 열림 상태 확인"},
|
||||
{"type": "closeModal", "methods": ["cancel", "xButton", "escape"], "description": "모달 닫기 시도"},
|
||||
{"type": "wait", "duration": 500}
|
||||
{
|
||||
"type": "checkModalOpen",
|
||||
"description": "모달 열림 상태 확인"
|
||||
},
|
||||
{
|
||||
"type": "closeModal",
|
||||
"methods": [
|
||||
"cancel",
|
||||
"xButton",
|
||||
"escape"
|
||||
],
|
||||
"description": "모달 닫기 시도"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 500
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"modalClosed": true
|
||||
@@ -142,10 +263,27 @@
|
||||
"name": "📝 [CREATE] 등록 결과 확인",
|
||||
"description": "테이블에 새로 등록한 거래처가 표시되는지 확인",
|
||||
"actions": [
|
||||
{"type": "fill", "target": "검색", "value": "E2E테스트_삭제용", "description": "생성한 거래처 검색"},
|
||||
{"type": "pressKey", "key": "Enter"},
|
||||
{"type": "wait", "duration": 1500},
|
||||
{"type": "capture", "variable": "createdVendorRow", "selector": "table tbody tr:has-text('E2E테스트_삭제용')", "extract": "exists"}
|
||||
{
|
||||
"type": "fill",
|
||||
"target": "검색",
|
||||
"value": "E2E테스트_삭제용",
|
||||
"description": "생성한 거래처 검색"
|
||||
},
|
||||
{
|
||||
"type": "pressKey",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 1500
|
||||
},
|
||||
{
|
||||
"type": "capture",
|
||||
"variable": "createdVendorRow",
|
||||
"selector": "table tbody tr",
|
||||
"extract": "exists",
|
||||
"description": "테스트 거래처 행 존재 여부 확인"
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"rowExists": true,
|
||||
@@ -162,8 +300,15 @@
|
||||
"name": "✏️ [UPDATE] 생성된 거래처 상세 페이지 진입",
|
||||
"description": "생성한 테스트 거래처의 상세 페이지로 이동",
|
||||
"actions": [
|
||||
{"type": "click_if_exists", "target": "table tbody tr:has-text('E2E테스트_삭제용')", "description": "생성한 거래처 행 클릭"},
|
||||
{"type": "wait", "duration": 2000}
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "table tbody tr",
|
||||
"description": "첫 번째 거래처 행 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 2000
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"url": "/ko/accounting/vendors/",
|
||||
@@ -176,8 +321,15 @@
|
||||
"name": "✏️ [UPDATE] 수정 모드 진입",
|
||||
"description": "수정 버튼을 클릭하여 편집 모드로 전환",
|
||||
"actions": [
|
||||
{"type": "click_if_exists", "target": "button:has-text('수정')", "description": "수정 버튼 클릭"},
|
||||
{"type": "wait", "duration": 1000}
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "button:has-text('수정')",
|
||||
"description": "수정 버튼 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 1000
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"url": "mode=edit",
|
||||
@@ -190,9 +342,23 @@
|
||||
"name": "✏️ [UPDATE] 거래처명 수정",
|
||||
"description": "거래처명을 수정하여 UPDATE 동작 확인",
|
||||
"actions": [
|
||||
{"type": "clear", "target": "거래처명", "description": "기존 값 삭제"},
|
||||
{"type": "fill", "target": "거래처명", "value": "E2E테스트_수정완료_{testTimestamp}", "description": "수정된 거래처명 입력"},
|
||||
{"type": "fill", "target": "대표자명", "value": "수정대표", "description": "대표자명 수정"}
|
||||
{
|
||||
"type": "clear",
|
||||
"target": "거래처명",
|
||||
"description": "기존 값 삭제"
|
||||
},
|
||||
{
|
||||
"type": "fill",
|
||||
"target": "거래처명",
|
||||
"value": "E2E테스트_수정완료_{testTimestamp}",
|
||||
"description": "수정된 거래처명 입력"
|
||||
},
|
||||
{
|
||||
"type": "fill",
|
||||
"target": "대표자명",
|
||||
"value": "수정대표",
|
||||
"description": "대표자명 수정"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -201,10 +367,24 @@
|
||||
"name": "✏️ [UPDATE] 수정 저장",
|
||||
"description": "수정된 내용 저장",
|
||||
"actions": [
|
||||
{"type": "click_if_exists", "target": "button:has-text('저장')", "description": "저장 버튼 클릭"},
|
||||
{"type": "wait", "duration": 500},
|
||||
{"type": "click_if_exists", "target": "button:has-text('확인')", "description": "저장 확인 다이얼로그"},
|
||||
{"type": "wait", "duration": 2000}
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "button:has-text('저장')",
|
||||
"description": "저장 버튼 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 500
|
||||
},
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "button:has-text('확인')",
|
||||
"description": "저장 확인 다이얼로그"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 2000
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"toast": "수정|완료|성공",
|
||||
@@ -222,8 +402,17 @@
|
||||
"description": "다이얼로그가 열려있으면 닫기",
|
||||
"condition": "dialogStillOpen",
|
||||
"actions": [
|
||||
{"type": "checkModalOpen"},
|
||||
{"type": "closeModal", "methods": ["cancel", "xButton", "escape"]}
|
||||
{
|
||||
"type": "checkModalOpen"
|
||||
},
|
||||
{
|
||||
"type": "closeModal",
|
||||
"methods": [
|
||||
"cancel",
|
||||
"xButton",
|
||||
"escape"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -232,8 +421,16 @@
|
||||
"name": "✏️ [UPDATE] 수정 결과 확인",
|
||||
"description": "수정된 내용이 반영되었는지 확인",
|
||||
"actions": [
|
||||
{"type": "wait", "duration": 1000},
|
||||
{"type": "capture", "variable": "updatedVendorName", "selector": "[class*='vendor-name'], h1, h2", "extract": "text"}
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 1000
|
||||
},
|
||||
{
|
||||
"type": "capture",
|
||||
"variable": "updatedVendorName",
|
||||
"selector": "[class*='vendor-name'], h1, h2",
|
||||
"extract": "text"
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"contains": "E2E테스트_수정완료"
|
||||
@@ -245,8 +442,15 @@
|
||||
"name": "🗑️ [DELETE] 삭제 버튼 클릭",
|
||||
"description": "테스트용으로 생성한 거래처 삭제 시작",
|
||||
"actions": [
|
||||
{"type": "click_if_exists", "target": "button:has-text('삭제')", "description": "삭제 버튼 클릭"},
|
||||
{"type": "wait", "duration": 500}
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "button:has-text('삭제')",
|
||||
"description": "삭제 버튼 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 500
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"confirmDialog": true,
|
||||
@@ -260,10 +464,21 @@
|
||||
"name": "🗑️ [DELETE] 삭제 확인 다이얼로그 검증",
|
||||
"description": "삭제 확인 다이얼로그 UI 요소 확인",
|
||||
"actions": [
|
||||
{"type": "verify", "target": "dialog", "checks": ["삭제 확인 메시지", "취소 버튼", "확인/삭제 버튼"]}
|
||||
{
|
||||
"type": "verify",
|
||||
"target": "dialog",
|
||||
"checks": [
|
||||
"삭제 확인 메시지",
|
||||
"취소 버튼",
|
||||
"확인/삭제 버튼"
|
||||
]
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"dialogElements": ["취소", "확인|삭제"]
|
||||
"dialogElements": [
|
||||
"취소",
|
||||
"확인|삭제"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -272,8 +487,15 @@
|
||||
"name": "🗑️ [DELETE] 삭제 확인 버튼 클릭",
|
||||
"description": "삭제를 최종 확인하여 실행",
|
||||
"actions": [
|
||||
{"type": "click_if_exists", "target": "button:has-text('확인'), button:has-text('삭제')", "description": "삭제 확인 클릭"},
|
||||
{"type": "wait", "duration": 2000}
|
||||
{
|
||||
"type": "click_if_exists",
|
||||
"target": "button:has-text('확인'), button:has-text('삭제')",
|
||||
"description": "삭제 확인 클릭"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 2000
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"toast": "삭제|완료|성공",
|
||||
@@ -282,7 +504,11 @@
|
||||
},
|
||||
"verification": {
|
||||
"level": 4,
|
||||
"checks": ["DELETE API 호출", "성공 토스트", "목록 페이지로 리다이렉트"]
|
||||
"checks": [
|
||||
"DELETE API 호출",
|
||||
"성공 토스트",
|
||||
"목록 페이지로 리다이렉트"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -292,8 +518,17 @@
|
||||
"description": "다이얼로그가 열려있으면 닫기",
|
||||
"condition": "dialogStillOpen",
|
||||
"actions": [
|
||||
{"type": "checkModalOpen"},
|
||||
{"type": "closeModal", "methods": ["cancel", "xButton", "escape"]}
|
||||
{
|
||||
"type": "checkModalOpen"
|
||||
},
|
||||
{
|
||||
"type": "closeModal",
|
||||
"methods": [
|
||||
"cancel",
|
||||
"xButton",
|
||||
"escape"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -302,11 +537,29 @@
|
||||
"name": "✅ [VERIFY] 삭제 결과 확인 - 목록 페이지",
|
||||
"description": "삭제된 거래처가 목록에서 제거되었는지 확인",
|
||||
"actions": [
|
||||
{"type": "wait", "duration": 1000},
|
||||
{"type": "verifyUrl", "contains": "/ko/accounting/vendors", "description": "목록 페이지 확인"},
|
||||
{"type": "fill", "target": "검색", "value": "E2E테스트_수정완료", "description": "삭제된 거래처 검색"},
|
||||
{"type": "pressKey", "key": "Enter"},
|
||||
{"type": "wait", "duration": 1500}
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 1000
|
||||
},
|
||||
{
|
||||
"type": "verifyUrl",
|
||||
"contains": "/ko/accounting/vendors",
|
||||
"description": "목록 페이지 확인"
|
||||
},
|
||||
{
|
||||
"type": "fill",
|
||||
"target": "검색",
|
||||
"value": "E2E테스트_수정완료",
|
||||
"description": "삭제된 거래처 검색"
|
||||
},
|
||||
{
|
||||
"type": "pressKey",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 1500
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"noResults": true,
|
||||
@@ -319,8 +572,16 @@
|
||||
"name": "✅ [VERIFY] 최종 검증 - 데이터 삭제 확인",
|
||||
"description": "검색 결과에서 테스트 데이터가 없음을 최종 확인",
|
||||
"actions": [
|
||||
{"type": "capture", "variable": "searchResultCount", "selector": "table tbody tr", "extract": "count"},
|
||||
{"type": "verify", "condition": "searchResultCount === 0 OR no row contains 'E2E테스트'"}
|
||||
{
|
||||
"type": "capture",
|
||||
"variable": "searchResultCount",
|
||||
"selector": "table tbody tr",
|
||||
"extract": "count"
|
||||
},
|
||||
{
|
||||
"type": "verify",
|
||||
"condition": "searchResultCount === 0 OR no row contains 'E2E테스트'"
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"testDataDeleted": true,
|
||||
@@ -337,9 +598,18 @@
|
||||
"name": "🧹 [CLEANUP] 검색 초기화",
|
||||
"description": "테스트 종료 후 검색어 삭제하여 원래 상태로 복원",
|
||||
"actions": [
|
||||
{"type": "clear", "target": "검색"},
|
||||
{"type": "pressKey", "key": "Enter"},
|
||||
{"type": "wait", "duration": 1000}
|
||||
{
|
||||
"type": "clear",
|
||||
"target": "검색"
|
||||
},
|
||||
{
|
||||
"type": "pressKey",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"type": "wait",
|
||||
"duration": 1000
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"originalListRestored": true
|
||||
@@ -370,25 +640,45 @@
|
||||
{
|
||||
"id": 1,
|
||||
"name": "CREATE - 등록 기능",
|
||||
"steps": ["step-1", "step-2", "step-3", "step-4"],
|
||||
"steps": [
|
||||
"step-1",
|
||||
"step-2",
|
||||
"step-3",
|
||||
"step-4"
|
||||
],
|
||||
"criteria": "POST API 호출 + 성공 토스트 + 목록에 데이터 표시"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "UPDATE - 수정 기능",
|
||||
"steps": ["step-6", "step-7", "step-8", "step-9"],
|
||||
"steps": [
|
||||
"step-6",
|
||||
"step-7",
|
||||
"step-8",
|
||||
"step-9"
|
||||
],
|
||||
"criteria": "PUT API 호출 + 성공 토스트 + 데이터 변경 반영"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "DELETE - 삭제 기능",
|
||||
"steps": ["step-10", "step-11", "step-12", "step-13", "step-14"],
|
||||
"steps": [
|
||||
"step-10",
|
||||
"step-11",
|
||||
"step-12",
|
||||
"step-13",
|
||||
"step-14"
|
||||
],
|
||||
"criteria": "DELETE API 호출 + 성공 토스트 + 목록에서 데이터 제거"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "모달/다이얼로그 닫기",
|
||||
"steps": ["step-3-modal-close", "step-8-modal-close", "step-12-modal-close"],
|
||||
"steps": [
|
||||
"step-3-modal-close",
|
||||
"step-8-modal-close",
|
||||
"step-12-modal-close"
|
||||
],
|
||||
"criteria": "모든 모달/다이얼로그가 정상적으로 닫혀야 함"
|
||||
}
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user