Teszt teljesítmény profilozása
Amikor futtatja a Vitestet, az több időmetrikát is jelent a tesztjeiről:
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: Mennyi időt vett igénybe a fájlok átalakítása. Lásd a Fájl átalakítás részt.
- Setup: A
setupFiles
fájlok futtatására fordított idő. - Collect: A tesztfájlokban lévő összes teszt összegyűjtésére fordított idő. Ez magában foglalja azt az időt is, ami az összes fájlfüggőség importálásához szükséges.
- Tests: A tesztesetek tényleges futtatására fordított idő.
- Environment: A teszt
environment
beállítására fordított idő, például JSDOM. - Prepare: A Vitest által a tesztfuttató előkészítéséhez szükséges idő.
Tesztfuttató
Abban az esetben, ha a teszt futási ideje magas, létrehozhat egy profilt a tesztfuttatóhoz. Lásd a NodeJS dokumentációját a következő opciókról:
WARNING
A --prof
opció nem működik a pool: 'threads'
beállítással a node:worker_threads
korlátozásai miatt.
Ezen opciók Vitest tesztfuttatójának átadásához, definiálja a poolOptions.<pool>.execArgv
beállítást a Vitest konfigurációjában:
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',
],
// Egyetlen profil generálásához
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',
],
// Egyetlen profil generálásához
singleThread: true,
},
},
},
});
A tesztek futása után létrejönnie kell a test-runner-profile/*.cpuprofile
és test-runner-profile/*.heapprofile
fájloknak. Lásd a Profilozási rekordok vizsgálata részt a fájlok elemzésére vonatkozó utasításokért.
Lásd a Profiling | Examples példát.
Fő szál
A fő szál profilozása hasznos a Vitest Vite-használatának és a globalSetup
fájlok hibakereséséhez. Itt futnak a Vite bővítményei is.
TIP
Lásd a Performance | Vite oldalt további tippekért a Vite specifikus profilozásról.
Javasoljuk a vite-plugin-inspect
használatát a Vite bővítmény teljesítményének profilozásához.
Ehhez argumentumokat kell átadnia a Node folyamatnak, amely a Vitestet futtatja.
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# NodeJS argumentumok Vitest argumentumok
A tesztek futása után létrejönnie kell egy main-profile/*.cpuprofile
fájlnak. Lásd a Profilozási rekordok vizsgálata részt a fájlok elemzésére vonatkozó utasításokért.
Fájl átalakítás
Abban az esetben, ha a teszt átalakítási és gyűjtési ideje magas, használhatja a DEBUG=vite-node:*
környezeti változót, hogy lássa, mely fájlokat alakítja át és hajtja végre a 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
...
Ez a profilozási stratégia jó módja annak, hogy azonosítsa a barrel fájlok által okozott felesleges átalakításokat. Ha ezek a naplók olyan fájlokat tartalmaznak, amelyeket nem szabadna betölteni a teszt futtatásakor, akkor valószínűleg olyan barrel fájljai vannak, amelyek feleslegesen importálnak fájlokat.
A Vitest UI segítségével is hibakeresést végezhet a barrel fájlok okozta lassúság esetén. Az alábbi példa bemutatja, hogyan csökkenti a fájlok importálása barrel fájl használata nélkül az átalakított fájlok számát ~85%-kal.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- Tesztelendő fájl
│ ├── 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();
});

Ahhoz, hogy lássa, hogyan alakulnak át a fájlok, használhatja a VITE_NODE_DEBUG_DUMP
környezeti változót, hogy az átalakított fájlokat a fájlrendszerbe írja:
$ 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
Kódlefedettség
Ha a kódlefedettség generálása lassú a projektjében, használhatja a DEBUG=vitest:coverage
környezeti változót a teljesítménynaplózás engedélyezéséhez.
$ 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
Ez a profilozási megközelítés kiválóan alkalmas a nagy fájlok észlelésére, amelyek véletlenül bekerülnek a lefedettségi szolgáltatók hatókörébe. Például, ha a konfigurációja véletlenül nagy, minifikált Javascript fájlokat is tartalmaz a kódlefedettségben, akkor azoknak meg kell jelenniük a naplókban. Ezekben az esetekben érdemes lehet módosítani a coverage.include
és coverage.exclude
opciókat.
Profilozási rekordok vizsgálata
A *.cpuprofile
és *.heapprofile
fájlok tartalmát különböző eszközökkel vizsgálhatja. Lásd az alábbi listát példákért.