テストパフォーマンスのプロファイリング
Vitestを実行すると、テストの時間に関するメトリクスが報告されます。
bashRUN v2.1.1 /x/vitest/examples/profiling ✓ test/prime-number.test.ts (1) 4517ms ✓ generate prime number 4517ms Test Files 1 passed (1) Tests 1 passed (1) Start at 09:32:53 Duration 4.80s (transform 44ms, setup 0ms, collect 35ms, tests 4.52s, environment 0ms, prepare 81ms) # Time metrics ^^
- Transform: ファイル変換にかかった時間。ファイル変換を参照してください。
- Setup:
setupFiles
の実行に費やされた時間。 - Collect: テストファイル内のすべてのテストを収集する時間。これには、すべてのファイル依存関係をインポートするために要した時間が含まれます。
- Tests: テストケースを実行する時間。
- Environment: テスト
environment
(例:JSDOM)のセットアップにかかった時間。 - Prepare: Vitestがテストランナーを準備する時間。
テストランナー
テスト実行時間が長い場合は、テストランナーのプロファイルを生成できます。以下のオプションについては、Node.jsのドキュメントを参照してください。
WARNING
--prof
オプションは、node:worker_threads
の制限により、pool: 'threads'
では動作しません。
これらのオプションをVitestのテストランナーに渡すには、Vitestの設定でpoolOptions.<pool>.execArgv
を定義します。
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'forks',
poolOptions: {
forks: {
execArgv: [
'--cpu-prof',
'--cpu-prof-dir=test-runner-profile',
'--heap-prof',
'--heap-prof-dir=test-runner-profile',
],
// 単一のプロファイルを生成するには
singleFork: true,
},
},
},
});
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'threads',
poolOptions: {
threads: {
execArgv: [
'--cpu-prof',
'--cpu-prof-dir=test-runner-profile',
'--heap-prof',
'--heap-prof-dir=test-runner-profile',
],
// 単一のプロファイルを生成するには
singleThread: true,
},
},
},
});
テスト実行後、test-runner-profile/*.cpuprofile
とtest-runner-profile/*.heapprofile
ファイルが生成されます。これらのファイルを分析する方法については、プロファイリングレコードの検査を参照してください。
例については、Profiling | Examplesを参照してください。
メインスレッド
メインスレッドのプロファイリングは、VitestのVite使用状況およびglobalSetup
ファイルのデバッグに役立ちます。 ここではViteプラグインも実行されます。
TIP
Vite固有のプロファイリングに関するその他のヒントについては、Performance | Viteを参照してください。
Viteプラグインのパフォーマンスをプロファイリングするには、vite-plugin-inspect
をお勧めします。
これを行うには、Vitestを実行するNode.jsプロセスに引数を渡す必要があります。
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# Node.jsの引数 Vitestの引数
テスト実行後、main-profile/*.cpuprofile
ファイルが生成されます。これらのファイルを分析する方法については、プロファイリングレコードの検査を参照してください。
ファイル変換
テストの変換と収集に時間がかかる場合、DEBUG=vite-node:*
環境変数を使用して、どのファイルがvite-node
によって変換および実行されているかを確認できます。
$ DEBUG=vite-node:* vitest --run
RUN v2.1.1 /x/vitest/examples/profiling
vite-node:server:request /x/vitest/examples/profiling/global-setup.ts +0ms
vite-node:client:execute /x/vitest/examples/profiling/global-setup.ts +0ms
vite-node:server:request /x/vitest/examples/profiling/test/prime-number.test.ts +45ms
vite-node:client:execute /x/vitest/examples/profiling/test/prime-number.test.ts +26ms
vite-node:server:request /src/prime-number.ts +9ms
vite-node:client:execute /x/vitest/examples/profiling/src/prime-number.ts +9ms
vite-node:server:request /src/unnecessary-file.ts +6ms
vite-node:client:execute /x/vitest/examples/profiling/src/unnecessary-file.ts +4ms
...
このプロファイリング戦略は、バレルファイルによって引き起こされる不要な変換を特定するのに役立ちます。 これらのログに、テスト実行時に読み込まれるべきではないファイルが含まれている場合、バレルファイルが不要なファイルをインポートしている可能性があります。
Vitest UIを使用して、バレルファイルによって引き起こされる遅延のデバッグも可能です。 以下の例は、バレルファイルなしでファイルをインポートすると、変換対象ファイルの量が約85%削減されることを示しています。
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- テスト対象ファイル
│ ├── index.ts
│ ├── location.ts
│ ├── math.ts
│ ├── time.ts
│ └── users.ts
├── test
│ └── formatters.test.ts
└── vitest.config.ts
import { expect, test } from 'vitest';
import { formatter } from '../src/utils';
import { formatter } from '../src/utils/formatters';
test('formatter works', () => {
expect(formatter).not.toThrow();
});

ファイルの変換方法を確認するには、VITE_NODE_DEBUG_DUMP
環境変数を使用して、変換済みファイルをファイルシステムに書き出せます。
$ VITE_NODE_DEBUG_DUMP=true vitest --run
[vite-node] [debug] dump modules to /x/examples/profiling/.vite-node/dump
RUN v2.1.1 /x/vitest/examples/profiling
...
$ ls .vite-node/dump/
_x_examples_profiling_global-setup_ts-1292904907.js
_x_examples_profiling_test_prime-number_test_ts-1413378098.js
_src_prime-number_ts-525172412.js
コードカバレッジ
コードカバレッジの生成が遅いプロジェクトでは、DEBUG=vitest:coverage
環境変数を使用してパフォーマンスログを有効化できます。
$ DEBUG=vitest:coverage vitest --run --coverage
RUN v3.1.1 /x/vitest-example
vitest:coverage Reading coverage results 2/2
vitest:coverage Converting 1/2
vitest:coverage 4 ms /x/src/multiply.ts
vitest:coverage Converting 2/2
vitest:coverage 552 ms /x/src/add.ts
vitest:coverage Uncovered files 1/2
vitest:coverage File "/x/src/large-file.ts" is taking longer than 3s
vitest:coverage 3027 ms /x/src/large-file.ts
vitest:coverage Uncovered files 2/2
vitest:coverage 4 ms /x/src/untested-file.ts
vitest:coverage Generate coverage total time 3521 ms
このプロファイリングアプローチは、カバレッジプロバイダーが誤って選択した大容量ファイルを検出するのに最適です。 たとえば、設定が誤って大きなビルド済みミニファイされたJavaScriptファイルをコードカバレッジに含めている場合、それらはログに表示されます。 このような場合は、coverage.include
およびcoverage.exclude
オプションを調整することをお勧めします。
プロファイリングレコードの検査
*.cpuprofile
および*.heapprofile
の内容は、さまざまなツールで検査できます。例については、以下のリストをご覧ください。