Jest로 JavaScript 단위 테스트 작성하기
Jest의 진짜 성공 지표는 테스트 개수가 아니라 빠르고 행동 중심적인 피드백입니다.
단위 테스트는 로직을 겨냥해야 합니다
Jest 단위 테스트가 특히 강한 대상은 다음입니다.
- 순수 함수
- 도메인 규칙
- 계산 로직
- 엣지 케이스 분기
- 비즈니스 의미가 있는 변환 로직
반대로 무거운 프레임워크 wiring, 브라우저 동작, DB 현실을 증명하려고 하면 단위 테스트 계층의 장점이 약해집니다. 그런 것은 더 현실적인 다른 계층이 맡는 편이 맞습니다.
내부 호출 구조보다 행동이 중요합니다
강한 테스트는 이렇게 말합니다.
- 프리미엄 회원만 할인을 받는다
- 잘못된 입력은 거절된다
- 중복 값은 안전하게 정규화된다
약한 테스트는 이렇게 말합니다.
- helper X가 두 번 호출되었다
- method Y가 Z를 불렀다
- 우연한 내부 상태가 그대로 유지되었다
호출 횟수에 집착하는 테스트는 사소한 리팩터링에도 깨지고, 정작 중요한 회귀는 놓치기 쉽습니다.
Mock는 경계를 고립할 때만 써야 합니다
Mock는 다음처럼 비싸거나 비결정적인 경계를 고립할 때 유용합니다.
- 네트워크 접근
- 시간
- 랜덤 값
- 외부 서비스
반대로 내부 협력 구조 전체를 mock로 재현하기 시작하면, 테스트는 코드의 실제 행동보다 작성자의 가정을 더 많이 검증하게 됩니다.
테스트는 빠르고 결정적이어야 합니다
Jest가 강력한 이유는 테스트가 자주 돌 수 있기 때문입니다.
이를 위해 보통 다음이 필요합니다.
- 공유 가변 전역 상태 피하기
- mock과 timer를 명확히 초기화
- 각 테스트 시나리오를 작게 유지
- 읽기 쉬운 setup을 위한 factory나 builder 사용
빠르고 결정적인 테스트여야 단위 테스트가 개발자 워크플로 도구로 살아남습니다.
읽기 쉬움도 유지보수성의 일부입니다
좋은 Jest 테스트는 작성자가 아니어도 의도가 빠르게 읽혀야 합니다.
유용한 습관은 다음과 같습니다.
- 행동 기준의 테스트 이름
- arrange / act / assert 흐름이 읽히는 구조
- 과도하게 큰 setup 블록 피하기
- setup helper는 가독성을 높일 때만 추출
기술적으로는 포괄적이어도 읽기 어려운 테스트 스위트는 결국 신뢰를 잃습니다.
Coverage는 목표가 아니라 보조 신호입니다
Coverage는 사각지대를 보여줄 수는 있지만, 주된 목표가 되면 쉽게 왜곡됩니다.
커버리지가 높아도 약한 스위트는 충분히 존재합니다.
- assertion이 얕고
- 중요한 분기가 의미 있게 검증되지 않고
- 구현 디테일에 과하게 결합된 경우
신뢰도는 초록색 줄 수보다 의미 있는 행동 검증에서 나옵니다.
흔한 안티패턴
실무에서는 다음 패턴이 자주 문제를 만듭니다.
- mock 호출 횟수만 검증하는 테스트
- 내부 구현에 강하게 결합된 테스트
- 테스트 간 숨은 공유 상태
- 테스트 대상 행동을 가리는 거대한 setup
- 결함 검출보다 coverage 숫자 올리기에 집착
이런 스위트는 바빠 보일 뿐 실제 가치는 떨어집니다.
리뷰 체크리스트
Jest 스위트가 건강한지 보려면 다음을 물어야 합니다.
- 이 테스트가 정말 중요한 행동을 검증하는가
- 내부 리팩터링 후에도 여전히 가치가 있는가
- mock가 진짜 경계에서만 쓰였는가
- 실패 메시지가 빠른 진단에 도움이 되는가
- setup이 한 번 읽고 이해될 만큼 작은가
마무리
Jest 단위 테스트의 성공 기준은 coverage 연극이 아니라 속도와 신뢰입니다. 의미 있는 규칙이 이 계층에서 빠르게 실패할수록, 전체 배포 파이프라인은 더 싸고 더 안정적이 됩니다.
Continue Reading
다음으로 읽기 좋은 글
Mock, Stub, Spy 테스트 더블 설계 가이드
Mock, Stub, Spy를 언제 어떤 기준으로 선택해야 하는지 정리합니다. 상태 검증과 상호작용 검증의 차이, 과도한 mocking의 위험, fake와의 선택 기준까지 실무 관점에서 다룹니다.
🧪 TestReact Testing Library 실전 설계 가이드
React Testing Library를 사용자 중심 테스트 도구로 활용하는 방법을 정리합니다. query 우선순위, 상호작용 테스트, 비동기 UI, provider wrapper, 과도한 mocking 회피까지 실무 기준으로 다룹니다.
💬 LanguageTypeScript Utility Types 실전 가이드
TypeScript 유틸리티 타입을 DTO, 업데이트 payload, selector, 파생 타입 설계에 어떻게 써야 하는지, 어디서부터는 가독성을 해치는지 정리합니다.
💬 LanguageModern JavaScript ES2024 문법 실전 해설
최신 JavaScript 문법을 단순 문법 소개가 아니라, 코드 품질을 실제로 높이는지 기준으로 읽습니다. 무엇이 진짜 도움이 되고 무엇은 여전히 절제가 필요한지 정리합니다.
다음 탐색