Jest는 Facebook(Meta)이 개발한 JavaScript/TypeScript 테스팅 프레임워크다. 단위 테스트, 통합 테스트, 스냅샷 테스트, 코드 커버리지를 하나의 프레임워크에서 제공한다.
핵심 기능
| 기능 | 설명 |
|---|
| 스냅샷 테스트 | 컴포넌트 렌더링 결과 스냅샷 비교 |
| 모킹 | 모듈·함수·타이머 자동 모킹 |
| 코드 커버리지 | Istanbul 기반 커버리지 리포트 |
| 병렬 실행 | Worker 스레드로 병렬 테스트 |
| Watch 모드 | 변경된 파일만 재실행 |
기본 테스트
typescript
// sum.ts
export function sum(a: number, b: number): number {
return a + b;
}
// sum.test.ts
import { sum } from './sum';
describe('sum 함수', () => {
test('두 양수를 더한다', () => {
expect(sum(1, 2)).toBe(3);
});
test('음수를 포함한 덧셈', () => {
expect(sum(-1, 5)).toBe(4);
});
});
모킹 예시
typescript
import { fetchUser } from './api';
jest.mock('./api');
const mockFetchUser = fetchUser as jest.MockedFunction<typeof fetchUser>;
test('사용자 데이터를 로드한다', async () => {
mockFetchUser.mockResolvedValue({ id: 1, name: 'Alice' });
const user = await fetchUser(1);
expect(user.name).toBe('Alice');
expect(mockFetchUser).toHaveBeenCalledWith(1);
});
// 타이머 모킹
jest.useFakeTimers();
test('디바운스 함수 테스트', () => {
const fn = jest.fn();
const debounced = debounce(fn, 500);
debounced();
jest.advanceTimersByTime(500);
expect(fn).toHaveBeenCalledTimes(1);
});
jest.config.ts
typescript
import type { Config } from 'jest';
const config: Config = {
preset: 'ts-jest',
testEnvironment: 'node',
collectCoverageFrom: ['src/**/*.ts', '!src/**/*.d.ts'],
coverageThreshold: {
global: { branches: 80, functions: 80, lines: 80, statements: 80 },
},
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
},
};
export default config;
관련 문서