パフォーマンスの向上
テストの分離
デフォルトでは、Vitest は pool に基づく分離された環境で各テストファイルを実行します。
threads
プールは、各テストファイルを個別のWorker
で実行します。forks
プールは、各テストファイルを個別の forked child process で実行します。vmThreads
プールは、各テストファイルを個別の VM context で実行しますが、並列処理にはワーカーを使用します。
この分離はテスト時間を大幅に増加させる可能性があります。しかし、副作用に依存せず、状態を適切にクリーンアップできるプロジェクト(通常は node
環境のプロジェクトに当てはまります)では、この増加は望ましくない場合があります。この場合、分離を無効にすることでテスト速度が向上します。そのためには、CLI で --no-isolate
フラグを使用するか、設定ファイルで test.isolate
プロパティを false
に設定します。poolMatchGlobs
を使用して複数のプールを同時に使用している場合は、使用している特定のプールの分離を無効にすることも可能です。
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
フラグを指定するか、設定で test.fileParallelism
プロパティを false
に設定します。
vitest --no-file-parallelism
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
fileParallelism: false,
},
});
プール
デフォルトでは、Vitest は pool: 'forks'
を使用してテストを実行します。'forks'
プールは互換性の問題(ハングするプロセスやセグメンテーション違反)には優れていますが、大規模プロジェクトでは pool: 'threads'
に比べて若干遅くなる場合があります。
設定で pool
オプションを切り替えることで、テスト実行時間を短縮できる可能性があります。
vitest --pool=threads
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'threads',
},
});
シャーディング
テストシャーディングとは、一度にテストケースのごく一部を実行することを指します。これは、テストを同時に実行できる複数のマシンがある場合に有用です。
Vitest のテストを複数の異なる実行に分割するには、--shard
オプションを --reporter=blob
オプションと組み合わせて使用します。
vitest run --reporter=blob --shard=1/3 # 1台目のマシン
vitest run --reporter=blob --shard=2/3 # 2台目のマシン
vitest run --reporter=blob --shard=3/3 # 3台目のマシン
各マシンから .vitest-reports
ディレクトリに保存された結果を収集し、--merge-reports
オプションで結合します。
vitest --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@v4
- 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@v4
- 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 --merge-reports