개발자

프론트엔드 테스트코드 어떻게 하세요?

2024년 04월 29일조회 220

안녕하세요. 2년차 프론트엔드로 일하고 있는 주니어입니다. 사내에 테스트코드 도입 전 혼자 해보고있는데요, tdd를 하고 계시는 다른 현직자 분들에게 궁금한점이 있습니다. 유닛 테스트 : jest, vitest E2E 테스트: cypress, playwright 위의 도구로 이것저것 해보고있는데 하면서 까다로운 점이 있습니다. 일반 유틸 함수 같은 것은 유닛테스트가 비교적 간단하지만 프론트 엔드이다 보니 컴포넌트 테스트를 하려면 무조건 DOM 으로 불러와야하고, 사이즈가 큰 컴포넌트는 뭔가 잘 되지도 않고, 이럴거면 그냥 E2E만으로 하면 되지 않나 라는 생각도 들고... 실제로는 unit 테스트 도구로 컴포넌트 dom으로 불러와서하고 e2e도 따로 하시나요? 아니면 e2e로만, unit으로만 이렇게 한가지로만 하시나요??

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 2

포크코딩님의 프로필 사진

cypress를 쓰시면 유닛 테스트와 E2E 테스트를 같이 진행할 수 있습니다! 프론트만 테스트하실 거라면 굳이 jest와 나눠쓰지 않아도 됩니다.

행운아777님의 프로필 사진

jest 언급하신 것을 보니 react 기반인 것 같아 그렇게 가정하고 또 유닛테스트에 경험이 거의 없는 입문자라고 가정하고 답변드리겠습니다. 일단 리액트는 "상태변경 -> ui 갱신" 이게 핵심인 만큼 상태변경이 제대로 되는지를 잘 테스트하는게 가장 중요합니다. 예를 들어 "내가 ~~~한 행동을 하면 zustand에 들어있는 a라는 값이 3 증가해야해" 이런거가 의도대로 작동되는지를 확인하는거죠. 그리고 저런게 잘 작동된다면 저런 상태 변경에 따라서 컴포넌트가 잘 렌더되는지를 확인하는겁니다. 그리고 이걸 dom을 죄다 render해서 다 확인하려고 하면 한도 끝도 없기 때문에 제가 추천드리는 것은 대상이 되는 컴포넌트를 shallow render 한 다음, 해당 컴포넌트의 자식들의 구성이나 갯수 정도만 확인하는 겁니다. 예를 들어 다음과 같은 구성의 컴포넌트가 있다면 <부모> <버튼 완료> <버튼 진행중> <버튼 전부> <자식>1</자식> <자식>2</자식> <자식>3</자식> ... <자식>9</자식> <자식>10</자식> </부모> "<버튼 완료>를 누르면 자식이 3개만 렌더 되야 함" "<버튼 진행중>을 누르면 자식이 7개만 렌더 되야 함" "<버튼 전부>를 누르면 10개 전부 렌더 되야 함" 이렇게 간단한 시나리오를 구상해놓고 자식 1~10을 렌더하기 위한 더미 데이터도 시나리오에 맞게 잘 준비해 놓은 다음, 시나리오 별로 <부모>를 렌더했을 때 <자식>의 갯수가 맞는지 확인하는 tc들을 작성하는겁니다. 물론 실무에서는 시나리오들이 이 것보다는 복잡할텐데, 그건 저런 간단한 내용들부터 먼저 해보고 차근차근 익숙해진 다음에 고민하면 되는 문제이고, 그게 아니면 저런 간단한 시나리오로 테스트할 수 있는 단계까지 컴포넌트들을 더 작게 쪼개는 방법도 있습니다. 참고로 컴포넌트가 기능이 너무 많고 구조가 복잡한 경우 tc 작성을 많이 해본 숙련된 개발자도 만들기 아주 짜증나고 답 안나오는건 똑같습니다. 저 같은 경우 실제 테스팅에 적합한 형태로 리펙토링을 하는 과정에서 구조가 개선되는 경우를 많이 경험했습니다. 그리고 끝으로 e2e와 유닛테스트는 그냥 별개로 생각하셔야 합니다. 저 같은 경우 둘다 하는 경우도 있었고 유닛테스트만 하는 경우도 있었고 그랬습니다. e2e만 하는 경우는 저는 경험해보지 못했네요. (e2e만 하는게 안좋다거나 이상하는 뜻은 절대 아닙니다!) e2e 테스트는 브라우저에서 작동 되므로 "스크롤을 ***까지 이동한 다음 1초 지났을 때 xxx 레이어가 생성됐는지 확인"과 같은 유닛테스트로는 절대 할 수 없는 영역까지 테스트할 수 있는 장점이 있습니다만, "코어 의존성의 버전을 올렸더니 빌드 에러는 없는데 ** 버튼 눌렀을 때 exception 나오네?" 이런걸 캐치하는데에는 유닛테스트가 훨씬 가볍고 좋습니다. 물론 익셉션 발생 했는지 여부 같은건 e2e 테스트 도구에서도 다 확인이 가능하긴 합니다만 저런걸 확인하는 용도로는 상대적으로 무겁고 불편합니다. 때문에 여력이 되신다면 둘 다 하시는걸 추천하고 싶은데... 이게 쉽지가 않긴 하죠. ㅋ

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 04월 29일

테스트 코드 작성에 대한 당황스러움을 이해합니다. 프론트엔드 엔지니어로서 다양한 테스트 도구를 사용해보고 어떤 것이 가장 효율적인지 묻는 건 상당히 중요한 점입니다. 일반적으로 여러 테스트 수준은 서로 보완적인 존재로, 어느 한 가지만 선택하거나 다른 하나를 배제하지 않습니다. 유닛 테스트는 개별 함수가 예상대로 동작하는지 검증하는데 유용합니다. 컴포넌트 및 관련 로직의 세부 사항을 확인하기 위해 DOM을 활용하는 것도 가능하지만, 큰 컴포넌트의 경우 처리하기 어려울 수 있습니다. 반면에 E2E (End-to-End) 테스트는 유저의 경험을 시뮬레이션하며 전체 시스템이 정상적으로 작동하는지 확인합니다. 이는 종종 UI와 관련된 버그를 발견하는 데 매우 유익하지만, 작성과 유지 관리가 복잡하고 시간이 오래 걸릴 수 있습니다. 따라서 일반적으로 최상의 방법은 종합적인 접근법을 취하는 것입니다 - 이는 유닛 테스트, 통합 테스트 및 E2E 테스트를 모두 포함할 수 있습니다. 사용자 인터페이스가 매우 복잡한 경우라면 스냅샷 테스트도 고려해 볼만 합니다. 그럼에도 불구하고 리소스와 시간이 제한적인 경우라면 주로 사용하는 컴포넌트의 유닛 테스트와 가장 중요한 사용자 경로에 대한 E2E 테스트에 중점을 두는 것이 현명한 전략일 수 있습니다. 일부 경로나 기능이 변경될 때마다 모든 E2E 테스트를 실행하는 대신, 코드의 작은 부분에서 버그를 식별할 수 있는 유닛 테스트가 매우 유용할 수 있습니다. 각 프로젝트와 조직은 그들만의 독특한 요구 사항과 제약 사항을 가지므로 최적의 접근법은 사례에 따라 다르다는 점을 명심하세요.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!