2026-01-30 10:50:38 +09:00
{
refactor: E2E 시나리오 전면 개선 (43파일)
- Phase 0: 미구현 모듈 시나리오 13개 삭제 (구매관리, 중복, 라우트 없음)
- Phase 2: Settings URL 불일치 수정 (position, attendance, vacation-policy, bank-account, account, notification)
- Phase 3-4: 비설정 시나리오 URL/메뉴/UI 수정 (inventory-status, receiving-management, price-management, customer-inquiry, shipment-management, sales-client, quality-certification, customer-notice, production-* 등)
- Phase 5-6: 복잡 시나리오 재작성 (draft-box 50→14스텝, department-add 18→10스텝, free-board 70→22스텝, crud-delete-freeboard 14→17스텝)
- 16개 disabled 시나리오 enabled 전환
- 비표준 액션(fillInModal, randomData, usePlaywrightNative 등) → step-executor 표준 액션으로 통일
2026-02-06 17:37:35 +09:00
"enabled" : true ,
2026-01-30 10:50:38 +09:00
"id" : "withdrawal-management" ,
"name" : "출금관리 테스트" ,
"screenshotPolicy" : {
"onErrorOnly" : true ,
2026-02-09 15:05:03 +09:00
"captureOn" : [
"error" ,
"fail" ,
"timeout" ,
"404" ,
"500" ,
"blocked"
]
2026-01-30 10:50:38 +09:00
} ,
"description" : "출금관리 목록 조회, 계정과목명 일괄변경, 상세 수정 기능 E2E 테스트" ,
"baseUrl" : "https://dev.codebridge-x.com" ,
"url" : "/ko/accounting/withdrawals" ,
2026-01-30 21:47:29 +09:00
"navigation" : {
"targetUrl" : "/accounting/withdrawals" ,
"urlPattern" : "/accounting/withdrawals|/ko/accounting/withdrawals" ,
2026-02-09 15:05:03 +09:00
"menuHints" : [
"출금관리" ,
"출금 관리" ,
"회계관리"
]
2026-01-30 21:47:29 +09:00
} ,
2026-01-30 10:50:38 +09:00
"menuNavigation" : {
"level1" : "회계관리" ,
"level2" : "출금관리" ,
2026-02-04 21:59:56 +09:00
"expectedUrl" : "/ko/accounting/withdrawals" ,
"searchWithinParent" : true ,
"closeOtherMenus" : true
2026-01-30 10:50:38 +09:00
} ,
"menuNavigationEnhanced" : {
"strategy" : "scroll-and-search" ,
"sidebarSelector" : ".sidebar-scroll, [data-sidebar], nav[role='navigation']" ,
"scrollBehavior" : {
"direction" : "down" ,
"step" : 200 ,
"maxScrolls" : 10 ,
"waitAfterScroll" : 300
} ,
"level1" : {
"text" : "회계관리" ,
"expandable" : true ,
"waitAfterClick" : 500
} ,
"level2" : {
"text" : "출금관리" ,
"waitAfterClick" : 300
} ,
"fallbackUrl" : "/ko/accounting/withdrawals" ,
"verification" : {
"urlContains" : "/accounting/withdrawals" ,
"timeout" : 5000
}
} ,
"timeout" : 60000 ,
2026-02-09 15:05:03 +09:00
"tags" : [
"accounting" ,
"withdrawal" ,
"crud"
] ,
2026-02-04 21:59:56 +09:00
"auth" : {
"username" : "TestUser5" ,
"password" : "password123!"
2026-01-30 10:50:38 +09:00
} ,
"steps" : [
{
2026-02-09 15:05:03 +09:00
"id" : 1 ,
2026-01-30 16:26:52 +09:00
"name" : "사이드바 메뉴 전체 펼치기" ,
"description" : "모두 펼치기 버튼을 클릭하여 전체 메뉴를 펼친 후 메뉴 탐색 준비" ,
2026-02-28 17:21:01 +09:00
"action" : "evaluate" ,
"script" : "(async()=>{document.querySelector('.sidebar-scroll')?.scrollTo({top:0,behavior:'instant'});await new Promise(r=>setTimeout(r,300));Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.includes('모두 펼치기'))?.click();await new Promise(r=>setTimeout(r,2000));return 'sidebar expanded';})()" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"sidebarReady" : true
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 2 ,
2026-01-30 10:50:38 +09:00
"name" : "출금관리 메뉴 진입" ,
"description" : "회계관리 > 출금관리 메뉴로 이동 (scrollAndFind 패턴 사용)" ,
2026-02-28 17:21:01 +09:00
"action" : "menu_navigate" ,
"level1" : "회계관리" ,
"level2" : "출금관리" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"url" : "/accounting/withdrawals" ,
2026-02-09 15:05:03 +09:00
"visible" : [
"출금관리" ,
"총 출금"
]
2026-01-30 10:50:38 +09:00
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 3 ,
2026-01-30 10:50:38 +09:00
"name" : "목록 페이지 구조 확인" ,
"description" : "테이블 및 필터 요소 확인" ,
2026-02-28 17:21:01 +09:00
"action" : "verify_element" ,
"target" : "body" ,
2026-01-30 10:50:38 +09:00
"expect" : {
2026-02-09 15:05:03 +09:00
"visible" : [
"출금일" ,
"출금계좌" ,
"받는분" ,
"출금금액" ,
"거래처" ,
"적요" ,
"출금유형"
] ,
2026-01-30 10:50:38 +09:00
"elements" : {
2026-02-09 15:05:03 +09:00
"statisticsCards" : [
"총 출금" ,
"당월 출금" ,
"거래처 미설정" ,
"출금유형 미설정"
] ,
"filters" : [
"계정과목명" ,
"저장" ,
"새로고침"
] ,
2026-01-30 10:50:38 +09:00
"pagination" : true
}
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 4 ,
2026-01-30 10:50:38 +09:00
"name" : "계정과목명 드롭다운 옵션 확인" ,
"description" : "계정과목명 일괄변경 드롭다운 옵션 검증" ,
2026-02-28 17:21:01 +09:00
"action" : "click_if_exists" ,
"target" : "계정과목명 드롭다운" ,
2026-01-30 10:50:38 +09:00
"expect" : {
2026-02-09 15:05:03 +09:00
"options" : [
"미설정" ,
"매입대금" ,
"급여" ,
"임차료" ,
"수도광열비" ,
"통신비" ,
"소모품비" ,
"운반비" ,
"차량유지비" ,
"보험료" ,
"세금과공과" ,
"이자비용" ,
"수수료" ,
"기타"
]
2026-01-30 10:50:38 +09:00
} ,
"note" : "출금유형 옵션은 비용 계정 기준이므로 입금관리와 다름"
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 5 ,
2026-01-30 10:50:38 +09:00
"name" : "체크박스 선택 후 계정과목명 일괄변경" ,
"description" : "테이블 행 선택 후 계정과목명 일괄변경 저장" ,
2026-02-28 17:21:01 +09:00
"action" : "evaluate" ,
"script" : "(async()=>{const cb=document.querySelector('table tbody tr input[type=\"checkbox\"]');if(cb){cb.click();await new Promise(r=>setTimeout(r,500));}const dd=Array.from(document.querySelectorAll('button,select,[role=\"combobox\"]')).find(el=>el.innerText?.includes('계정과목명')||el.getAttribute('aria-label')?.includes('계정과목명'));if(dd){dd.click();await new Promise(r=>setTimeout(r,500));}const opt=Array.from(document.querySelectorAll('[role=\"option\"],li,button')).find(el=>el.innerText?.trim()==='매입대금');if(opt){opt.click();await new Promise(r=>setTimeout(r,500));}const saveBtn=Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.trim()==='저장');if(saveBtn){saveBtn.click();await new Promise(r=>setTimeout(r,1000));}return 'batch update attempted';})()" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"dialog" : "확인 다이얼로그 표시" ,
"dialogMessage" : "1개의 출금 유형을 매입대금(으)로 모두 변경하시겠습니까?" ,
"toast" : "변경 완료 메시지"
} ,
"checks" : [
"API 호출 확인 (PUT /api/v1/withdrawals/batch-update-account)" ,
"성공 토스트 메시지" ,
"URL 유지 확인"
]
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 6 ,
2026-02-28 17:21:01 +09:00
"name" : "필수 검증: 계정과목명 변경 데이터 반영 확인" ,
2026-01-30 10:50:38 +09:00
"note" : "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!" ,
"description" : "저장 후 테이블에서 변경된 출금유형 값 확인" ,
2026-02-28 17:21:01 +09:00
"action" : "verify_element" ,
"target" : "body" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"tableCell" : {
"row" : 1 ,
"column" : "출금유형" ,
"value" : "매입대금"
}
} ,
"checks" : [
"선택한 행의 출금유형 컬럼 값 확인" ,
"변경 전 값과 비교 (예: 미설정 → 매입대금)" ,
"페이지 새로고침 후에도 변경된 값 유지 확인" ,
"API 응답과 UI 표시값 일치 확인"
] ,
"knownBugReference" : "BUG-DEPOSIT-20260115-001 (입금관리 동일 버그 확인 필요)"
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 7 ,
2026-01-30 10:50:38 +09:00
"name" : "출금 상세 페이지 이동" ,
"description" : "테이블 행 클릭하여 상세 페이지로 이동" ,
2026-02-28 17:21:01 +09:00
"action" : "click_first_row" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"url" : "/accounting/withdrawals/{id}" ,
2026-02-09 15:05:03 +09:00
"visible" : [
"출금 상세" ,
"기본 정보" ,
"목록" ,
"삭제" ,
"수정"
]
2026-01-30 10:50:38 +09:00
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 8 ,
2026-01-30 10:50:38 +09:00
"name" : "상세 페이지 읽기 모드 필드 확인" ,
"description" : "수정 전 필드들이 비활성화 상태인지 확인" ,
2026-02-28 17:21:01 +09:00
"action" : "verify_element" ,
"target" : "body" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"fields" : [
2026-02-09 15:05:03 +09:00
{
"name" : "출금일" ,
"disabled" : true
} ,
{
"name" : "출금계좌" ,
"disabled" : true
} ,
{
"name" : "받는분" ,
"disabled" : true
} ,
{
"name" : "출금금액" ,
"disabled" : true
} ,
{
"name" : "적요" ,
"disabled" : true
} ,
{
"name" : "거래처" ,
"disabled" : true
} ,
{
"name" : "출금 유형" ,
"disabled" : true
}
2026-01-30 10:50:38 +09:00
]
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 9 ,
2026-01-30 10:50:38 +09:00
"name" : "수정 모드 전환" ,
"description" : "수정 버튼 클릭하여 편집 모드로 전환" ,
2026-02-28 17:21:01 +09:00
"action" : "click_if_exists" ,
"target" : "수정" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"url" : "/accounting/withdrawals/{id}?mode=edit" ,
2026-02-09 15:05:03 +09:00
"visible" : [
"출금 수정" ,
"취소" ,
"저장"
] ,
"notVisible" : [
"목록" ,
"삭제" ,
"수정"
]
2026-01-30 10:50:38 +09:00
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 10 ,
2026-01-30 10:50:38 +09:00
"name" : "수정 모드 필드 활성화 검증" ,
"description" : "수정 가능한 필드와 불가능한 필드 확인" ,
2026-02-28 17:21:01 +09:00
"action" : "verify_element" ,
"target" : "body" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"fields" : [
2026-02-09 15:05:03 +09:00
{
"name" : "출금일" ,
"disabled" : true ,
"note" : "은행데이터 - 수정 불가"
} ,
{
"name" : "출금계좌" ,
"disabled" : true ,
"note" : "은행데이터 - 수정 불가"
} ,
{
"name" : "받는분" ,
"disabled" : true ,
"note" : "은행데이터 - 수정 불가"
} ,
{
"name" : "출금금액" ,
"disabled" : true ,
"note" : "은행데이터 - 수정 불가"
} ,
{
"name" : "적요" ,
"disabled" : false ,
"editable" : true
} ,
{
"name" : "거래처" ,
"disabled" : false ,
"type" : "combobox" ,
"editable" : true
} ,
{
"name" : "출금 유형" ,
"disabled" : false ,
"type" : "combobox" ,
"editable" : true
}
2026-01-30 10:50:38 +09:00
]
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 11 ,
2026-01-30 10:50:38 +09:00
"name" : "거래처 드롭다운 옵션 확인" ,
"description" : "거래처 선택 드롭다운 옵션 검증" ,
2026-02-28 17:21:01 +09:00
"action" : "click_if_exists" ,
"target" : "거래처 드롭다운" ,
2026-01-30 10:50:38 +09:00
"expect" : {
2026-02-09 15:05:03 +09:00
"options" : [
"거래처테스트" ,
"아크더레드" ,
"코브라브릿지" ,
"가우스전자" ,
"아크아크"
] ,
2026-01-30 10:50:38 +09:00
"note" : "거래처 옵션은 시스템 공통 데이터"
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 12 ,
2026-01-30 10:50:38 +09:00
"name" : "출금 유형 드롭다운 옵션 확인" ,
"description" : "출금 유형 선택 드롭다운 옵션 검증" ,
2026-02-28 17:21:01 +09:00
"action" : "click_if_exists" ,
"target" : "출금 유형 드롭다운" ,
2026-01-30 10:50:38 +09:00
"expect" : {
2026-02-09 15:05:03 +09:00
"options" : [
"미설정" ,
"매입대금" ,
"급여" ,
"임차료" ,
"수도광열비" ,
"통신비" ,
"소모품비" ,
"운반비" ,
"차량유지비" ,
"보험료" ,
"세금과공과" ,
"이자비용" ,
"수수료" ,
"기타"
]
2026-01-30 10:50:38 +09:00
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 13 ,
2026-01-30 10:50:38 +09:00
"name" : "수정 데이터 입력" ,
"description" : "수정 가능한 필드에 테스트 데이터 입력" ,
2026-02-28 17:21:01 +09:00
"action" : "evaluate" ,
"script" : "(async()=>{const inputs=document.querySelectorAll('input,textarea');const memo=Array.from(inputs).find(el=>el.getAttribute('name')?.includes('적요')||el.getAttribute('placeholder')?.includes('적요')||el.closest('[class*=\"memo\"],label')?.innerText?.includes('적요'));if(memo){memo.focus();memo.value='';memo.dispatchEvent(new Event('input',{bubbles:true}));memo.value='테스트 적요 수정';memo.dispatchEvent(new Event('input',{bubbles:true}));memo.dispatchEvent(new Event('change',{bubbles:true}));await new Promise(r=>setTimeout(r,500));}const vendorDD=Array.from(document.querySelectorAll('button,[role=\"combobox\"]')).find(el=>el.innerText?.includes('거래처')||el.getAttribute('aria-label')?.includes('거래처'));if(vendorDD){vendorDD.click();await new Promise(r=>setTimeout(r,500));const vendorOpt=Array.from(document.querySelectorAll('[role=\"option\"],li')).find(el=>el.innerText?.trim()==='거래처테스트');if(vendorOpt){vendorOpt.click();await new Promise(r=>setTimeout(r,500));}}const typeDD=Array.from(document.querySelectorAll('button,[role=\"combobox\"]')).find(el=>el.innerText?.includes('출금 유형')||el.getAttribute('aria-label')?.includes('출금'));if(typeDD){typeDD.click();await new Promise(r=>setTimeout(r,500));const typeOpt=Array.from(document.querySelectorAll('[role=\"option\"],li')).find(el=>el.innerText?.trim()==='매입대금');if(typeOpt){typeOpt.click();await new Promise(r=>setTimeout(r,500));}}return 'form filled';})()"
2026-01-30 10:50:38 +09:00
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 14 ,
2026-01-30 10:50:38 +09:00
"name" : "저장 및 결과 확인" ,
"description" : "저장 버튼 클릭 후 데이터 반영 확인" ,
2026-02-28 17:21:01 +09:00
"action" : "click_if_exists" ,
"target" : "저장" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"toast" : "저장 완료 메시지" ,
"url" : "/accounting/withdrawals/{id}" ,
"mode" : "view"
} ,
"checks" : [
"API 호출 확인 (PUT /api/v1/withdrawals/{id})" ,
"성공 토스트 메시지" ,
"URL 유지 확인 (에러 페이지 이동 금지)"
]
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 15 ,
2026-02-28 17:21:01 +09:00
"name" : "필수 검증: 수정 데이터 반영 확인" ,
2026-01-30 10:50:38 +09:00
"note" : "토스트 성공 메시지만으로 PASS 판정 불가. 실제 데이터 변경 확인 필수!" ,
"description" : "저장 후 상세 페이지에서 변경된 값 확인" ,
2026-02-28 17:21:01 +09:00
"action" : "verify_detail" ,
"checks" : [
"적요: 테스트 적요 수정" ,
"거래처: 거래처테스트" ,
"출금 유형: 매입대금"
] ,
2026-01-30 10:50:38 +09:00
"expect" : {
"fields" : [
2026-02-09 15:05:03 +09:00
{
"name" : "적요" ,
"value" : "테스트 적요 수정"
} ,
{
"name" : "거래처" ,
"value" : "거래처테스트"
} ,
{
"name" : "출금 유형" ,
"value" : "매입대금"
}
2026-01-30 10:50:38 +09:00
]
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 16 ,
2026-01-30 10:50:38 +09:00
"name" : "취소 버튼 동작 확인" ,
"description" : "수정 모드에서 취소 버튼 동작 검증" ,
2026-02-28 17:21:01 +09:00
"action" : "evaluate" ,
"script" : "(async()=>{const editBtn=Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.trim()==='수정');if(editBtn){editBtn.click();await new Promise(r=>setTimeout(r,1000));}const cancelBtn=Array.from(document.querySelectorAll('button')).find(b=>b.innerText?.trim()==='취소');if(cancelBtn){cancelBtn.click();await new Promise(r=>setTimeout(r,1000));}return 'cancel tested';})()" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"url" : "/accounting/withdrawals/{id}" ,
"mode" : "view" ,
2026-02-09 15:05:03 +09:00
"visible" : [
"출금 상세" ,
"목록" ,
"삭제" ,
"수정"
]
2026-01-30 10:50:38 +09:00
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 17 ,
2026-01-30 10:50:38 +09:00
"name" : "목록 버튼 동작 확인" ,
"description" : "목록 버튼 클릭하여 목록 페이지로 이동" ,
2026-02-28 17:21:01 +09:00
"action" : "click_if_exists" ,
"target" : "목록" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"url" : "/accounting/withdrawals" ,
2026-02-09 15:05:03 +09:00
"visible" : [
"출금관리" ,
"총 출금"
]
2026-01-30 10:50:38 +09:00
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 18 ,
2026-01-30 10:50:38 +09:00
"name" : "필터 드롭다운 검증" ,
"description" : "목록 페이지 필터 드롭다운 옵션 확인" ,
"note" : "3개의 필터 드롭다운 존재 (거래처, 출금유형, 정렬)" ,
2026-02-28 17:21:01 +09:00
"action" : "verify_element" ,
"target" : "body" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"filters" : [
2026-02-09 15:05:03 +09:00
{
"name" : "거래처 필터" ,
"default" : "전체"
} ,
{
"name" : "출금유형 필터" ,
"default" : "전체"
} ,
{
"name" : "정렬" ,
"default" : "최신순" ,
"options" : [
"최신순" ,
"등록순" ,
"금액 높은순" ,
"금액 낮은순"
]
}
2026-01-30 10:50:38 +09:00
]
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 19 ,
2026-01-30 10:50:38 +09:00
"name" : "날짜 필터 검증" ,
"description" : "날짜 필터 버튼 동작 확인" ,
2026-02-28 17:21:01 +09:00
"action" : "click_if_exists" ,
"target" : "당해년도" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"dateRange" : {
"start" : "2026-01-01" ,
"end" : "2026-12-31"
}
}
} ,
{
2026-02-09 15:05:03 +09:00
"id" : 20 ,
2026-01-30 10:50:38 +09:00
"name" : "페이지네이션 동작 확인" ,
"description" : "페이지네이션 버튼 동작 검증 (데이터 존재 시)" ,
"condition" : "데이터가 20건 이상인 경우에만 실행" ,
2026-02-28 17:21:01 +09:00
"action" : "click_if_exists" ,
"target" : "다음" ,
2026-01-30 10:50:38 +09:00
"expect" : {
"pagination" : {
"itemsPerPage" : 20 ,
"currentPage" : 1
}
} ,
"expectAfterAction" : {
"currentPage" : 2
}
2026-02-09 15:05:03 +09:00
} ,
{
"id" : 21 ,
"name" : "콘솔 에러 확인" ,
"action" : "verify_element" ,
"target" : "body"
2026-01-30 10:50:38 +09:00
}
] ,
"skipTests" : [
{
"id" : "delete-button" ,
"name" : "삭제 버튼 테스트" ,
"reason" : "사용자 요청에 따라 테스트 제외"
}
] ,
"knownBugs" : [
{
"id" : "BUG-DEPOSIT-20260115-001" ,
"description" : "계정과목명 일괄변경 시 API 오류 발생 (입금관리)" ,
"errorMessage" : "존재하지 않는 URI 또는 데이터" ,
2026-02-09 15:05:03 +09:00
"relatedSteps" : [
"step-4-1"
] ,
2026-01-30 10:50:38 +09:00
"note" : "출금관리에서도 동일한 버그가 존재할 수 있으므로 step-4-1에서 검증 필수"
} ,
{
"id" : "BUG-SALES-20260115-001" ,
"description" : "계정과목명 일괄변경 시 토스트 성공 표시되나 실제 데이터 미변경 (매출관리)" ,
2026-02-09 15:05:03 +09:00
"relatedSteps" : [
"step-4-1"
] ,
2026-01-30 10:50:38 +09:00
"note" : "유사한 UI 패턴이므로 동일 버그 가능성 있음"
}
] ,
"criticalValidationChecklist" : [
{
"id" : 1 ,
"name" : "파일 다운로드 검증" ,
"trigger" : "다운로드, Export 버튼 발견 시" ,
2026-02-09 15:05:03 +09:00
"checks" : [
"Network API 호출" ,
"실제 파일 다운로드"
] ,
2026-01-30 10:50:38 +09:00
"note" : "Console LOG만으로 PASS 판정 금지"
} ,
{
"id" : 2 ,
"name" : "등록/저장 버튼 검증" ,
"trigger" : "등록, 저장, 제출 버튼 클릭 시" ,
2026-02-09 15:05:03 +09:00
"checks" : [
"URL 유지 확인" ,
"에러 페이지 없음" ,
"성공 토스트"
] ,
2026-01-30 10:50:38 +09:00
"note" : "에러 페이지 이동 감지 필수"
} ,
{
"id" : 3 ,
"name" : "일괄변경 데이터 반영 검증" ,
"trigger" : "계정과목명 저장 후" ,
2026-02-09 15:05:03 +09:00
"checks" : [
"테이블 데이터 변경 확인" ,
"새로고침 후 유지 확인"
] ,
2026-01-30 10:50:38 +09:00
"note" : "토스트만 확인하면 불충분"
} ,
{
"id" : 4 ,
"name" : "목업 페이지 감지" ,
"trigger" : "페이지 로드 시" ,
2026-02-09 15:05:03 +09:00
"checks" : [
"입력 필드 존재" ,
"동작하는 버튼 존재" ,
"API 호출 여부"
] ,
2026-01-30 10:50:38 +09:00
"note" : "버튼만 있고 동작 안하면 목업"
}
] ,
"testData" : {
"sampleWithdrawal" : {
"date" : "2025-12-28" ,
"account" : "운영계좌" ,
"recipient" : "홍길동" ,
"amount" : "1,500,000" ,
"vendor" : "" ,
"description" : "급여 지급" ,
"withdrawalType" : "미설정"
} ,
"modifiedData" : {
"description" : "테스트 적요 수정" ,
"vendor" : "거래처테스트" ,
"withdrawalType" : "매입대금"
}
} ,
"pageStructure" : {
"listPage" : {
"url" : "/accounting/withdrawals" ,
"title" : "출금관리" ,
2026-02-09 15:05:03 +09:00
"statistics" : [
"총 출금" ,
"당월 출금" ,
"거래처 미설정" ,
"출금유형 미설정"
] ,
"tableColumns" : [
"checkbox" ,
"출금일" ,
"출금계좌" ,
"받는분" ,
"출금금액" ,
"거래처" ,
"적요" ,
"출금유형" ,
"action"
] ,
2026-01-30 10:50:38 +09:00
"batchUpdate" : {
"label" : "계정과목명" ,
"saveButton" : "저장"
} ,
2026-02-09 15:05:03 +09:00
"filters" : [
"거래처" ,
"출금유형" ,
"정렬"
] ,
"dateFilters" : [
"당해년도" ,
"전전월" ,
"전월" ,
"당월" ,
"어제" ,
"오늘"
]
2026-01-30 10:50:38 +09:00
} ,
"detailPage" : {
"url" : "/accounting/withdrawals/{id}" ,
"title" : "출금 상세" ,
2026-02-09 15:05:03 +09:00
"buttons" : [
"목록" ,
"삭제" ,
"수정"
] ,
2026-01-30 10:50:38 +09:00
"fields" : {
2026-02-09 15:05:03 +09:00
"readOnly" : [
"출금일" ,
"출금계좌" ,
"받는분" ,
"출금금액"
] ,
"editable" : [
"적요" ,
"거래처" ,
"출금 유형"
]
2026-01-30 10:50:38 +09:00
}
} ,
"editPage" : {
"url" : "/accounting/withdrawals/{id}?mode=edit" ,
"title" : "출금 수정" ,
2026-02-09 15:05:03 +09:00
"buttons" : [
"취소" ,
"저장"
]
2026-01-30 10:50:38 +09:00
}
} ,
"dropdownOptions" : {
"accountSubject" : {
"label" : "계정과목명" ,
2026-02-09 15:05:03 +09:00
"options" : [
"미설정" ,
"매입대금" ,
"급여" ,
"임차료" ,
"수도광열비" ,
"통신비" ,
"소모품비" ,
"운반비" ,
"차량유지비" ,
"보험료" ,
"세금과공과" ,
"이자비용" ,
"수수료" ,
"기타"
] ,
2026-01-30 10:50:38 +09:00
"note" : "출금유형은 비용 계정 기준 (입금유형과 다름)"
} ,
"withdrawalType" : {
"label" : "출금 유형" ,
2026-02-09 15:05:03 +09:00
"options" : [
"미설정" ,
"매입대금" ,
"급여" ,
"임차료" ,
"수도광열비" ,
"통신비" ,
"소모품비" ,
"운반비" ,
"차량유지비" ,
"보험료" ,
"세금과공과" ,
"이자비용" ,
"수수료" ,
"기타"
]
2026-01-30 10:50:38 +09:00
} ,
"vendor" : {
"label" : "거래처" ,
2026-02-09 15:05:03 +09:00
"options" : [
"거래처테스트" ,
"아크더레드" ,
"코브라브릿지" ,
"가우스전자" ,
"아크아크"
]
2026-01-30 10:50:38 +09:00
} ,
"sortOrder" : {
"label" : "정렬" ,
2026-02-09 15:05:03 +09:00
"options" : [
"최신순" ,
"등록순" ,
"금액 높은순" ,
"금액 낮은순"
]
2026-01-30 10:50:38 +09:00
}
} ,
"comparisonWithDeposit" : {
"differences" : [
{
"field" : "계정과목/유형 옵션" ,
"deposit" : "매출대금, 선수금, 가수금, 임대수익, 이자수익, 보증금 반환, 차입금, 자본금, 부가세 환급, 기타 (수입 계정)" ,
"withdrawal" : "매입대금, 급여, 임차료, 수도광열비, 통신비, 소모품비, 운반비, 차량유지비, 보험료, 세금과공과, 이자비용, 수수료, 기타 (비용 계정)"
} ,
{
"field" : "테이블 컬럼명" ,
"deposit" : "입금일, 입금계좌, 입금자명, 입금금액, 입금유형" ,
"withdrawal" : "출금일, 출금계좌, 받는분, 출금금액, 출금유형"
} ,
{
"field" : "통계 카드" ,
"deposit" : "총 입금, 당월 입금, 입금유형 미설정" ,
"withdrawal" : "총 출금, 당월 출금, 출금유형 미설정"
}
] ,
"similarities" : [
"페이지 구조 (목록 → 상세 → 수정)" ,
"계정과목명 일괄변경 기능" ,
"거래처 드롭다운 옵션 (공통 데이터)" ,
"날짜 필터 버튼 (당해년도, 전전월, 전월, 당월, 어제, 오늘)" ,
"정렬 옵션 (최신순, 등록순, 금액 높은순, 금액 낮은순)" ,
"은행 데이터 필드 수정 불가 (날짜, 계좌, 금액 등)"
]
} ,
"assertions" : [
{
"type" : "url" ,
"expected" : "/accounting/withdrawals" ,
"message" : "목록 페이지 URL 확인"
} ,
{
"type" : "text" ,
"target" : "body" ,
"expected" : "출금관리" ,
"message" : "페이지 타이틀 확인"
}
]
2026-02-28 17:21:01 +09:00
}