Profilage des performances des tests
Lors de l'exécution de Vitest, plusieurs métriques de temps sont fournies pour vos tests :
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) # Métriques de temps
- Transform : Durée de la transformation des fichiers. Voir Transformation de fichiers.
- Setup : Temps d'exécution des fichiers spécifiés dans
setupFiles
. - Collect : Temps nécessaire pour collecter tous les tests dans les fichiers de test, incluant l'importation de toutes les dépendances de fichiers.
- Tests : Temps d'exécution des cas de test.
- Environment : Temps de configuration de l'environnement de test, par exemple JSDOM.
- Prepare : Temps utilisé par Vitest pour préparer le lanceur de tests.
Lanceur de tests
Si le temps d'exécution de vos tests est élevé, vous pouvez générer un profil du lanceur de tests. Consultez la documentation de NodeJS concernant les options suivantes :
WARNING
L'option --prof
ne fonctionne pas avec pool: 'threads'
en raison des limitations de node:worker_threads
.
Pour transmettre ces options au lanceur de tests de Vitest, définissez poolOptions.<pool>.execArgv
dans votre configuration 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',
],
// Pour générer un profil unique
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',
],
// Pour générer un profil unique
singleThread: true,
},
},
},
});
Après l'exécution des tests, des fichiers test-runner-profile/*.cpuprofile
et test-runner-profile/*.heapprofile
seront générés. Voir Inspection des enregistrements de profilage pour les instructions sur l'analyse de ces fichiers.
Voir Profiling | Examples pour un exemple complet.
Thread principal
Le profilage du thread principal est utile pour déboguer la manière dont Vitest utilise Vite et les fichiers globalSetup
. C'est également là que vos plugins Vite s'exécutent.
TIP
Voir Performance | Vite pour des conseils supplémentaires sur le profilage spécifique à Vite.
Nous recommandons vite-plugin-inspect
pour analyser les performances de vos plugins Vite.
Pour ce faire, vous devrez transmettre des arguments au processus Node qui exécute Vitest.
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# Arguments Node.js Arguments Vitest
Après l'exécution des tests, un fichier main-profile/*.cpuprofile
sera généré. Voir Inspection des enregistrements de profilage pour les instructions sur l'analyse de ces fichiers.
Transformation de fichiers
Si le temps de transformation et de collecte de vos tests est élevé, vous pouvez utiliser la variable d'environnement DEBUG=vite-node:*
pour voir quels fichiers sont transformés et exécutés par 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
...
Cette stratégie de profilage est un excellent moyen d'identifier les transformations inutiles causées par les fichiers « barrel ». Si ces journaux contiennent des fichiers qui ne devraient pas être chargés lors de l'exécution de votre test, il est possible que vous ayez des fichiers « barrel » qui importent des dépendances inutilement.
Vous pouvez également utiliser l'interface utilisateur de Vitest pour diagnostiquer les ralentissements causés par les fichiers « barrel ». L'exemple ci-dessous montre comment l'importation directe de fichiers, sans passer par un fichier « barrel », réduit la quantité de fichiers transformés d'environ 85 %.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- Fichier à tester
│ ├── 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();
});

Pour voir comment les fichiers sont transformés, vous pouvez utiliser la variable d'environnement VITE_NODE_DEBUG_DUMP
afin d'enregistrer les fichiers transformés sur le système de fichiers :
$ 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
Inspection des enregistrements de profilage
Vous pouvez inspecter le contenu des fichiers *.cpuprofile
et *.heapprofile
à l'aide de divers outils. Voici quelques exemples :