Vitest는 Vite 기반의 차세대 JavaScript/TypeScript 테스팅 프레임워크다. Jest와 호환 API를 제공하면서 Vite의 빠른 HMR과 ESM 지원으로 Jest보다 빠른 테스트 실행을 달성한다.
Jest vs Vitest 비교
| 항목 | Jest | Vitest |
|---|
| 번들러 통합 | Babel/SWC | Vite |
| ESM 지원 | 제한적 | 기본 지원 |
| 속도 | 보통 | 빠름 |
| HMR | 없음 | 지원 (watch 모드) |
| 설정 | 별도 설정 | vite.config.ts 공유 |
| API 호환성 | - | Jest 호환 |
기본 설정 및 테스트
typescript
// vite.config.ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
environment: 'jsdom',
globals: true,
setupFiles: ['./src/test/setup.ts'],
coverage: {
provider: 'v8',
reporter: ['text', 'html'],
thresholds: { lines: 80, branches: 80 },
},
},
});
// calculator.test.ts
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { Calculator } from './calculator';
describe('Calculator', () => {
let calc: Calculator;
beforeEach(() => {
calc = new Calculator();
});
it('나눗셈을 수행한다', () => {
expect(calc.divide(10, 2)).toBe(5);
});
it('0으로 나누면 에러를 던진다', () => {
expect(() => calc.divide(10, 0)).toThrowError('Division by zero');
});
});
모킹 및 스파이
typescript
import { vi, expect, test } from 'vitest';
// 모듈 모킹
vi.mock('./database', () => ({
findUser: vi.fn().mockResolvedValue({ id: 1, name: 'Alice' }),
}));
// 타이머 모킹
vi.useFakeTimers();
test('setInterval 테스트', () => {
const fn = vi.fn();
setInterval(fn, 1000);
vi.advanceTimersByTime(3000);
expect(fn).toHaveBeenCalledTimes(3);
});
// 스냅샷 테스트
test('컴포넌트 스냅샷', () => {
const { container } = render(<Button label="클릭" />);
expect(container).toMatchSnapshot();
});
관련 문서