Análisis de rendimiento de pruebas
Cuando ejecutas Vitest, te proporciona varias métricas de tiempo de tus pruebas:
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étricas de tiempo ^^
- Transform: Tiempo dedicado a transformar los archivos. Consulta Transformación de archivos.
- Setup: Tiempo dedicado a ejecutar los archivos
setupFiles
. - Collect: Tiempo dedicado a recopilar todas las pruebas de los archivos de prueba. Esto incluye el tiempo que tardó en importar todas las dependencias de los archivos.
- Tests: Tiempo dedicado a ejecutar los casos de prueba.
- Environment: Tiempo dedicado a la configuración del
environment
de prueba, por ejemplo, JSDOM. - Prepare: Tiempo que Vitest emplea en preparar el ejecutor de pruebas.
Ejecutor de pruebas
Si el tiempo de ejecución de tus pruebas es elevado, puedes generar un perfil del ejecutor de pruebas. Consulta la documentación de NodeJS para las siguientes opciones:
WARNING
La opción --prof
no funciona con pool: 'threads'
debido a las limitaciones de node:worker_threads
.
Para pasar estas opciones al ejecutor de pruebas de Vitest, define poolOptions.<pool>.execArgv
en tu configuración de 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',
],
// Para generar un único perfil
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',
],
// Para generar un único perfil
singleThread: true,
},
},
},
});
Después de que se hayan ejecutado las pruebas, se generarán los archivos test-runner-profile/*.cpuprofile
y test-runner-profile/*.heapprofile
. Consulta Inspección de registros de perfilado para obtener instrucciones sobre cómo analizar estos archivos.
Consulta Profiling | Examples para ver un ejemplo.
Hilo principal
El análisis de rendimiento del hilo principal es útil para depurar el uso de Vite en Vitest y los archivos globalSetup
. Aquí también se ejecutan tus plugins de Vite.
TIP
Consulta Performance | Vite para obtener más consejos sobre el perfilado específico de Vite.
Recomendamos vite-plugin-inspect
para analizar el rendimiento de tu plugin de Vite.
Para ello, deberás pasar argumentos al proceso de Node que ejecuta Vitest.
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# Argumentos de NodeJS Argumentos de Vitest
Después de que se hayan ejecutado las pruebas, se generará un archivo main-profile/*.cpuprofile
. Consulta Inspección de registros de perfilado para obtener instrucciones sobre cómo analizar estos archivos.
Transformación de archivos
Si el tiempo de transformación y recopilación de tus pruebas es elevado, puedes usar la variable de entorno DEBUG=vite-node:*
para ver qué archivos están siendo transformados y ejecutados por 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
...
Este método de análisis de rendimiento es útil para identificar transformaciones innecesarias causadas por archivos barril. Si estos registros contienen archivos que no deberían cargarse cuando se ejecuta tu prueba, es posible que tengas archivos barril que están importando dependencias innecesariamente.
También puedes usar Vitest UI para solucionar la lentitud causada por archivos barril. El siguiente ejemplo muestra cómo la importación directa de archivos, sin un archivo barril, reduce en aproximadamente un 85% la cantidad de archivos transformados.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- Archivo a probar
│ ├── 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();
});

Para ver cómo se transforman los archivos, puedes usar la variable de entorno VITE_NODE_DEBUG_DUMP
para escribir los archivos transformados en el sistema de archivos:
$ 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
Inspección de registros de perfilado
Puedes analizar el contenido de *.cpuprofile
y *.heapprofile
con varias herramientas. Consulta la lista a continuación para ver ejemplos.