- 54개 시나리오 파일에 URL 기반 메뉴 탐색을 위한 navigation 속성 추가 - targetUrl: 정확한 페이지 URL 경로 - urlPattern: ko 버전 포함 URL 패턴 (regex) - menuHints: 메뉴명 힌트 배열 (fallback용) 메뉴 탐색 실패율 41.8% → URL 기반 방식으로 개선 예정 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
497 lines
16 KiB
JSON
497 lines
16 KiB
JSON
{
|
|
"id": "vendor-management",
|
|
"name": "거래처관리 테스트",
|
|
"screenshotPolicy": {
|
|
"onErrorOnly": true,
|
|
"captureOn": ["error", "fail", "timeout", "404", "500", "blocked"]
|
|
},
|
|
"description": "회계관리 > 거래처관리 메뉴의 목록 조회, 필터, 검색, 상세 페이지 진입, 수정 및 저장 기능 테스트",
|
|
"baseUrl": "https://dev.codebridge-x.com",
|
|
"navigation": {
|
|
"targetUrl": "/accounting/vendors",
|
|
"urlPattern": "/accounting/vendors|/ko/accounting/vendors",
|
|
"menuHints": ["거래처관리", "거래처 관리", "회계관리"]
|
|
},
|
|
"menuNavigation": {
|
|
"level1": "회계관리",
|
|
"level2": "거래처관리",
|
|
"expectedUrl": "/ko/accounting/vendors"
|
|
},
|
|
"menuNavigationEnhanced": {
|
|
"strategy": "scroll-and-search",
|
|
"description": "사이드바를 스크롤하며 메뉴를 찾고 클릭하여 404를 방지",
|
|
"level1": "회계관리",
|
|
"level2": "거래처관리",
|
|
"alternativeLevel1Names": ["회계관리", "회계 관리", "Accounting"],
|
|
"alternativeLevel2Names": ["거래처관리", "거래처 관리", "Vendors"],
|
|
"scrollConfig": {
|
|
"sidebarSelector": "nav, aside, [role='navigation'], .sidebar, #sidebar",
|
|
"menuItemSelector": "a, button, [role='menuitem'], [role='treeitem']",
|
|
"scrollStep": 200,
|
|
"maxScrollAttempts": 10,
|
|
"scrollDelay": 300
|
|
}
|
|
},
|
|
"auth": {
|
|
"username": "TestUser5",
|
|
"password": "password123!"
|
|
},
|
|
"notes": {
|
|
"skip": ["등록 버튼 (추후 구현 예정)", "삭제 기능 (보류)"],
|
|
"focus": ["테이블 행 클릭 → 상세 페이지", "수정 모드 진입", "수정 후 저장"]
|
|
},
|
|
"steps": [
|
|
{
|
|
"id": "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 }
|
|
]
|
|
},
|
|
{
|
|
"id": "step-1",
|
|
"name": "2단계 메뉴 진입: 회계관리 > 거래처관리",
|
|
"description": "사이드바를 스크롤하며 회계관리 > 거래처관리 메뉴를 찾아 클릭",
|
|
"actions": [
|
|
{
|
|
"type": "scrollAndFind",
|
|
"target": "회계관리",
|
|
"alternativeTexts": ["회계관리", "회계 관리", "Accounting"],
|
|
"scrollContainer": "sidebar",
|
|
"maxAttempts": 10,
|
|
"description": "스크롤하며 회계관리 메뉴 찾기"
|
|
},
|
|
{ "type": "click", "target": "회계관리", "description": "회계관리 메뉴 클릭" },
|
|
{ "type": "wait", "duration": 500, "description": "서브메뉴 펼쳐지기 대기" },
|
|
{
|
|
"type": "scrollAndFind",
|
|
"target": "거래처관리",
|
|
"alternativeTexts": ["거래처관리", "거래처 관리", "Vendors"],
|
|
"scrollContainer": "submenu",
|
|
"maxAttempts": 5,
|
|
"description": "서브메뉴에서 거래처관리 찾기"
|
|
},
|
|
{ "type": "click", "target": "거래처관리", "description": "거래처관리 메뉴 클릭" },
|
|
{ "type": "wait", "target": "페이지 로드 완료", "timeout": 10000 }
|
|
],
|
|
"expect": {
|
|
"url": "/ko/accounting/vendors",
|
|
"pageTitle": "거래처관리",
|
|
"elements": ["통계 카드", "테이블", "검색창"]
|
|
},
|
|
"verification": [
|
|
"회계관리 메뉴가 펼쳐졌는지 확인",
|
|
"거래처관리 서브메뉴 클릭 성공",
|
|
"404 에러 없이 페이지 로드 완료"
|
|
]
|
|
},
|
|
{
|
|
"id": 3,
|
|
"name": "필수 검증 #5: 목업 페이지 감지",
|
|
"action": "verify_not_mockup",
|
|
"checks": [
|
|
"검색 입력 필드 존재",
|
|
"필터 드롭다운 존재 (구분, 신용등급, 거래등급, 악성채권, 정렬)",
|
|
"테이블 데이터 표시",
|
|
"API 호출 확인"
|
|
],
|
|
"expected": "정상 페이지 (목업 아님)"
|
|
},
|
|
{
|
|
"id": 4,
|
|
"name": "통계 카드 확인",
|
|
"action": "verify_elements",
|
|
"checks": [
|
|
"전체 거래처 카드 표시",
|
|
"매출 거래처 카드 표시",
|
|
"매입 거래처 카드 표시"
|
|
],
|
|
"expected": "3개 통계 카드 모두 표시"
|
|
},
|
|
{
|
|
"id": 5,
|
|
"name": "테이블 구조 확인",
|
|
"action": "verify_table",
|
|
"checks": [
|
|
"체크박스 컬럼",
|
|
"번호 컬럼",
|
|
"구분 컬럼 (매출/매입/매입매출)",
|
|
"거래처명 컬럼",
|
|
"매입 결제일 컬럼",
|
|
"매출 결제일 컬럼",
|
|
"신용등급 컬럼",
|
|
"거래등급 컬럼",
|
|
"미수금 컬럼",
|
|
"악성채권 컬럼",
|
|
"작업 컬럼"
|
|
],
|
|
"expected": "11개 컬럼 존재"
|
|
},
|
|
{
|
|
"id": 6,
|
|
"name": "⚠️ 필수 검증: 검색 기능",
|
|
"critical": true,
|
|
"description": "검색어 입력 후 테이블 데이터가 필터링되는지 확인",
|
|
"actions": [
|
|
{ "type": "capture", "variable": "beforeSearchCount", "selector": "table tbody tr", "extract": "count", "description": "검색 전 행 수 저장" },
|
|
{ "type": "fill", "target": "검색", "value": "가우스", "description": "검색어 '가우스' 입력" },
|
|
{ "type": "wait", "duration": 500, "description": "검색 결과 대기" },
|
|
{ "type": "capture", "variable": "afterSearchCount", "selector": "table tbody tr", "extract": "count", "description": "검색 후 행 수 저장" }
|
|
],
|
|
"verify": {
|
|
"searchApplied": true,
|
|
"tableContains": "가우스",
|
|
"dataFiltered": "검색어에 맞는 거래처만 필터링되어야 함"
|
|
},
|
|
"note": "⚠️ 검색어 입력 후 테이블에 '가우스'가 포함된 행만 표시되어야 함"
|
|
},
|
|
{
|
|
"id": 7,
|
|
"name": "검색 결과 데이터 검증",
|
|
"description": "검색 결과의 각 행에 검색어가 포함되어 있는지 확인",
|
|
"actions": [
|
|
{ "type": "wait", "duration": 300 }
|
|
],
|
|
"verify": {
|
|
"allRowsContain": "가우스",
|
|
"rowCountChanged": "beforeSearchCount !== afterSearchCount (데이터 필터링 확인)",
|
|
"verifyMethod": "테이블의 모든 행이 검색어 '가우스'를 포함하는지 확인"
|
|
},
|
|
"note": "테이블 행 수 변화, 검색어 포함 거래처명 표시"
|
|
},
|
|
{
|
|
"id": 8,
|
|
"name": "검색 초기화 및 복원 확인",
|
|
"description": "검색어 삭제 후 전체 목록 복원 확인",
|
|
"actions": [
|
|
{ "type": "clear", "target": "검색", "description": "검색어 삭제" },
|
|
{ "type": "wait", "duration": 500, "description": "목록 복원 대기" },
|
|
{ "type": "capture", "variable": "restoredRowCount", "selector": "table tbody tr", "extract": "count", "description": "복원 후 행 수 저장" }
|
|
],
|
|
"verify": {
|
|
"dataRestored": true,
|
|
"rowCountRestored": "beforeSearchCount와 유사한 행 수로 복원"
|
|
}
|
|
},
|
|
{
|
|
"id": 9,
|
|
"name": "구분 필터 테스트",
|
|
"action": "select_filter",
|
|
"target": "categoryFilter",
|
|
"value": "매출",
|
|
"expected": "매출 거래처만 필터링"
|
|
},
|
|
{
|
|
"id": 10,
|
|
"name": "구분 필터 초기화",
|
|
"action": "select_filter",
|
|
"target": "categoryFilter",
|
|
"value": "전체",
|
|
"expected": "전체 데이터 다시 표시"
|
|
},
|
|
{
|
|
"id": 11,
|
|
"name": "테이블 행 클릭 - 상세 페이지 이동",
|
|
"action": "click_row",
|
|
"target": "first_row",
|
|
"expected": "거래처 상세 페이지로 이동"
|
|
},
|
|
{
|
|
"id": 12,
|
|
"name": "상세 페이지 - URL 확인",
|
|
"action": "verify_url",
|
|
"checks": [
|
|
"URL에 거래처 ID 포함 (/accounting/vendors/{id})"
|
|
],
|
|
"expected": "URL 정상 전달"
|
|
},
|
|
{
|
|
"id": 13,
|
|
"name": "상세 페이지 - 헤더 확인",
|
|
"action": "verify_elements",
|
|
"checks": [
|
|
"거래처 상세 타이틀",
|
|
"목록 버튼 존재",
|
|
"삭제 버튼 존재",
|
|
"수정 버튼 존재"
|
|
],
|
|
"expected": "상세 페이지 헤더 정상 표시"
|
|
},
|
|
{
|
|
"id": 14,
|
|
"name": "상세 페이지 - 기본 정보 카드 확인",
|
|
"action": "verify_detail_info",
|
|
"checks": [
|
|
"사업자등록번호 필드",
|
|
"거래처코드 필드",
|
|
"거래처명 필드",
|
|
"대표자명 필드",
|
|
"거래처 유형 필드",
|
|
"업태 필드",
|
|
"업종 필드"
|
|
],
|
|
"expected": "기본 정보 모두 표시 (읽기 전용)"
|
|
},
|
|
{
|
|
"id": 15,
|
|
"name": "상세 페이지 - 연락처 정보 확인",
|
|
"action": "verify_detail_info",
|
|
"checks": [
|
|
"주소 필드",
|
|
"전화번호 필드",
|
|
"모바일 필드",
|
|
"팩스 필드",
|
|
"이메일 필드"
|
|
],
|
|
"expected": "연락처 정보 모두 표시"
|
|
},
|
|
{
|
|
"id": 16,
|
|
"name": "상세 페이지 - 담당자 정보 확인",
|
|
"action": "verify_detail_info",
|
|
"checks": [
|
|
"담당자명 필드",
|
|
"담당자 전화 필드",
|
|
"시스템 관리자 필드"
|
|
],
|
|
"expected": "담당자 정보 모두 표시"
|
|
},
|
|
{
|
|
"id": 17,
|
|
"name": "상세 페이지 - 회사 정보 확인",
|
|
"action": "verify_detail_info",
|
|
"checks": [
|
|
"회사 로고 영역",
|
|
"매입 결제일 필드",
|
|
"매출 결제일 필드"
|
|
],
|
|
"expected": "회사 정보 모두 표시"
|
|
},
|
|
{
|
|
"id": 18,
|
|
"name": "상세 페이지 - 신용/거래 정보 확인",
|
|
"action": "verify_detail_info",
|
|
"checks": [
|
|
"신용등급 필드",
|
|
"거래등급 필드",
|
|
"세금계산서 이메일 필드",
|
|
"입금계좌 은행 필드",
|
|
"계좌 필드",
|
|
"예금주 필드"
|
|
],
|
|
"expected": "신용/거래 정보 모두 표시"
|
|
},
|
|
{
|
|
"id": 19,
|
|
"name": "상세 페이지 - 추가 정보 확인",
|
|
"action": "verify_detail_info",
|
|
"checks": [
|
|
"미수금 필드",
|
|
"악성채권 금액 필드",
|
|
"악성채권 상태 필드"
|
|
],
|
|
"expected": "추가 정보 모두 표시"
|
|
},
|
|
{
|
|
"id": 20,
|
|
"name": "상세 페이지 - 메모 섹션 확인",
|
|
"action": "verify_elements",
|
|
"checks": [
|
|
"메모 카드 존재",
|
|
"메모 리스트 또는 빈 메시지"
|
|
],
|
|
"expected": "메모 섹션 표시"
|
|
},
|
|
{
|
|
"id": 21,
|
|
"name": "핵심 테스트: 수정 버튼 클릭",
|
|
"action": "click_button",
|
|
"target": "수정",
|
|
"expected": "수정 모드로 전환 (URL에 ?mode=edit 추가)"
|
|
},
|
|
{
|
|
"id": 22,
|
|
"name": "수정 모드 - URL 확인",
|
|
"action": "verify_url",
|
|
"checks": [
|
|
"URL에 mode=edit 파라미터 포함"
|
|
],
|
|
"expected": "수정 모드 URL 정상"
|
|
},
|
|
{
|
|
"id": 23,
|
|
"name": "수정 모드 - 필드 편집 가능 확인",
|
|
"action": "verify_edit_mode",
|
|
"checks": [
|
|
"거래처명 입력 가능",
|
|
"대표자명 입력 가능",
|
|
"전화번호 입력 가능",
|
|
"이메일 입력 가능",
|
|
"저장 버튼 존재",
|
|
"취소 버튼 존재"
|
|
],
|
|
"expected": "수정 모드에서 필드 편집 가능"
|
|
},
|
|
{
|
|
"id": 24,
|
|
"name": "핵심 테스트: 거래처명 수정",
|
|
"action": "edit_field",
|
|
"target": "vendorName",
|
|
"value": " (수정테스트)",
|
|
"mode": "append",
|
|
"expected": "거래처명에 ' (수정테스트)' 추가"
|
|
},
|
|
{
|
|
"id": 25,
|
|
"name": "핵심 테스트: 저장 버튼 클릭",
|
|
"action": "click_button",
|
|
"target": "저장",
|
|
"expected": "저장 확인 다이얼로그 표시"
|
|
},
|
|
{
|
|
"id": 26,
|
|
"name": "핵심 테스트: 저장 확인 다이얼로그",
|
|
"action": "verify_dialog",
|
|
"checks": [
|
|
"수정 확인 타이틀",
|
|
"확인 메시지 표시",
|
|
"취소 버튼 존재",
|
|
"확인 버튼 존재"
|
|
],
|
|
"expected": "저장 확인 다이얼로그 정상 표시"
|
|
},
|
|
{
|
|
"id": 27,
|
|
"name": "필수 검증 #2: 저장 확인 버튼 클릭",
|
|
"action": "click_dialog_confirm",
|
|
"target": "확인",
|
|
"checks": [
|
|
"URL 변경 여부 확인",
|
|
"에러 페이지 감지",
|
|
"API 호출 확인 (PUT /api/v1/clients/{id})",
|
|
"성공 토스트 (수정이 완료되었습니다)",
|
|
"상세 페이지로 복귀"
|
|
],
|
|
"expected": "수정 완료 및 상세 페이지 복귀"
|
|
},
|
|
{
|
|
"id": 28,
|
|
"name": "수정 결과 확인",
|
|
"action": "verify_data_change",
|
|
"checks": [
|
|
"거래처명에 수정된 값 반영",
|
|
"view 모드로 복귀 (수정 버튼 표시)"
|
|
],
|
|
"expected": "수정된 데이터 정상 반영"
|
|
},
|
|
{
|
|
"id": 29,
|
|
"name": "원래 값 복원 - 수정 버튼 클릭",
|
|
"action": "click_button",
|
|
"target": "수정",
|
|
"expected": "수정 모드로 전환"
|
|
},
|
|
{
|
|
"id": 30,
|
|
"name": "원래 값 복원 - 거래처명 수정",
|
|
"action": "edit_field",
|
|
"target": "vendorName",
|
|
"value": "",
|
|
"mode": "remove_suffix",
|
|
"suffix": " (수정테스트)",
|
|
"expected": "거래처명에서 ' (수정테스트)' 제거"
|
|
},
|
|
{
|
|
"id": 31,
|
|
"name": "원래 값 복원 - 저장",
|
|
"action": "click_button",
|
|
"target": "저장",
|
|
"expected": "저장 확인 다이얼로그 표시"
|
|
},
|
|
{
|
|
"id": 32,
|
|
"name": "원래 값 복원 - 저장 확인",
|
|
"action": "click_dialog_confirm",
|
|
"target": "확인",
|
|
"expected": "원래 값으로 복원 완료"
|
|
},
|
|
{
|
|
"id": 33,
|
|
"name": "목록 버튼 클릭 - 목록 복귀",
|
|
"action": "click_button",
|
|
"target": "목록",
|
|
"expected": "거래처관리 목록 페이지로 복귀"
|
|
},
|
|
{
|
|
"id": 34,
|
|
"name": "목록 페이지 복귀 확인",
|
|
"action": "verify_url",
|
|
"target": "/ko/accounting/vendors",
|
|
"expected": "목록 페이지 정상 표시"
|
|
}
|
|
],
|
|
"requiredVerifications": [
|
|
{
|
|
"id": 1,
|
|
"name": "등록/저장 버튼",
|
|
"steps": [25, 26, 27],
|
|
"criteria": "저장 다이얼로그 확인 + API 호출 + 성공 토스트 + 데이터 반영"
|
|
},
|
|
{
|
|
"id": 2,
|
|
"name": "등록 버튼 (신규)",
|
|
"steps": [],
|
|
"criteria": "보류 - 추후 구현 예정"
|
|
},
|
|
{
|
|
"id": 3,
|
|
"name": "검색/필터",
|
|
"steps": [6, 7, 8, 9, 10],
|
|
"criteria": "검색 및 필터 시 데이터 변화 확인"
|
|
},
|
|
{
|
|
"id": 4,
|
|
"name": "삭제 기능",
|
|
"steps": [],
|
|
"criteria": "보류 - 테스트 대상에서 제외"
|
|
},
|
|
{
|
|
"id": 5,
|
|
"name": "목업 페이지 감지",
|
|
"steps": [3],
|
|
"criteria": "입력 필드, 동작 버튼, API 호출 확인"
|
|
}
|
|
],
|
|
"testData": {
|
|
"searchKeyword": "가우스",
|
|
"editSuffix": " (수정테스트)"
|
|
},
|
|
"expectedAPIs": [
|
|
{
|
|
"method": "GET",
|
|
"endpoint": "/api/v1/clients",
|
|
"description": "거래처 목록 조회"
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"endpoint": "/api/v1/clients/{id}",
|
|
"description": "거래처 상세 조회"
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"endpoint": "/api/v1/clients/{id}",
|
|
"description": "거래처 수정"
|
|
}
|
|
]
|
|
}
|