Профилирование производительности тестов
При запуске Vitest отображает несколько метрик времени выполнения ваших тестов:
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) # Метрики времени ^^
- Transform: Время, затраченное на преобразование файлов. См. Преобразование файлов.
- Setup: Время, затраченное на выполнение файлов, указанных в
setupFiles
. - Collect: Время, затраченное на сбор всех тестов в тестовых файлах. Это включает время на импорт всех зависимостей файлов.
- Tests: Время, затраченное непосредственно на выполнение тестов.
- Environment: Время, затраченное на настройку тестовой
environment
, например JSDOM. - Prepare: Время, которое Vitest тратит на подготовку тестового раннера.
Тестовый раннер
Если время выполнения ваших тестов значительно, вы можете сгенерировать профиль производительности тестового раннера. См. документацию Node.js по следующим опциям:
WARNING
Опция --prof
не работает с pool: 'threads'
из-за ограничений node:worker_threads
.
Чтобы передать эти опции тестовому раннеру Vitest, задайте poolOptions.<pool>.execArgv
в вашей конфигурации 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',
],
// Чтобы сгенерировать единый профиль
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',
],
// Чтобы сгенерировать единый профиль
singleThread: true,
},
},
},
});
После выполнения тестов будут сгенерированы файлы test-runner-profile/*.cpuprofile
и test-runner-profile/*.heapprofile
. Инструкции по анализу этих файлов см. в разделе Просмотр записей профилирования.
Пример можно найти в Profiling | Examples.
Основной поток
Профилирование основного потока полезно для отладки работы Vitest с Vite и файлов globalSetup
. Именно здесь также выполняются ваши плагины Vite.
TIP
См. Performance | Vite для получения дополнительных советов по профилированию, специфичному для Vite.
Для профилирования производительности ваших плагинов Vite мы рекомендуем vite-plugin-inspect
.
Для этого необходимо передать аргументы процессу Node.js, который запускает Vitest.
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# Аргументы Node.js Аргументы Vitest
После выполнения тестов будет сгенерирован файл main-profile/*.cpuprofile
. Инструкции по анализу этих файлов см. в разделе Просмотр записей профилирования.
Преобразование файлов
Если время трансформации и сбора тестов велико, вы можете использовать переменную окружения DEBUG=vite-node:*
для просмотра файлов, которые преобразуются и выполняются 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
...
Эта стратегия профилирования — эффективный способ выявления ненужных преобразований, вызванных barrel files. Если эти логи содержат файлы, которые не должны загружаться при запуске вашего теста, возможно, ваши barrel files импортируют лишние файлы.
Вы также можете использовать Vitest UI для отладки замедлений, вызванных barrel file. Пример ниже показывает, как импорт файлов без barrel file уменьшает количество преобразованных файлов примерно на 85%.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- Тестируемый файл
│ ├── 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();
});

Чтобы просмотреть, как преобразуются файлы, вы можете использовать переменную окружения VITE_NODE_DEBUG_DUMP
для сохранения преобразованных файлов в файловой системе:
$ 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
Просмотр записей профилирования
Вы можете анализировать содержимое файлов *.cpuprofile
и *.heapprofile
с помощью различных инструментов. Примеры приведены в списке ниже.