Análise de Desempenho de Testes
Ao executar o Vitest, ele reporta diversas métricas de tempo dos seus testes:
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. Veja Transformação de Arquivos.
- Setup: Tempo gasto para executar os arquivos
setupFiles
. - Collect: Tempo gasto para coletar todos os testes nos arquivos de teste. Isso inclui o tempo de importação de todas as dependências dos arquivos.
- Tests: Tempo gasto na execução dos casos de teste.
- Environment: Tempo gasto para configurar o
environment
de teste, por exemplo, JSDOM. - Prepare: Tempo utilizado pelo Vitest para preparar o executor de testes.
Executor de Testes
Quando o tempo de execução dos testes estiver elevado, você pode gerar um perfil do executor de testes. Consulte a documentação do Node.js para as seguintes opções:
WARNING
A opção --prof
não funciona com pool: 'threads'
devido a limitações de node:worker_threads
.
Para passar 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 perfil único
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 perfil único
singleThread: true,
},
},
},
});
Após a execução dos testes, serão gerados arquivos test-runner-profile/*.cpuprofile
e test-runner-profile/*.heapprofile
. Consulte Inspecionando Registros de Perfil para obter instruções sobre como analisar esses arquivos.
Veja Profiling | Examples para um exemplo.
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
Consulte Performance | Vite para mais dicas sobre análise de desempenho específica do Vite.
Recomendamos vite-plugin-inspect
para criar o perfil do desempenho do seu plugin Vite.
Para isso, será necessário 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
deve ser gerado. Consulte Inspecionando Registros de Perfil para obter instruções sobre como analisar esses arquivos.
Transformação de Arquivos
Nos casos em que o tempo de transformação e coleta do seu teste é alto, você pode usar a variável de ambiente DEBUG=vite-node:*
para ver 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
...
Essa estratégia de análise de desempenho é uma boa forma de identificar transformações desnecessárias causadas por barrel files. Se esses logs contiverem arquivos que não deveriam ser carregados quando seu teste é executado, você pode ter barrel files que importam arquivos desnecessariamente.
Você também pode usar a Vitest UI para depurar a lentidão causada por barrel files. O exemplo abaixo mostra como importar arquivos sem barrel file reduz a quantidade de arquivos transformados em aproximadamente 85%.
├── 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 visualizar 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
Cobertura de Código
Se a geração do relatório de cobertura estiver lenta no seu projeto, você pode usar a variável de ambiente DEBUG=vitest:coverage
para habilitar os logs de desempenho.
$ 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
Essa abordagem de análise é excelente para detectar arquivos grandes que são acidentalmente incluídos pelos provedores de cobertura. Por exemplo, se sua configuração estiver incluindo acidentalmente grandes arquivos Javascript minificados na cobertura de código, eles aparecerão nos logs. Nesses casos, você pode precisar ajustar suas opções coverage.include
e coverage.exclude
.
Inspecionando Registros de Perfil
Você pode inspecionar o conteúdo de *.cpuprofile
e *.heapprofile
com várias ferramentas. Veja a lista abaixo com exemplos.