성능 향상
테스트 격리
기본적으로 Vitest는 풀 설정에 따라 모든 테스트 파일을 격리된 환경에서 실행합니다.
threads
풀은 각 테스트 파일을 별도의Worker
에서 실행합니다.forks
풀은 각 테스트 파일을 별도의 포크된 자식 프로세스에서 실행합니다.vmThreads
풀은 별도의 VM 컨텍스트에서 테스트 파일을 실행하며, 병렬 처리를 위해 워커를 활용합니다.
이러한 격리 방식은 테스트 시간을 상당히 증가시킬 수 있으며, 특히 사이드 이펙트에 의존하지 않고 상태를 적절히 정리하는 프로젝트(일반적으로 node
환경을 사용하는 프로젝트)에는 불필요할 수 있습니다. 이 경우 격리 기능을 비활성화하면 테스트 속도를 향상시킬 수 있습니다. 이를 위해 CLI에 --no-isolate
플래그를 사용하거나, Vitest 설정 파일에서 test.isolate
속성을 false
로 설정할 수 있습니다.
vitest --no-isolate
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
isolate: false,
// 특정 풀에 대해서만 격리를 비활성화할 수도 있습니다.
poolOptions: {
forks: {
isolate: false,
},
},
},
});
TIP
vmThreads
풀을 사용하는 경우 격리 기능을 비활성화할 수 없습니다. 테스트 성능 향상을 위해서는 대신 threads
풀을 사용하세요.
일부 프로젝트에서는 시작 시간을 단축하기 위해 파일 병렬 처리를 비활성화하는 것이 더 유리할 수 있습니다. 이를 위해 CLI에 --no-file-parallelism
플래그를 제공하거나, Vitest 설정 파일에서 test.fileParallelism
속성을 false
로 설정합니다.
vitest --no-file-parallelism
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
fileParallelism: false,
},
});
풀
기본적으로 Vitest는 pool: 'forks'
모드로 테스트를 실행합니다. 'forks'
풀은 특정 호환성 문제(프로세스 종료 실패 및 세그먼트 오류)에 더 적합하지만, 대규모 프로젝트에서는 pool: 'threads'
보다 약간 느릴 수 있습니다.
Vitest 설정 파일에서 pool
옵션을 변경하여 테스트 실행 시간을 개선할 수 있습니다.
vitest --pool=threads
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'threads',
},
});
샤딩
테스트 샤딩은 전체 테스트 스위트를 여러 그룹 또는 샤드로 분할하는 프로세스입니다. 이는 대규모 테스트 스위트를 가지고 있고, 해당 스위트의 하위 집합을 동시에 실행할 수 있는 여러 대의 머신이 있을 때 특히 유용합니다.
Vitest 테스트를 여러 번 실행하여 분할하려면 --reporter=blob
옵션과 함께 --shard
옵션을 사용하세요.
vitest run --reporter=blob --shard=1/3 # 첫 번째 머신
vitest run --reporter=blob --shard=2/3 # 두 번째 머신
vitest run --reporter=blob --shard=3/3 # 세 번째 머신
Vitest는 테스트 케이스가 아닌 _테스트 파일_을 샤드로 분할합니다. 예를 들어, 1000개의 테스트 파일이 있는 경우
--shard=1/4
옵션은 개별 파일에 포함된 테스트 케이스 수와 관계없이 250개의 테스트 파일을 실행합니다.
각 머신의 .vitest-reports
디렉토리에 저장된 결과를 수집한 후, --merge-reports
옵션을 사용하여 병합합니다.
vitest run --merge-reports
GitHub Actions 예시
이 설정은 https://github.com/vitest-tests/test-sharding에서도 사용됩니다.
# https://playwright.dev/docs/test-sharding에서 영감을 받음
name: Tests
on:
push:
branches:
- main
jobs:
tests:
runs-on: ubuntu-latest
strategy:
matrix:
shardIndex: [1, 2, 3, 4]
shardTotal: [4]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Install dependencies
run: pnpm i
- name: Run tests
run: pnpm run test --reporter=blob --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
- name: Upload blob report to GitHub Actions Artifacts
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v4
with:
name: blob-report-${{ matrix.shardIndex }}
path: .vitest-reports/*
include-hidden-files: true
retention-days: 1
merge-reports:
if: ${{ !cancelled() }}
needs: [tests]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Install dependencies
run: pnpm i
- name: Download blob reports from GitHub Actions Artifacts
uses: actions/download-artifact@v4
with:
path: .vitest-reports
pattern: blob-report-*
merge-multiple: true
- name: Merge reports
run: npx vitest --merge-reports
TIP
테스트 샤딩은 CPU 코어 수가 많은 머신에서도 유용하게 활용될 수 있습니다.
Vitest는 메인 스레드에서 단일 Vite 서버만 실행하며, 나머지 스레드는 테스트 파일을 실행하는 데 사용됩니다. CPU 코어 수가 많은 머신에서는 메인 스레드가 병목 현상을 일으킬 수 있습니다. 예를 들어, 32 CPU 머신에서는 메인 스레드가 31개의 테스트 스레드에서 발생하는 모든 요청을 처리해야 합니다.
메인 스레드의 Vite 서버 부하를 줄이려면 테스트 샤딩을 사용할 수 있습니다. 이를 통해 부하를 여러 Vite 서버에 분산시킬 수 있습니다.
# 32 CPU 환경에서 테스트를 4개의 샤드로 분할하는 예시.
# 각 프로세스에 메인 스레드 1개가 필요하며, 테스트 러너를 위한 스레드는 7개입니다. (1+7)*4 = 32
# 풀에 따라 VITEST_MAX_THREADS 또는 VITEST_MAX_FORKS를 설정하세요:
VITEST_MAX_THREADS=7 vitest run --reporter=blob --shard=1/4 & \
VITEST_MAX_THREADS=7 vitest run --reporter=blob --shard=2/4 & \
VITEST_MAX_THREADS=7 vitest run --reporter=blob --shard=3/4 & \
VITEST_MAX_THREADS=7 vitest run --reporter=blob --shard=4/4 & \
wait # https://man7.org/linux/man-pages/man2/waitpid.2.html
vitest run --merge-reports