Profilowanie wydajności testów
Podczas uruchamiania Vitest raportuje wiele metryk czasowych Twoich testów:
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: Czas poświęcony na przekształcanie plików. Zobacz Przekształcanie plików.
- Setup: Czas poświęcony na wykonywanie plików
setupFiles
. - Collect: Czas poświęcony na zbieranie wszystkich testów w plikach testowych. Obejmuje to czas importowania wszystkich zależności plików.
- Tests: Czas poświęcony na faktyczne uruchamianie przypadków testowych.
- Environment: Czas poświęcony na konfigurację środowiska testowego
environment
, na przykład JSDOM. - Prepare: Czas, którego Vitest używa do przygotowania środowiska testowego.
Narzędzie do uruchamiania testów
Gdy czas wykonywania testów jest wysoki, możesz wygenerować profil narzędzia do uruchamiania testów. Zobacz dokumentację NodeJS dotyczącą następujących opcji:
WARNING
Opcja --prof
nie działa z pool: 'threads'
z powodu ograniczeń node:worker_threads
.
Aby przekazać te opcje do narzędzia do uruchamiania testów Vitest, zdefiniuj poolOptions.<pool>.execArgv
w konfiguracji 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',
],
// Aby wygenerować pojedynczy profil
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',
],
// Aby wygenerować pojedynczy profil
singleThread: true,
},
},
},
});
Po uruchomieniu testów powinny zostać wygenerowane pliki test-runner-profile/*.cpuprofile
i test-runner-profile/*.heapprofile
. Zobacz Inspekcja rekordów profilowania w celu uzyskania instrukcji, jak analizować te pliki.
Zobacz Profilowanie | Przykłady, aby zapoznać się z przykładem.
Główny wątek
Profilowanie głównego wątku jest przydatne do debugowania użycia Vite w Vitest i plików globalSetup
. To także miejsce, gdzie działają Twoje wtyczki Vite.
TIP
Więcej wskazówek dotyczących profilowania specyficznego dla Vite znajdziesz w Wydajność | Vite.
Polecamy vite-plugin-inspect
do profilowania wydajności Twojej wtyczki Vite.
Aby to zrobić, musisz przekazać argumenty do procesu Node, który uruchamia Vitest.
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# Argumenty NodeJS Argumenty Vitest
Po uruchomieniu testów powinien zostać wygenerowany plik main-profile/*.cpuprofile
. Zobacz Inspekcja rekordów profilowania w celu uzyskania instrukcji, jak analizować te pliki.
Przekształcanie plików
Gdy czas przekształcania i zbierania testów jest wysoki, możesz użyć zmiennej środowiskowej DEBUG=vite-node:*
, aby zobaczyć, które pliki są przekształcane i wykonywane przez 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
...
Ta strategia profilowania jest dobrym sposobem na identyfikację niepotrzebnych przekształceń spowodowanych przez pliki barrel. Jeśli te logi zawierają pliki, które nie powinny być ładowane podczas uruchamiania testu, możesz mieć pliki barrel, które niepotrzebnie importują pliki.
Możesz również użyć Vitest UI do debugowania spowolnień związanych z plikami barrel. Poniższy przykład pokazuje, jak importowanie plików bez pliku barrel zmniejsza ilość przekształconych plików o ~85%.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- Plik do testowania
│ ├── 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();
});

Aby zobaczyć, jak pliki są przekształcane, możesz użyć zmiennej środowiskowej VITE_NODE_DEBUG_DUMP
, aby zapisać przekształcone pliki na dysku:
$ 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
Pokrycie kodu
Jeśli generowanie pokrycia kodu jest wolne w Twoim projekcie, możesz użyć zmiennej środowiskowej DEBUG=vitest:coverage
, aby włączyć logi wydajności.
$ 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
To podejście do profilowania jest świetne do wykrywania dużych plików, które są przypadkowo wybierane przez dostawców pokrycia. Na przykład, jeśli Twoja konfiguracja przypadkowo zawiera duże, zminifikowane pliki Javascript w pokryciu kodu, powinny one pojawić się w logach. W takich przypadkach możesz chcieć dostosować opcje coverage.include
i coverage.exclude
.
Inspekcja rekordów profilowania
Możesz sprawdzić zawartość plików *.cpuprofile
i *.heapprofile
za pomocą różnych narzędzi. Poniżej znajduje się lista przykładów.