안녕하세요 프론트엔드 개발자 Garden, 오소현입니다:)
저는 요즘 항해 플러스 프론트엔드 3기 코스 과정에 참여하면서 공부하고 있는데요!
오늘은 그 8주차의 회고를 진행해보려고 합니다 !
이번주차는 지난 주에 이어서 오프 코치님의 테스트코드 마지막 발제가 시작되었습니다!
과제 내용은 TDD로 추가적인 어플리케이션의 기능을 구현하고, 자신만의 테스트 전략을 세워 테스트 코드를 작성해보는것이었는데요!
저는 저만의 전략을 세워 어플리케이션에 맞게 tdd로 기능 구현, 단위, 통합, e2e, ui 테스트를 진행해보는 과제를 진행했습니다!
Q. 고민한 테스트 전략과 그 이유는 무엇인가요?
저는 이번 과제를 진행하면서 내가 이 서비스를 실제 운영하고 있는 개발자이고, 유저들이 사용하다가 어떤 액션을 취하다가 버그가 발생할지
최대한 캘린더를 사용하는 유저들의 입장에서 발생할 수 있는 다양한 테스트 코드를 작성한다고 생각했습니다.
따라서 기능을 테스트하는 것은 물론이지만, e2e에서 다양하게 벌어질 수 있는 서비스의 유저 플로우를 그려보며 테스트 시나리오를 작성했습니다. 사용자들이 이 서비스에서 에러를 겪을 수 있는 그 상황!을 생각해보고 미리 테스트코드로 대비하고자 이번 과제에서 노력했습니다.
단위 테스트는 제가 구현하려고 하는 함수 및 기능이 정상적으로 구현되는지를 위주로 테스트 코드를 작성하고자 했습니다.
따라서 필수적인 기능을 작은 단위로 각각의 테스트들이 해당 역할에 맞게 기댓값이 출력되는지를 파악했습니다.
주로 기본 과제의 필수 기능 요구 조건이었던 반복 기능 들에 관한 추가적으로 테스트 코드를 작성했습니다.
저의 단위 테스트의 목표는 단위 테스트가 깨지면 서비스를 할 수 없다! 반드시 무조건 되어야하는 기능이다! 라고 생각했습니다.
저는 이번 과제를 진행하면서 처음 통합 테스트를 구현할 때 지금까지 해왔던 testing-library를 사용해 처음 구현을 진행하고 있었습니다.
하지만 통합 테스트 범위에 들어가는 시나리오들은 유저들이 여러개의 컴포넌트와 함수, 훅, 기능들의 변화를 직접 겪는 것을 모의하는 것이라고 생각했습니다.
결론적으로 통합 테스트는 실제 브라우저 화면을 바탕으로 테스트를 진행하는게 더 효율적이라고 생각을 했고, 기존 통합 테스트는 그대로 두고
필수 구현 기능인 반복 일정에 관한 통합테스트
들은 모두 playwright를 사용해 브라우저 기반에서 테스트를 진행하는 방식으로 구현했습니다.
저는 통합 테스트, e2e 테스트를 할때 각 테스트가 독립적으로 실행되는 환경을 갖추는게 맞다고 생각합니다. 따라서 모든 테스트를 실행하기 전에 존재하는 이벤트 모두 삭제
기능을 먼저 실행하고, 기존에 있는 데이터가 아무것도 없는 상태에서 테스트 코드가 진행되도록 구현하였습니다.
test.describe('반복 일정 등록', () => {
test('1. 반복 일정을 등록할 때, 유저가 설정한 올바른 반복 주기로 등록되어야한다.', async ({
page,
}) => {
// 본 테스트를 실행하기 전에 서비스에 남아있는 일정 데이터를 모두 삭제하는 로직이 먼저 실행됨
await page.goto('http://localhost:5173/');
await page.getByRole('button', { name: '모든 일정 삭제' }).click();
await page.reload();
// 테스트 코드...
}
사용자의 입장에서 다양한 이벤트가 추가된 상태에서 테스트 코드를 작성하는데 더 신뢰있는(현실성 있는) 테스트코드라고 생각을 해봤지만,
이러한 경우는 e2e에서 여러 일정 케이스를 추가한 것을 기반으로 테스트하는 게 맞다고 생각을 했습니다.
따라서 이벤트를 계속 새로 추가해줘야하더라도, 하나의 테스트는 독립적으로 진행하게끔 하고자 위와 같이 구현하였습니다.
제가 구현한 통합 테스트 시나리오는 아래와 같습니다. 1번에서 언급한 유닛 테스트와 유사한 시나리오가 있지만 이는 화면 기반 테스트 이기 때문에 통합테스트에서도 필요하다고 생각이 들어서 필수적인 기능 테스트를 구현했습니다.
저는 앞서 언급했었지만 저만의 e2e 테스트 시나리오를 선정하는 기준은 액션이 2-3개 이상
, 서비스 구현 상 오류 발생 가능성이 있는
, 유저가 흔히 겪을 수 있는
테스트 시나리오를 짤 수 있도록 노력했습니다.
유저 입장에서
(0) 서비스가 항상 정상적으로 접속될 수 있어야 되는 기본적인 시나리오,
(1) 반복 일정을 등록해두었다가, 특정 날짜에 새로운 일정이 생겨 수정하는 시나리오,
(2) 여러 개의 일정을 등록 할 것이므로, 이미 등록된 일정과 겹쳐서 일정을 다시 조율해야하는 시나리오,
(3) 특정 주기를 반복하는 여러개 의 일정이 중첩되는 날짜에 표시가 제대로 되는지의 시나리오
등등이 가장 많이 서비스를 사용하면서 발생할 상황이라고 생각했고, 그만큼 오류가 없어야 하는 시나리오 라고 생각해 구현했습니다.
유저에게 항상 정상적으로 서비스가 접속되어야하기 때문에 이를 가장 1번으로 실행하도록 구현하였습니다.
저는 제 서비스 코드에서 컴포넌트로 분리한 UI들을 직접 보며 테스트할 수 있는 시각적 회귀 테스트를 위해 스토리북을 도입했습니다.
스토리북을 사용하면 UI 테스트 뿐만 아니라 어떤 컴포넌트가 있는지 한 번에 파악할 수 있는 UI 문서의 역할도 한다고 생각해 시각적 회귀 테스트로서 많은 역할을 한다고 생각해 도입하게 되었습니다.
제 컴포넌트들에 대한 스토리북 배포는 8주차 과제 스토리북 배포 URL 에서 직접 확인하실 수 있습니다.
chromatic을 사용해 스토리북 프로젝트를 외부 배포 하였습니다!
특히 스토리북을 도입하면서 발제에서 기본적으로 구현된 Chakra UI에 어떤 컴포넌트들이 있는지 파악하기 쉬웠고,
저는 반복 일정에 대해 다음과 같이 유저들에게 좋은 UI를 추가하였습니다.
(1) 캘린더 뷰에 있는 반복일정에 해서는 아이콘 호버시 간단하게 몇일 주기의 반복, 종료일은 언제 인지 표시하도록 해 편리함을 높였습니다.
(2) 일정 리스트에 있는 반복 일정에 대해서는 반복 일정에 대한 자세한 정보를 담기 위해 모달로 구현해 사용자들이 쉽게 파악 할 수 있도록 노력하였습니다.
EventFrom
컴포넌트(Default
상태)EventFrom
컴포넌트와 검색 창이 같이 보여지는 EventList
컴포넌트Default
상태No Event
상태With Search Team
상태 NotificationList
컴포넌트(Default
상태)OverlapAlertModal
컴포넌트 Default
상태No Overlap
상태RepeatEventModal
컴포넌트 Default
상태No Repeat
상태close
상태기본, 심화 과제 둘다 best를 받을 수 있엇습니다 ㅠㅠ
이번주차에는 성호 코치님께 멘토링을 받았는데 정말 감사했습니다...!
ㅎㅎ 그리고 오프 코치님과 저희팀 학습메이트 현우님 께서 제 PR에 좋아요를,,,! 너무 영광이었어요 ㅠㅠ(무한 감동)
다음주부터는 s3, cdn 등등을 배우는데요,, 회사에서 뭔지만 듣고 해볼기회가 없었는데 열심히 배우려고요!!!
저는 현재 9주차를 진행하고 있지만 정말 열심히 몰입해서 공부하고 있는데요!
바로 다음 기수인 항해 플러스 프론트엔드 코스 4기를 모집하고 있다고 하여 공유드립니다!
저도 3기 입과할때 슈퍼 얼리버드 기간에 합류해 추천인 할인까지해서 제일 최대 할인된 가격에 합류할 수 있었습니다 ㅎㅎ
또한 추천인 제도로 [추천인] 코드에 “fWHY9o”를 입력하시면 20만 원 추가 할인 혜택이 있으니 결제하실때 꼭 추천인 할인 코드도 함께 입력해주세요!
제 항해 플러스 프론트엔드 후기 글을 보고 궁금한 사항이 있으시다면 댓글이나, 벨로그 프로필 이메일, 링크드인으로 문의주세요 :)