유닛 테스트. nextjs
유닛 테스트 핸드북
핵심 요약: 유닛 테스트(Unit Testing)는 애플리케이션의 가장 작은 단위(함수·메서드·컴넌트)를 격리하여 검증함으로써, 개발 초기 단계에서 버그를 조기 발견·수정하고 코드 품질을 유지·향상시킨다. Next.js 프로젝트에서는 Jest와 React Testing Library를 주로 사용하며, 테스트 구조 설계·실행·결과 분석·리팩토링의 순환 과정을 통해 일관성 있고 안정적인 UI 및 비즈니스 로직을 보장할 수 있다.
1. 유닛 테스트의 개념 및 탄생 배경
1.1 정의
유닛 테스트는 애플리케이션을 구성하는 최소 단위(‘유닛’)를 독립적으로 실행하고 검증하는 테스트 기법이다1.
- 유닛: 함수, 메서드, 클래스, React 컴포넌트 등
- 목표: 각 유닛이 명세(스펙)에 부합하는 동작을 수행함을 보장
1.2 역사적 발전
- 1956년 미 해군 SAGE 프로젝트: 서브루틴(유닛)에 대한 ‘파라미터 테스트’ 도입2.
- 1964년 NASA 머큐리 프로젝트: 모듈별 ‘유닛 테스트’ 명시2.
- 1989년 Kent Beck의 SUnit(Smalltalk), 1997년 JUnit(Java) → xUnit 계열 프레임워크 확산23.
2. 유닛 테스트의 목적 및 가치
2.1 조기 버그 발견 및 비용 절감
테스트 작성 시점에 버그를 발견하면 수정 비용이 크게 낮아진다4.
2.2 리팩토링 안전망 제공
기존 기능 동작을 자동 검증하므로, 적극적인 코드 개선·최적화 가능4.
2.3 문서화 및 설계 명세
테스트 코드는 유닛의 동작 명세서 역할을 하며, 유지보수·온보딩 시 참고 자료로 활용된다4.
2.4 지속적 통합·배포(CI/CD) 촉진
자동화된 유닛 테스트는 빌드 파이프라인에 통합되어 품질 게이트로 작동한다5.
3. 테스트 구조 및 워크플로
3.1 기본 구성
- Arrange(준비): 테스트 대상 유닛과 목(Mock)·스텁(Stub) 설정
- Act(실행): 유닛 호출
- Assert(검증): 기대 결과와 실제 결과 비교
3.2 테스트 더블(Test Double)
- 목(Mock): 상호작용 검증 용
- 스텁(Stub): 고정 응답 제공 용
- 페이크(Fake): 간이 구현용
3.3 파라미터라이즈드 테스트
여러 입력값을 한 번에 테스트하여 코드 중복을 줄이고 커버리지를 높인다[Wikipedia].
4. Next.js 환경에서의 유닛 테스트
4.1 주요 도구
- Jest: 페이스북이 개발한 JS 테스팅 프레임워크. 스냅샷 테스트 지원.
- React Testing Library: 컴포넌트 렌더링 후 사용자 입장에서 요소 검증.
- ts-jest: TypeScript 코드 테스트 시 컴파일 처리.
4.2 설정 예시 (jest.config.js)
module.exports = {
testEnvironment: 'jsdom',
moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx'],
transform: {
'^.+\\.(ts|tsx)$': 'ts-jest'
},
setupFilesAfterEnv: ['<rootDir>/jest.setup.js']
};
4.3 React 컴포넌트 테스트 예제
// components/Button.tsx
export default function Button({ onClick, children }: any) {
return <button onClick={onClick}>{children}</button>;
}
// __tests__/Button.test.tsx
import { render, fireEvent, screen } from '@testing-library/react';
import Button from '../components/Button';
test('버튼 클릭 시 onClick 호출', () => {
const handleClick = jest.fn();
render(<Button onClick={handleClick}>클릭</Button>);
fireEvent.click(screen.getByText('클릭'));
expect(handleClick).toHaveBeenCalledTimes(1);
});
5. 베스트 프랙티스
- 격리성 유지: 외부 의존성을 모두 목 처리하여 순수 유닛 테스트 보장6.
- 빠른 실행: 전체 테스트 수 초 이내 완료. 불필요한 I/O 배제7.
- 읽기 쉬운 테스트 코드: Arrange–Act–Assert 패턴 준수.
- 테스트 커버리지 측정: 핵심 로직 70–90% 이상 권장.
- TDD(Test-Driven Development): 실패하는 테스트 작성 → 코드 구현 → 리팩토링 순환[Wikipedia].
6. 한계 및 보완
- 유닛 테스트만으로 통합 오류·성능 문제를 모두 검증할 수 없으므로, 통합 테스트·E2E 테스트 병행 필요[Wikipedia].
- 과도한 테스트 코드 작성은 유지보수 부담 증가. 핵심 기능에 집중해야 함.
7. 활용 가이드라인
- 스토리별 유닛 테스트 계획 수립
- PR(풀 리퀘스트) 시 자동 실행 및 코드리뷰 병행
- 테스트 실패 시 즉시 수정·재실행
- 주요 서비스 배포 전 테스트 레포트 검토
핸드북 활용 포인트:
- 신입 개발자는 이 핸드북으로 유닛 테스트 전반을 이해하고, Next.js 프로젝트에 바로 적용할 수 있습니다.
- 팀 리더는 베스트 프랙티스를 참고해 CI 파이프라인에 유닛 테스트 단계를 표준화할 수 있습니다.
1 Testlio 2 Wikipedia: Unit testing history 6 Brightsec 5 IBM What is Unit Testing? 7 Microsoft Playbook 3 Martin Fowler 4 Parasoft
⁂