Análise de Desempenho de Testes
Ao executar o Vitest, diversas métricas de tempo dos seus testes são exibidas:
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 gasto na transformação dos arquivos. Para mais detalhes, consulte Transformação de Arquivos.
- Setup: Tempo de execução dos arquivos configurados em
setupFiles
. - Collect: Tempo necessário para coletar todos os testes nos arquivos de teste, incluindo o tempo de importação de todas as dependências de arquivo.
- Tests: Tempo de execução dos casos de teste.
- Environment: Tempo para configurar o
environment
de teste, como o JSDOM. - Prepare: Tempo que o Vitest leva para preparar o executor de testes.
Executor de Testes
Se o tempo de execução dos seus testes estiver elevado, você pode gerar um perfil do executor de testes. As seguintes opções do Node.js são úteis para isso:
WARNING
A opção --prof
não é compatível com pool: 'threads'
devido a limitações de node:worker_threads
.
Para aplicar essas opções ao executor de testes do Vitest, defina poolOptions.<pool>.execArgv
na sua configuração do 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 gerar um ú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 gerar um único perfil
singleThread: true,
},
},
},
});
Após a execução dos testes, os arquivos test-runner-profile/*.cpuprofile
e test-runner-profile/*.heapprofile
serão gerados. Para instruções sobre como analisar esses arquivos, consulte Inspecionando Registros de Perfil.
Um exemplo prático pode ser encontrado em Profiling | Examples.
Thread Principal
A análise de desempenho da thread principal é útil para depurar o uso do Vite pelo Vitest e os arquivos globalSetup
. É também onde seus plugins do Vite são executados.
TIP
Para mais dicas sobre perfilamento específico do Vite, consulte Performance | Vite.
Recomendamos vite-plugin-inspect
para perfilar o desempenho dos seus plugins Vite.
Para realizar essa análise, você precisará passar argumentos para o processo Node que executa o Vitest:
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# Argumentos do Node.js Argumentos do Vitest
Após a execução dos testes, um arquivo main-profile/*.cpuprofile
será gerado. Para instruções sobre como analisar esse arquivo, consulte Inspecionando Registros de Perfil.
Transformação de Arquivos
Quando o tempo de transformação e coleta dos seus testes estiver alto, você pode usar a variável de ambiente DEBUG=vite-node:*
para visualizar quais arquivos são transformados e executados pelo 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álise de desempenho é eficaz para identificar transformações desnecessárias causadas por barrel files. Se esses logs contiverem arquivos que não deveriam ser carregados durante a execução do seu teste, é provável que você tenha barrel files importando arquivos desnecessariamente.
Você também pode usar a Vitest UI para diagnosticar lentidões causadas por barrel files. O exemplo abaixo demonstra como a importação direta de arquivos, sem o uso de barrel files, pode reduzir em aproximadamente 85% a quantidade de arquivos transformados.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- Arquivo a ser testado
│ ├── 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 analisar como os arquivos são transformados, você pode usar a variável de ambiente VITE_NODE_DEBUG_DUMP
para salvar os arquivos transformados no sistema de arquivos:
$ 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
Inspecionando Registros de Perfil
Você pode inspecionar o conteúdo dos arquivos *.cpuprofile
e *.heapprofile
utilizando diversas ferramentas. Veja a lista abaixo para exemplos: