Улучшение производительности
Изоляция тестов
По умолчанию Vitest запускает каждый тестовый файл в изолированной среде, основанной на пуле:
- Пул
threads
запускает каждый тестовый файл в отдельномWorker
. - Пул
forks
запускает каждый тестовый файл в отдельном дочернем процессе. - Пул
vmThreads
запускает каждый тестовый файл в отдельном контексте VM, но использует воркеры для параллельного выполнения.
Использование изоляции значительно увеличивает время выполнения тестов, что может быть нежелательно для проектов, которые не зависят от побочных эффектов и правильно очищают свое состояние (что обычно характерно для проектов с окружением node
). В таких случаях отключение изоляции позволит ускорить выполнение тестов. Для этого можно передать флаг --no-isolate
в CLI или установить свойство test.isolate
в конфигурации на false
.
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 разделяет ваши тестовые файлы, а не тестовые случаи, на шарды. Если у вас 1000 тестовых файлов, опция
--shard=1/4
запустит 250 тестовых файлов, независимо от того, сколько тестовых случаев содержится в отдельных файлах.
Соберите результаты, хранящиеся в каталоге .vitest-reports
с каждой из машин, и объедините их с помощью опции --merge-reports
:
vitest run --merge-reports
Github action example
Эта настройка также используется по адресу 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@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- 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@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- 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 run --merge-reports