Jest vs. Vitest: React 유닛 코드 테스트에 적합한 선택은?

kiwon kim·2024년 11월 28일

Frontend

목록 보기
15/30

React 애플리케이션 테스트에서 Jest는 오랫동안 신뢰받아 온 툴입니다. 하지만 최근에는 Vitest가 Vite 생태계와의 완벽한 통합과 빠른 성능으로 주목받고 있습니다. 두 테스트 러너를 비교하며, 어떤 상황에서 더 적합한지 알아보겠습니다. Vitest의 빠른 실행 속도, 간결한 설정, 그리고 ESM(ECMAScript Modules) 지원의 중요성도 함께 살펴보겠습니다.


1. Jest: 오래된 신뢰와 방대한 생태계

장점

  1. 오랜 역사와 생태계 지원
    Jest는 Facebook(현 Meta)에서 개발한 테스트 러너로, 오랜 시간 커뮤니티의 신뢰를 받아왔습니다. 다양한 플러그인과 도구가 존재하며, 대부분의 라이브러리와 호환됩니다.

  2. 강력한 기능

    • Mocking, Snapshot Testing, Spy 등 다양한 기능 기본 제공.
    • Babel, Webpack과 잘 통합.
    • 병렬 실행 및 캐싱으로 빠른 테스트 수행 가능.
  3. Snapshot Testing
    React UI 테스트에서 변경 사항을 감지할 수 있는 스냅샷 테스트 기능이 매우 유용합니다.

  4. 독립적 실행 환경
    Jest는 자체 실행 환경을 제공하므로, Node.js만으로도 테스트를 수행할 수 있습니다.

단점

  1. 느린 테스트 속도
    Jest는 테스트 실행 전에 모든 파일을 변환(트랜스파일링)하여 CommonJS 형식으로 변환합니다. 이로 인해 런타임 빌드 시간이 길어지고, 특히 대규모 프로젝트나 Vite 같은 모던 번들러 기반 프로젝트에서는 느려질 수 있습니다.

  2. 설정의 복잡성
    Jest는 jest.config.js 파일에서 Babel, TypeScript 등과의 통합을 설정해야 하는 경우가 많아, 특히 Vite 기반 프로젝트에서 설정이 복잡해질 수 있습니다.

  3. ESM 지원 한계
    최신 JavaScript 모듈 시스템(ESM) 지원이 제한적입니다. 이는 Vite 기반 프로젝트에서 Jest를 설정하는 데 불편함을 초래할 수 있습니다.


2. Vitest: Vite 프로젝트를 위한 최적의 선택

장점

  1. Vite와의 완벽한 통합
    Vitest는 Vite를 기반으로 설계되었으며, 설정 없이 바로 사용 가능합니다.

  2. 빠른 테스트 실행 속도
    Vitest는 Vite의 빠른 빌드 속도를 그대로 활용합니다.

    • ESM 네이티브 지원: Vitest는 모듈을 CommonJS로 변환하지 않고 바로 실행하므로, Jest보다 빠르게 테스트를 실행할 수 있습니다.
    • 온디맨드 디펜던시 로딩: 필요할 때만 의존성을 로드하여 테스트 속도를 최적화합니다.
    • Vite의 HMR(핫 모듈 리플레이스먼트) 활용: 테스트 변경 사항을 즉각 반영합니다.
  3. 유연한 API
    Jest와 매우 유사한 API를 제공하여, 기존 Jest 사용자가 쉽게 전환할 수 있습니다.

  4. 설정의 간결성
    Vitest는 Vite의 설정을 그대로 활용하므로 별도의 설정 파일이 거의 필요 없습니다.

  5. UI Mode를 이용한 DX 증가
    Vitest는 UI모드를 지원해서, 테스트 결과 및 테스트 코드 작성을 하는 개발자의 DX를 향상시킬 수 있습니다.

단점

  1. 생태계와 커뮤니티
    Jest만큼 성숙하지 않은 플러그인 생태계를 가지고 있습니다.

  2. 특정 기능의 제한
    Jest의 Snapshot Testing이나 고급 Mocking 기능은 아직 Vitest에서 제한적일 수 있습니다.


3. Vitest의 빠른 테스트 실행 속도 비교

Vitest는 특히 Vite 기반 프로젝트에서 Jest보다 훨씬 빠른 테스트 속도를 제공합니다.

주요 이유

  1. ESM 네이티브 지원

    • Vitest는 ESM 모듈을 그대로 실행하므로, Jest처럼 CommonJS로 변환하는 작업이 필요하지 않습니다.
    • 이로 인해 변환 시간이 크게 줄어듭니다.
  2. 빌드 과정 최적화
    Vite의 빌드 파이프라인을 활용해 필요한 모듈만 로드하고, 재사용 가능한 캐시를 활용합니다.

  3. 온디맨드 로딩
    Jest는 테스트를 실행하기 전에 모든 파일을 변환하지만, Vitest는 필요한 파일만 변환하므로 테스트 시작 시간이 훨씬 짧습니다.

예시 테스트 실행 시간

  • Jest: 10초~20초 (대규모 프로젝트 기준)
  • Vitest: 1초~3초

테스트 실행 시간이 프로젝트 규모에 따라 다를 수 있지만, Vitest가 Jest보다 3~10배 빠른 경우가 많습니다.


4. 주요 비교

특징JestVitest
속도느림 (런타임 빌드 포함)매우 빠름 (ESM 및 온디맨드 로딩)
설정 난이도복잡 (jest.config.js 필요)간단 (Vite 설정 활용)
ESM 지원제한적완벽 지원
Mocking강력한 Mocking API 제공Jest와 유사하지만 아직 제한적
Snapshot Testing기본 제공제한적 (추가 설정 필요)
플러그인/생태계방대함상대적으로 부족
React 테스트성숙하고 안정적빠르고 유연함

5. Vitest 설정의 간결함

Jest는 TypeScript, Babel, Alias 설정 등에서 jest.config.js와 같은 파일로 복잡한 설정을 요구합니다. 반면, Vitest는 Vite의 설정을 그대로 활용하므로 별도의 설정 파일이 거의 필요 없습니다.

Vitest 설정 예시:

vitest.config.ts만 추가하면 대부분의 환경이 기본적으로 구성됩니다.

import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    globals: true,
    environment: 'jsdom', // React 테스트를 위한 설정
  },
});

이 외에 별도의 설정 없이 TypeScript, Alias, CSS 처리 등이 Vite 설정에 의해 자동으로 처리됩니다.


6. 결론

Vitest는 빠른 속도, 간단한 설정, ESM 네이티브 지원 덕분에 특히 Vite 기반의 최신 프로젝트에서 더욱 적합합니다.

  • Jest는 여전히 성숙한 생태계와 강력한 기능으로 기존 프로젝트에 적합하며, Snapshot Testing 같은 고급 기능을 제공합니다.
  • 반면, Vitest는 빠른 속도와 간결함 덕분에 최신 Vite 프로젝트에 이상적인 테스트 러너로 자리 잡고 있습니다.

"Vite 기반의 새로운 프로젝트는 Vitest, 기존 React 프로젝트는 Jest를 유지"라는 전략을 추천합니다.

profile
FOR_THE_BEST_DEVELOPER

0개의 댓글