Profilowanie wydajności testów
Podczas uruchamiania Vitest wyświetla szereg metryk czasowych dotyczących 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) # Metryki czasowe ^^
- Transform: Czas poświęcony na transformację plików. Więcej informacji w sekcji Przekształcanie plików.
- Setup: Czas poświęcony na uruchamianie plików zdefiniowanych w
setupFiles
. - Collect: Czas poświęcony na zbieranie wszystkich testów z plików testowych. Obejmuje to czas potrzebny na zaimportowanie 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óry Vitest wykorzystuje na przygotowanie narzędzia do uruchamiania testów.
Profilowanie narzędzia do uruchamiania testów
Gdy czas wykonywania testów jest długi, możesz wygenerować profil narzędzia do uruchamiania testów. Zapoznaj się z 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 uruchamiającego testy 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 zostaną wygenerowane pliki test-runner-profile/*.cpuprofile
i test-runner-profile/*.heapprofile
. Instrukcje dotyczące analizy tych plików znajdziesz w sekcji Inspekcja rekordów profilowania.
Przykład użycia znajdziesz w Profiling | Examples.
Profilowanie głównego wątku
Profilowanie głównego wątku jest przydatne do debugowania sposobu, w jaki Vitest wykorzystuje Vite oraz plików globalSetup
. W tym wątku działają również wtyczki Vite.
TIP
Więcej wskazówek dotyczących profilowania specyficznego dla Vite znajdziesz w Performance | Vite.
Do profilowania wydajności wtyczek Vite zalecamy użycie vite-plugin-inspect
.
Aby to zrobić, musisz przekazać argumenty do procesu Node.js uruchamiającego 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
. Instrukcje dotyczące analizy tych plików znajdziesz w sekcji Inspekcja rekordów profilowania.
Analiza przekształcania 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
...
Takie profilowanie to dobry sposób na identyfikację niepotrzebnych przekształceń spowodowanych przez pliki beczkowe (barrel files). Jeśli te logi zawierają pliki, które nie powinny być ładowane podczas uruchamiania testu, może to oznaczać, że masz pliki beczkowe, które niepotrzebnie importują inne pliki.
Możesz również użyć Vitest UI do debugowania spowolnień spowodowanych przez pliki beczkowe. Poniższy przykład pokazuje, jak importowanie plików bez pliku beczkowego redukuje liczbę transformowanych plików o okoł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 prześledzić proces transformacji plików, możesz użyć zmiennej środowiskowej VITE_NODE_DEBUG_DUMP
w celu zapisania przekształconych plików w systemie plików:
$ 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
Inspekcja rekordów profilowania
Zawartość plików *.cpuprofile
i *.heapprofile
można analizować za pomocą różnych narzędzi. Poniżej znajduje się lista przykładów: