Profilování výkonu testů
Při spuštění Vitest zobrazí několik časových metrik pro vaše testy:
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) # Metriky času ^^
- Transform: Doba strávená transformací souborů. Viz Transformace souborů.
- Setup: Doba strávená spouštěním souborů
setupFiles
. - Collect: Doba strávená shromažďováním všech testů v testovacích souborech. To zahrnuje čas strávený importem všech závislostí souborů.
- Tests: Doba strávená skutečným spouštěním testovacích případů.
- Environment: Doba strávená nastavením testovacího
environment
, například JSDOM. - Prepare: Doba, kterou Vitest potřebuje k přípravě testovacího runneru.
Testovací runner
Pokud je doba spuštění testů vysoká, můžete vygenerovat profil testovacího runneru. Viz dokumentace Node.js pro následující možnosti:
WARNING
Možnost --prof
nefunguje s pool: 'threads'
kvůli omezením node:worker_threads
.
Pro předání těchto možností 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',
],
// Pro generování jednoho profilu
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',
],
// Pro generování jednoho profilu
singleThread: true,
},
},
},
});
Po spuštění testů by měly vzniknout soubory test-runner-profile/*.cpuprofile
a test-runner-profile/*.heapprofile
. Pokyny pro analýzu těchto souborů naleznete v části 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í použití Vite v rámci Vitest a souborů globalSetup
. Zde také běží vaše Vite pluginy.
TIP
Další tipy na profilování specifické pro Vite naleznete v Performance | Vite.
Pro profilování výkonu vašeho Vite pluginu doporučujeme vite-plugin-inspect
.
K tomu musíte předat argumenty procesu Node, který Vitest spouští.
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# Argumenty NodeJS Argumenty Vitest
Po spuštění testů by měl být vygenerován soubor main-profile/*.cpuprofile
. Pokyny pro analýzu těchto souborů naleznete v části Inspekce záznamů profilování.
Transformace souborů
V případech, kdy 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 efektivní způsob, jak identifikovat zbytečné transformace způsobené barrel files. Pokud tyto záznamy obsahují soubory, které by neměly být načteny při spuštění testu, je možné, že používáte barrel files, které zbytečně importují soubory.
Můžete také použít Vitest UI k odhalení příčin pomalosti způsobené barrel files. Následující příklad ukazuje, jak importování souborů bez barrel files 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 zjistit, jak jsou soubory transformovány, můžete použít proměnnou prostředí VITE_NODE_DEBUG_DUMP
k zápisu 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
Inspekce záznamů profilování
Obsah souborů *.cpuprofile
a *.heapprofile
můžete zkontrolovat pomocí různých nástrojů. Příklady jsou uvedeny v níže uvedeném seznamu.