Analisi delle prestazioni dei test
Quando esegui Vitest, vengono visualizzate diverse metriche temporali relative ai tuoi test:
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) # Metriche di tempo ^^
- Transform: Tempo impiegato per la trasformazione dei file. Vedi Trasformazione file.
- Setup: Tempo di esecuzione dei file configurati in
setupFiles
. - Collect: Tempo necessario per la raccolta di tutti i test all'interno dei file di test. Questo include il tempo richiesto per importare tutte le dipendenze dei file.
- Tests: Tempo di esecuzione effettivo dei casi di test.
- Environment: Tempo di configurazione dell'
environment
di test, ad esempio JSDOM. - Prepare: Tempo impiegato da Vitest per preparare il test runner.
Test runner
Se il tempo di esecuzione dei test è elevato, è possibile generare un profilo del test runner. Consulta la documentazione di Node.js per le seguenti opzioni:
WARNING
L'opzione --prof
non è compatibile con pool: 'threads'
a causa delle limitazioni di node:worker_threads
.
Per passare queste opzioni al test runner di Vitest, definisci poolOptions.<pool>.execArgv
nella tua configurazione Vitest:
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',
],
// Per generare un singolo profilo
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',
],
// Per generare un singolo profilo
singleThread: true,
},
},
},
});
Dopo l'esecuzione dei test, verranno generati i file test-runner-profile/*.cpuprofile
e test-runner-profile/*.heapprofile
. Consulta Ispezionare i record di profilazione per le istruzioni su come analizzare questi file.
Vedi Profiling | Examples per un esempio pratico.
Thread principale
La profilazione del thread principale è utile per il debug dell'utilizzo di Vite da parte di Vitest e dei file globalSetup
. È anche il contesto in cui vengono eseguiti i plugin Vite.
TIP
Vedi Performance | Vite per ulteriori suggerimenti sulla profilazione specifica di Vite.
Consigliamo vite-plugin-inspect
per la profilazione delle prestazioni dei plugin Vite.
Per eseguire questa operazione, è necessario passare gli argomenti al processo Node.js che esegue Vitest.
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# Argomenti NodeJS Argomenti Vitest
Dopo l'esecuzione dei test, verrà generato un file main-profile/*.cpuprofile
. Consulta Ispezionare i record di profilazione per le istruzioni su come analizzare questo file.
Trasformazione file
Nei casi in cui il tempo di trasformazione e raccolta dei test è elevato, è possibile utilizzare la variabile d'ambiente DEBUG=vite-node:*
per visualizzare quali file vengono trasformati ed eseguiti da 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
...
Questa strategia di profilazione è un metodo efficace per identificare trasformazioni non necessarie causate dai barrel files. Se questi log contengono file che non dovrebbero essere caricati durante l'esecuzione del test, potrebbe indicare la presenza di barrel files che importano file inutilmente.
È anche possibile usare Vitest UI per il debug della lentezza causata dai barrel files. L'esempio seguente mostra come l'importazione diretta dei file, senza l'uso di barrel files, riduca di circa l'85% la quantità di file trasformati.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- File di test
│ ├── 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();
});

Per vedere come vengono trasformati i file, è possibile usare la variabile d'ambiente VITE_NODE_DEBUG_DUMP
per scrivere i file trasformati nel file system:
$ 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
Ispezionare i record di profilazione
È possibile ispezionare il contenuto dei file *.cpuprofile
e *.heapprofile
con vari strumenti. Di seguito è riportato un elenco di esempi.