Profilazione delle prestazioni dei test
Quando esegui Vitest, vengono riportate 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) # Time metrics ^^
- Transform: Tempo impiegato per la trasformazione dei file. Vedi Trasformazione file.
- Setup: Tempo necessario per eseguire i file specificati in
setupFiles
. - Collect: Tempo impiegato per la raccolta di tutti i test dai file di test. Questo include il tempo necessario per importare tutte le dipendenze dei file.
- Tests: Tempo impiegato per l'esecuzione effettiva dei casi di test.
- Environment: Tempo necessario per configurare l'
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 NodeJS per le seguenti opzioni:
WARNING
L'opzione --prof
non funziona 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 configurazione di 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
. Vedi Ispezionare i record di profilazione per le istruzioni su come analizzare questi file.
Per un esempio, vedi Profiling | Examples.
Thread principale
La profilazione del thread principale è utile per il debug dell'integrazione di Vite in Vitest e dei file globalSetup
. È anche qui che 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 fare ciò, è necessario passare gli argomenti al processo Node 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
. Vedi Ispezionare i record di profilazione per le istruzioni su come analizzare questi file.
Trasformazione file
Se 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 è utile per identificare trasformazioni non necessarie causate dai barrel files. Se questi log contengono file che non dovrebbero essere caricati durante l'esecuzione del test, ciò potrebbe indicare la presenza di barrel files che importano file inutilmente.
È anche possibile utilizzare Vitest UI per il debug della lentezza causata dai barrel files. L'esempio seguente mostra come l'importazione di file senza barrel file riduca la quantità di file trasformati di circa l'85%.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- File da testare
│ ├── 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 utilizzare 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
Copertura del codice
Se la generazione della copertura del codice è lenta nel tuo progetto, è possibile utilizzare la variabile d'ambiente DEBUG=vitest:coverage
per abilitare la registrazione delle prestazioni.
$ 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
Questo approccio di profilazione è efficace per rilevare file di grandi dimensioni che vengono accidentalmente inclusi dai fornitori di copertura. Ad esempio, se la configurazione include inavvertitamente grandi file Javascript minificati nella copertura del codice, questi appariranno nei log. In questi casi, potrebbe essere opportuno regolare le opzioni coverage.include
e coverage.exclude
.
Ispezionare i record di profilazione
È possibile ispezionare il contenuto dei file *.cpuprofile
e *.heapprofile
con vari strumenti. Di seguito è riportato un elenco di esempi.