Profilování výkonu testů
Při spuštění Vitestu se zobrazí několik časových metrik vašich 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: Čas strávený transformací souborů. Viz Transformace souborů.
- Setup: Čas potřebný ke spuštění souborů
setupFiles
. - Collect: Čas strávený shromažďováním všech testů v testovacích souborech, včetně importu všech závislostí souborů.
- Tests: Čas strávený spuštěním testovacích případů.
- Environment: Čas potřebný k nastavení testovacího
environment
, například JSDOM. - Prepare: Čas, který Vitest potřebuje k přípravě testovacího runneru.
Testovací runner
Pokud je doba spuštění testu vysoká, můžete vygenerovat profil testovacího runneru. Následující možnosti naleznete v dokumentaci NodeJS:
WARNING
Možnost --prof
nefunguje s pool: 'threads'
kvůli omezením node:worker_threads
.
Chcete-li tyto možnosti předat testovacímu runneru Vitest, definujte poolOptions.<pool>.execArgv
ve vaší konfiguraci 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',
],
// To generate a single profile
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',
],
// To generate a single profile
singleThread: true,
},
},
},
});
Po spuštění testů by měly být vygenerovány soubory test-runner-profile/*.cpuprofile
a test-runner-profile/*.heapprofile
. Pokyny k analýze těchto souborů naleznete v sekci Inspekce záznamů profilování.
Příklad naleznete v Profiling | Examples.
Hlavní vlákno
Profilování hlavního vlákna je užitečné pro ladění způsobu, jakým Vitest používá Vite, a souborů globalSetup
. Zde se také spouštějí vaše Vite pluginy.
TIP
Další tipy týkající se profilování specifického pro Vite naleznete v Performance | Vite.
Pro profilování výkonu vašeho Vite pluginu doporučujeme vite-plugin-inspect
.
K tomu je třeba předat argumenty procesu Node, který spouští Vitest.
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# NodeJS arguments Vitest arguments
Po spuštění testů by měl být vygenerován soubor main-profile/*.cpuprofile
. Pokyny k analýze těchto souborů naleznete v sekci Inspekce záznamů profilování.
Transformace souborů
Pokud je doba transformace a sběru testů vysoká, můžete použít proměnnou prostředí DEBUG=vite-node:*
k zobrazení, které soubory jsou transformovány a spouštěny 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
...
Tato strategie profilování je účinným způsobem, jak identifikovat zbytečné transformace způsobené barrel soubory. Pokud tyto záznamy obsahují soubory, které by neměly být načteny při spuštění testu, je možné, že máte barrel soubory, které zbytečně importují soubory.
Můžete také použít Vitest UI k diagnostice pomalosti způsobené barrel souborem. Níže uvedený příklad ukazuje, jak import souborů bez použití barrel souborů snižuje množství transformovaných souborů o ~85%.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- Soubor k testování
│ ├── 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();
});

Chcete-li vidět, jak jsou soubory transformovány, můžete použít proměnnou prostředí VITE_NODE_DEBUG_DUMP
pro zápis transformovaných souborů do souborového systému:
$ 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
Pokrytí kódu
Pokud je generování pokrytí kódu ve vašem projektu pomalé, můžete použít proměnnou prostředí DEBUG=vitest:coverage
pro povolení protokolování výkonu.
$ 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
Tento přístup profilování je vynikající pro detekci velkých souborů, které jsou náhodně vybrány poskytovateli pokrytí. Například pokud vaše konfigurace náhodně zahrnuje velké sestavené minifikované soubory Javascriptu do pokrytí kódu, objeví se v protokolech. V těchto případech je vhodné upravit své možnosti coverage.include
a coverage.exclude
.
Inspekce záznamů profilování
Obsah souborů *.cpuprofile
a *.heapprofile
můžete zkontrolovat pomocí různých nástrojů. Příklady naleznete v seznamu níže.