Улучшение производительности
Изоляция тестов
По умолчанию Vitest запускает каждый тестовый файл в изолированной среде, основанной на пуле:
- Пул
threads
запускает каждый тестовый файл в отдельномWorker
. - Пул
forks
запускает каждый тестовый файл в отдельном форкнутом дочернем процессе. - Пул
vmThreads
запускает каждый тестовый файл в отдельном контексте VM, но использует воркеры для параллельного выполнения.
Это может существенно увеличить время тестирования, что нежелательно для проектов, которые не зависят от побочных эффектов и корректно очищают своё состояние (что обычно характерно для проектов в среде node
). В таких случаях отключение изоляции позволит ускорить выполнение тестов. Для этого можно использовать флаг --no-isolate
в CLI или установить свойство test.isolate
в конфигурации в значение false
. Если вы используете несколько пулов одновременно с poolMatchGlobs
, вы также можете отключить изоляцию для конкретного используемого пула.
vitest --no-isolate
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
isolate: false,
// вы также можете отключить изоляцию только для определенных пулов
poolOptions: {
forks: {
isolate: false,
},
},
},
});
TIP
Если вы используете пул vmThreads
, вы не можете отключить изоляцию. Вместо этого используйте пул threads
для улучшения производительности ваших тестов.
Для некоторых проектов также может быть полезно отключить параллельное выполнение файлов для улучшения времени запуска. Для этого передайте флаг --no-file-parallelism
в CLI или установите свойство test.fileParallelism
в конфигурации в false
.
vitest --no-file-parallelism
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
fileParallelism: false,
},
});
Пул
По умолчанию Vitest запускает тесты в pool: 'forks'
. Хотя пул 'forks'
предпочтительнее для решения проблем совместимости (зависание процесса и сегфолты), он может быть немного медленнее, чем pool: 'threads'
в крупных проектах.
Вы можете попробовать улучшить время выполнения тестов, изменив опцию pool
в конфигурации:
vitest --pool=threads
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'threads',
},
});
Шардирование
Шардирование тестов означает выполнение небольшого подмножества тестовых случаев за раз. Это может быть полезно, если у вас есть несколько машин для параллельного запуска тестов.
Чтобы разделить тесты Vitest на несколько разных запусков, используйте опцию --shard
с опцией --reporter=blob
:
vitest run --reporter=blob --shard=1/3 # 1-я машина
vitest run --reporter=blob --shard=2/3 # 2-я машина
vitest run --reporter=blob --shard=3/3 # 3-я машина
Соберите результаты с каждой машины, хранящиеся в каталоге .vitest-reports
, и объедините их с помощью опции --merge-reports
:
vitest --merge-reports
Пример для GitHub Actions
Эта настройка также используется в https://github.com/vitest-tests/test-sharding.
# Inspired from https://playwright.dev/docs/test-sharding
name: Tests
on:
push:
branches:
- main
jobs:
tests:
runs-on: ubuntu-latest
strategy:
matrix:
shardIndex: [1, 2, 3, 4]
shardTotal: [4]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Install dependencies
run: pnpm i
- name: Run tests
run: pnpm run test --reporter=blob --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
- name: Upload blob report to GitHub Actions Artifacts
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v4
with:
name: blob-report-${{ matrix.shardIndex }}
path: .vitest-reports/*
include-hidden-files: true
retention-days: 1
merge-reports:
if: ${{ !cancelled() }}
needs: [tests]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Install dependencies
run: pnpm i
- name: Download blob reports from GitHub Actions Artifacts
uses: actions/download-artifact@v4
with:
path: .vitest-reports
pattern: blob-report-*
merge-multiple: true
- name: Merge reports
run: npx vitest --merge-reports
TIP
Шардирование тестов также может быть полезно на машинах с большим количеством ядер ЦП.
Vitest будет запускать только один сервер Vite в своём главном потоке. Остальные потоки используются для запуска тестовых файлов. На машине с большим количеством ядер ЦП главный поток может стать узким местом в производительности, так как он не может обрабатывать все запросы, поступающие от рабочих потоков. Например, на 32-ядерной машине главный поток отвечает за обработку нагрузки, поступающей от 31 тестового потока.
Чтобы уменьшить нагрузку на сервер Vite главного потока, вы можете использовать шардирование тестов. Нагрузка может быть распределена между несколькими серверами Vite.
# Пример разделения тестов на 32 процессорах на 4 фрагмента (шарда).
# Поскольку каждому процессу нужен 1 основной поток, для запуска тестов доступно 7 потоков (1+7)*4 = 32
# Используйте VITEST_MAX_THREADS или VITEST_MAX_FORKS в зависимости от пула (процессов/потоков):
VITEST_MAX_THREADS=7 vitest run --reporter=blob --shard=1/4 & \
VITEST_MAX_THREADS=7 vitest run --reporter=blob --shard=2/4 & \
VITEST_MAX_THREADS=7 vitest run --reporter=blob --shard=3/4 & \
VITEST_MAX_THREADS=7 vitest run --reporter=blob --shard=4/4 & \
wait # https://man7.org/linux/man-pages/man2/waitpid.2.html
vitest --merge-reports