개발자
안녕하세요 테스트에 대해 궁금한 것이 있어 질문을 작성하게 되었습니다. 리액트를 사용한 프로젝트에 테스트를 도입할 계획입니다. 해당 프로젝트의 주문과 결제 과정까지를 테스트할 수 있는 테스트 코드를 작성하고 싶습니다. 주문 과정까지의 api 호출이 굉장히 많은 상황입니다. 품절, 프로모션, 상품 정보 조회 등등 테스트를 할 때 주문 과정까지에 필요한 "모든 api"를 msw를 사용하여 모킹을 한 후 테스트를 진행해야 하는건가요? 하나 더 궁금한 것은 react에서 유닛테스트를 하게 된다면 각각의 함수를 테스트하게 되는 것인지 궁금합니다. 그렇다면 컴포넌트를 제외한 함수들은 모두 테스트를 하기 위해 커스텀 훅으로 만들거나 컴포넌트 외부에서 정의해야 하는 건가요?
답변 1
인기 답변
테스팅에서 모킹 기법은 잘 쓰면 좋은 약이 되지만 잘못 쓰면 독이 될 수도 있기 때문에 Tradeoff를 잘 고려하셔야 합니다. MSW를 사용하여 API 연동을 모킹하면 가볍고 빠르며 안정적인 결과를 내는 테스트를 작성할 수 있지만, 그에 대한 대가로 해당 테스트는 실패해야 하는 상황에서도 통과하게 될 위험이 높아지게 됩니다. 왜냐하면 테스트가 실행할 때 실제 백앤드 API와 네트워크 통신이 일어나지 않기 때문입니다. 즉, 나중에 백앤드 API가 변경이 일어났을 때 해당 테스트는 여전히 통과할 것입니다. 그리고 이러한 위험은 특히 프론트앤드와 백앤드를 서로 다른 팀이 유지보수하거나, 외부 API를 사용할 때 더 높아지게 되죠. 이렇게 Unit 테스트 수준에서 모킹으로 인해서 발생하는 부작용을 최소화하기 위해서, 그 보다 상위 수준의 테스트(Integration, E2E)에서는 모킹을 금지하거나 제한하는 경우가 많습니다. 예를 들어, 실제 백엔드 API와 네트워크 통신을 하는 E2E 테스트를 보강하면, Unit 테스트가 통과하더라도 E2E 테스트가 실패하게 되어 예상치 못한 백엔드 API가 변경에 효과적으로 대응할 수 있습니다. 또 다른 대안으로 Contract 테스트라는 것도 있는데, 이 부분까지 설명하면 답변이 너무 길어질 것 같아서 따로 구글링해보시면 좋을 것 같습니다. React 개발에서 모든 컴포넌트 함수에 대한 Unit 테스트를 작성하는 것이 정석적인 방법이나 프로젝트에 따라서 개발 생산성을 위해서 어느 정도 타협하는 경우도 있습니다. 예를 들어, `<Button/>`이나 `<Input/>`과 같은 하위 수준의 컴포넌트에 대한 Unit 테스트는 생략하고, `<ProductDetai/>`이나 `<CheckoutForm/>`과 같은 비지니스에 중요한 컴포넌트를 위주로 Integration 테스트만 하는 것이지요. 하지만 만약에 프로젝트가 특정 비지니스를 위한 애플리케이션 개발이 아니라, UI 라이브러리 개발이라면 하위 수준의 컴포넌트에 대한 Unit 테스트도 필수적일 것입니다. Integration 테스트를 위주로 작성하는 경우에는 비지니스 로직을 커스텀 훅이나 별도 함수로 추출해놓지 않더라도 적어도 테스팅 측면에서는 큰 지장은 없습니다. 어차피 컴포넌트와 커스텀 훅이 함께 테스트가 될테니까요. 하지만 코드 가독성이나 유지 보수 측면까지 고려하신다면, UI 컴포넌트에서 비즈니스 로직을 분리하는 것은 여전히 권장됩니다. 혹시 도움이 될까해서 예전에 모킹 관련해서 올렸던 게시물 아래에 공유드리오니 참고 바랍니다. - Jest의 jest.mock()을 이용한 모듈 모킹: https://careerly.co.kr/comments/89815 - Jest의 jest.fn(), jest.spyOn()를 이용한 함수 모킹: https://careerly.co.kr/comments/89329 - MSW로 백엔드 API 모킹하기 (for 프론트엔드 개발자): https://careerly.co.kr/comments/88082
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2023년 11월 01일
프로젝트에서 테스트를 도입하는 것은 매우 중요한 단계이며, 이에 대한 질문을 주셔서 감사합니다. 주문과 결제 과정을 포함한 모든 API 호출을 MSW(Mock Service Worker)를 사용해 모킹할 수 있습니다. MSW는 네트워크 요청을 가로채어 우리가 원하는 방식으로 대응할 수 있도록 하는 라이브러리입니다. 따라서 테스트 과정에서 실제 서버와의 의존성을 제거하고, 일관된 테스트 환경을 만들 수 있게 해줍니다. 그런데 주문과 결제 등의 프로세스를 완전히 추적하고자 한다면 end-to-end(E2E) 테스트 도구인 Cypress나 Puppeteer를 고려해 볼만 합니다. 이 도구들은 사용자 Interaction부터 Network 레벨까지 구현하여 전체 시스템의 작동 여부를 확인할 수 있게 해줍니다. React에서 유닛 테스트는 일반적으로 각각의 컴포넌트 또는 함수에 대해 이루어집니다. 하지만 모든 함수를 컴포넌트 외부에서 정의하거나 커스텀 훅으로 만들 필요는 없습니다. React Testing Library와 같은 도구를 사용하면, 컴포넌트의 상태 변화와 이벤트 처리 등을 잘 캡슐화하여 테스트할 수 있습니다. 상황에 따라 Unit Test, Integration Test 그리고 E2E test를 적절히 활용하면서 프로젝트를 완성해 보시길 바랍니다. 만약 추가적으로 궁금한 점이 있으시다면 언제든지 물어보세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!