Leistungsprofilierung von Tests
Wenn Sie Vitest ausführen, werden mehrere Zeitmetriken Ihrer Tests gemeldet:
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: Die Zeit, die für die Transformation der Dateien aufgewendet wurde. Siehe Dateitransformation.
- Setup: Die Zeit, die für die Ausführung der
setupFiles
-Dateien aufgewendet wurde. - Collect: Die Zeit, die für das Sammeln aller Tests in den Testdateien aufgewendet wurde. Dies beinhaltet die Zeit, die für den Import aller Dateabhängigkeiten benötigt wurde.
- Tests: Die Zeit, die für die tatsächliche Ausführung der Testfälle benötigt wurde.
- Environment: Die Zeit, die für die Einrichtung der Testumgebung (
environment
), z.B. JSDOM, aufgewendet wurde. - Prepare: Die Zeit, die Vitest für die Vorbereitung des Test-Runners benötigt.
Test-Runner
Wenn Ihre Testausführungszeit hoch ist, können Sie ein Profil des Test-Runners generieren. Beachten Sie die NodeJS-Dokumentation für die folgenden Optionen:
WARNING
Die Option --prof
funktioniert nicht mit pool: 'threads'
aufgrund von Einschränkungen von node:worker_threads
.
Um diese Optionen an den Vitest-Testlauf zu übergeben, definieren Sie poolOptions.<pool>.execArgv
in Ihrer Vitest-Konfiguration:
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',
],
// Um ein einzelnes Profil zu generieren
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',
],
// Um ein einzelnes Profil zu generieren
singleThread: true,
},
},
},
});
Nachdem die Tests ausgeführt wurden, sollten test-runner-profile/*.cpuprofile
- und test-runner-profile/*.heapprofile
-Dateien generiert worden sein. Anweisungen zur Analyse dieser Dateien finden Sie unter Profilierungsdatensätze inspizieren.
Ein Beispiel finden Sie unter Profiling | Examples.
Haupt-Thread
Die Profilierung des Haupt-Threads ist nützlich für das Debugging der Vite-Nutzung in Vitest sowie der globalSetup
-Dateien. Hier laufen auch Ihre Vite-Plugins.
TIP
Weitere Tipps zur Vite-spezifischen Profilierung finden Sie unter Leistung | Vite.
Wir empfehlen vite-plugin-inspect
zur Profilierung der Leistung Ihrer Vite-Plugins.
Dazu müssen Sie Argumente an den Node-Prozess übergeben, der Vitest ausführt.
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# NodeJS-Argumente Vitest-Argumente
Nachdem die Tests ausgeführt wurden, sollte eine main-profile/*.cpuprofile
-Datei generiert worden sein. Anweisungen zur Analyse dieser Dateien finden Sie unter Profilierungsdatensätze inspizieren.
Dateitransformation
Wenn Ihre Testtransformations- und Sammlungszeit hoch ist, können Sie die Umgebungsvariable DEBUG=vite-node:*
verwenden, um zu sehen, welche Dateien von vite-node
transformiert und ausgeführt werden.
$ 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
...
Diese Profilierungsstrategie ist eine gute Möglichkeit, unnötige Transformationen zu identifizieren, die durch Barrel-Dateien verursacht werden. Wenn diese Protokolle Dateien enthalten, die beim Ausführen Ihres Tests nicht geladen werden sollten, haben Sie möglicherweise Barrel-Dateien, die unnötigerweise Dateien importieren.
Sie können auch die Vitest UI verwenden, um Langsamkeit zu debuggen, die durch Barrel-Dateien verursacht wird. Das folgende Beispiel zeigt, wie das Importieren von Dateien ohne Barrel-Datei die Anzahl der transformierten Dateien um ~85% reduziert.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- Zu testende Datei
│ ├── 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();
});

Um zu sehen, wie Dateien transformiert werden, können Sie die Umgebungsvariable VITE_NODE_DEBUG_DUMP
verwenden, um transformierte Dateien im Dateisystem zu schreiben:
$ 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
Code-Abdeckung
Wenn die Generierung der Code-Abdeckung in Ihrem Projekt langsam ist, können Sie die Umgebungsvariable DEBUG=vitest:coverage
verwenden, um die Leistungsprotokollierung zu aktivieren.
$ 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
Dieser Profilierungsansatz ist hervorragend geeignet, um große Dateien zu erkennen, die versehentlich von Abdeckungs-Providern erfasst werden. Wenn Ihre Konfiguration beispielsweise versehentlich große, minifizierte Javascript-Dateien in die Code-Abdeckung einschließt, sollten diese in den Protokollen erscheinen. In diesen Fällen möchten Sie möglicherweise Ihre Optionen coverage.include
und coverage.exclude
anpassen.
Profilierungsdatensätze inspizieren
Sie können den Inhalt von *.cpuprofile
und *.heapprofile
mit verschiedenen Tools inspizieren. Eine Liste mit Beispielen finden Sie unten.