Skip to content

[7팀 권연욱] Chapter 1-3. 완성도있는 테스트 전략 수립하기 - #32

Open
grappe96 wants to merge 9 commits into
hanghae-plus:mainfrom
grappe96:main
Open

grappe96 wants to merge 9 commits into
hanghae-plus:mainfrom
grappe96:main

Conversation

@grappe96

@grappe96 grappe96 commented Nov 3, 2025

Copy link
Copy Markdown

과제 3

필수 스펙

  • 드래그 앤 드롭(D&D) 기능 개발
    • 캘린더의 일정을 마우스로 끌어 다른 날짜나 시간으로 옮기는 기능을 구현합니다.
  • 날짜 클릭으로 일정 생성 기능 개발
    • 캘린더의 비어있는 날짜 셀을 클릭하면, 해당 날짜가 자동으로 폼에 채워지도록 하세요.

기본 과제

필수 스펙 개발과 E2E, 시각적 회귀 테스트를 모두 작성해주세요.

기본과제 제출

  • 아래 작성된 E2E 테스트 작성은 필수입니다. 추가로 작성하고 싶다면 작성해주세요.
  • 여기서 말하는 전반은 Create, Read, Update, Delete 모두에 해당합니다.
  1. 기본 일정 관리 워크플로우 전반을 검증하세요.
  2. 반복 일정 관리 워크플로우 전반을 검증하세요.
  3. 일정 겹침 처리 방식에 대해 검증하세요.
  4. 알림 시스템 관련 노출 조건에 대해 검증하세요.
  5. 검색 및 필터링 전반에 대해 검증하세요.
  • 아래 시각적 회귀 테스트는 필수 입니다. 추가로 작성하고 싶다면 작성해주세요.
  1. 타입에 따른 캘린더 뷰 렌더링
  2. 일정 상태별 시각적 표현
  3. 다이얼로그 및 모달
  4. 폼 컨트롤 상태
  5. 각 셀 텍스트 길이에 따른 처리
♨️
이 과정에서 컴포넌트 리팩토링이 필요할 수 있습니다!
여유가 있다면 컴포넌트를 아름답게 분리하는 고민을 해주시면 좋지만,
당장은 적절한 스토리를 작성하는데 더 집중해주세요.
적절한 추상화, 응집도를 높이고 결합도를 낮추는
우아한 설계는 이후 주차때 좀 더 집중해봐요.
- 물론, AI를 활용해도 좋습니다.
- 기존에 작성한 테스트는 깨지지 않도록 해주세요.
  - 이 과정에서 테스트가 분리될 수도 작성법이 수정될 수도 있습니다.
  - 정말 불필요한 케이스가 아니면, 테스트 케이스를 삭제하는건 최소화 해주세요.
  - 추가로 필요한 테스트가 생길 수 있지만, 작성은 자유롭게 선택해서 진행해주세요.

심화 과제

테스트 전략 작성해보기의 내용을 참고해서 지금까지 작성했던 프로젝트에 대해 테스트 전략을 구상해보세요.

심화 과제 제출

  • 내가 생각한 최적의 테스트 전략은 무엇인지, 그리고 그 이유를 작성해주세요.
  • 팀원들이 합의한 최적의 테스트 전략은 무엇인지, 그리고 그 이유를 작성해주세요.
  • 그 전략에 맞춰 추가한 테스트는 무엇인지 나타내주세요.

과제 셀프회고

이번 주차 과제는 하나의 테스트 케이스도 완성하지 못한 채로 제출하게 되어
부끄러운 마음에 PR을 남기고 싶지 않기도 했지만,
오프라인으로 발제에 참여하면서 팀원들과 나눴던 과제 리뷰에서 이야기했던 내용이라도 적어보았습니다.

1, 2주차 때는 발제 내용을 파악하는데 시간을 많이 쏟아 이번 주차는 무조건 첫날부터 코드를 작성한다는 마음으로 시작했는데
.claude 폴더에 있는 오프 코치님의 agent 파일을 활용해보고 싶어서 냅다 일을 시켰다.
팀원들과의 스크럼에서 추가 기능 개발 이전에 리팩터링을 하는게 좋을 것 같다는 의견을 듣고
우선 리팩터링부터 진행하게 한 뒤 확인해보았을 때 문제 없이 동작하길래 바로 다음으로 넘어갔다.

오프 코치님이 QnA에서 이번 과제에 사용하셨다는 DnD 라이브러리를 사용해보면 좋겠다는 생각으로
"캘린더 일정을 마우스로 끌어 다른 날짜나 시간으로 옮기는 기능을 TDD 사이클로 개발해줘
라이브러리는 https://github.com/hello-pangea/dnd 사용해줘"라고 하니
기능 명세 작성, 테스트 설계 작성까지는 잘 해줬지만 테스트를 통합 테스트로 작성하고 확인하고 있어
GREEN 단계에서 도무지 넘어가질 못했는데 DnD에는 통합테스트가 적합하지 않다는 걸 수요일에서야 알게 됐다.

그래서 테스트 코드를 걷어내고 구현된 기능을 테스트 + 디버깅 한 후
날짜 클릭 기능도 개발하게 시키고 검증을 완료한 후 목요일에서야 E2E 테스트를 작성해보게 되었는데,
기본 일정 관리 워크플로우 전반을 검증하는 과정에서도 테스트 별로 목업 데이터를 따로 관리할 수 있다는 생각을 못해서
테스트 수정과 삭제 로직을 검증하는 과정에서 현재 월의 첫번째 이벤트가 반복 일정으로 되어있어
수정/삭제 시 해당 일정만 변경하는 것인지에 대한 alert이 발생한 채로 완료 메세지를 기다리다 timeout이 뜨고 있었다.

알고보니 팀원 분들이 E2E 테스트를 직렬로 실행할 수 있는 config 설정을 공유해주셨는데 이런 부분들을 깨닫기 전에
이미 늦었다 + 자고 싶다는 마음에 포기해버렸다. 이번 주차는 지난 과제들을 제대로 하지 못했으니 '나는 잘 모른다 +
이번 주차도 잘 하지 못할 것이다'라는 생각에 가로막혔던 것 같다.

다음 과제는 처음 시작할 때 해야할 내용을 명확하게 파악하고, 내가 할 수 있는 단위로 쪼개어 차근차근 접근해야겠다.

App.tsx의 단일 파일 구조를 관심사별로 분리하여 유지보수성과 재사용성을 향상시킴

주요 변경사항:
- EventBox: 캘린더 뷰의 이벤트 표시 공통 컴포넌트 생성
- EventForm: 일정 입력 폼 컴포넌트 분리 (왼쪽 패널)
- CalendarView: 주간/월간 캘린더 뷰 컴포넌트 분리 (중앙 패널)
- EventList: 이벤트 리스트 및 검색 컴포넌트 분리 (오른쪽 패널)
- OverlapDialog: 일정 겹침 경고 다이얼로그 컴포넌트 분리
- NotificationStack: 알림 스택 컴포넌트 분리

기술적 개선:
- MUI 아이콘 import 방식을 개별 경로로 변경하여 트리 쉐이킹 최적화
- EventForm 타입과 컴포넌트명 충돌 해결 (타입만 import)
- 모든 테스트 케이스 호환성 유지 (data-testid, aria-label 보존)
CalendarView에서 EventBox를 드래그앤드롭으로 날짜 수정하는 기능의 명세서 작성

주요 내용:
- 반복 일정 처리 방법 정의
- 드래그 완료 후 저장 방식 정의
- 날짜 이동 범위 제한 정의
- 시간 정보 유지 방식 정의
- 겹침 감지 처리 방법 정의
- 드래그 가능 뷰 정의 (주간/월간)
- 시각적 피드백 정의
명세서 기반 테스트 전략 및 테스트 케이스 설계

주요 내용:
- 통합 테스트 전략 정의
- 주간/월간 뷰 드래그앤드롭 테스트 케이스 (각 5개)
- 반복 일정 드래그앤드롭 테스트 케이스 (4개)
- 겹침 감지 및 처리 테스트 케이스 (4개)
- 시각적 피드백 테스트 케이스 (1개)
- 제약사항 테스트 케이스 (1개)
- 테스트 파일 구조 및 우선순위 정의
테스트 설계 기반 실제 테스트 파일 생성 (RED 상태)

주요 내용:
- App 컴포넌트 레벨 통합 테스트 작성
- @hello-pangea/dnd 드래그 시뮬레이션 헬퍼 함수 구현
- 주간 뷰 드래그앤드롭 테스트 5개
- 월간 뷰 드래그앤드롭 테스트 5개
- 반복 일정 드래그앤드롭 테스트 4개
- 겹침 감지 및 처리 테스트 4개
- 시각적 피드백 테스트 1개
- 제약사항 테스트 1개

기존 테스트 패턴 준수 (medium.integration.spec.tsx)
- 드래그앤드롭으로 이벤트 날짜 수정 기능 구현
  - @hello-pangea/dnd 라이브러리 사용
  - 주간/월간 뷰에서 드래그앤드롭 지원
  - 반복 일정 처리 및 겹침 감지 기능 포함
  - 같은 날짜로 드롭 시 업데이트하지 않도록 개선
  - 드래그앤드롭은 항상 수정(업데이트)으로 처리

- 달력 날짜 클릭 시 폼 날짜 자동 설정 기능 추가
  - 주간/월간 뷰 날짜 셀 클릭 시 해당 날짜가 폼에 자동 입력
  - 호버 효과 추가로 클릭 가능 표시
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant