Skip to content
Vitest 2
Main Navigation РуководствоAPIКонфигурацияРежим браузераПродвинутый
2.1.9
1.6.1
0.34.6

Русский

English
简体中文
繁體中文
Español
Français
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

Русский

English
简体中文
繁體中文
Español
Français
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

Внешний вид

Sidebar Navigation

Зачем Vitest

Начало работы

Функциональность

Рабочая область

Интерфейс командной строки

Фильтрация тестов

Репортёры

Покрытие кода

Снапшоты

Мокирование

Тестирование типов

Vitest UI

In-source тестирование (Тестирование в исходном коде)

Контекст теста

Тестовая среда

Расширение проверок (matchers)

Интеграции с IDE

Отладка

Сравнения с другими тестовыми фреймворками

Руководство по миграции

Распространенные ошибки

Profiling Test Performance

Улучшение производительности

Содержание страницы

Улучшение производительности ​

Изоляция тестов ​

По умолчанию Vitest запускает каждый тестовый файл в изолированной среде, основанной на пуле:

  • Пул threads запускает каждый тестовый файл в отдельном Worker.
  • Пул forks запускает каждый тестовый файл в отдельном форкнутом дочернем процессе.
  • Пул vmThreads запускает каждый тестовый файл в отдельном контексте VM, но использует воркеры для параллельного выполнения.

Это может существенно увеличить время тестирования, что нежелательно для проектов, которые не зависят от побочных эффектов и корректно очищают своё состояние (что обычно характерно для проектов в среде node). В таких случаях отключение изоляции позволит ускорить выполнение тестов. Для этого можно использовать флаг --no-isolate в CLI или установить свойство test.isolate в конфигурации в значение false. Если вы используете несколько пулов одновременно с poolMatchGlobs, вы также можете отключить изоляцию для конкретного используемого пула.

bash
vitest --no-isolate
ts
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.

bash
vitest --no-file-parallelism
ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    fileParallelism: false,
  },
});

Пул ​

По умолчанию Vitest запускает тесты в pool: 'forks'. Хотя пул 'forks' предпочтительнее для решения проблем совместимости (зависание процесса и сегфолты), он может быть немного медленнее, чем pool: 'threads' в крупных проектах.

Вы можете попробовать улучшить время выполнения тестов, изменив опцию pool в конфигурации:

bash
vitest --pool=threads
ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    pool: 'threads',
  },
});

Шардирование ​

Шардирование тестов означает выполнение небольшого подмножества тестовых случаев за раз. Это может быть полезно, если у вас есть несколько машин для параллельного запуска тестов.

Чтобы разделить тесты Vitest на несколько разных запусков, используйте опцию --shard с опцией --reporter=blob:

sh
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:

sh
vitest --merge-reports
Пример для GitHub Actions

Эта настройка также используется в https://github.com/vitest-tests/test-sharding.

yaml
# 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.

sh
# Пример разделения тестов на 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
Pager
Предыдущая страницаProfiling Test Performance

Выпущено на условиях лицензии MIT.

Авторские права (c) 2024 Mithril Contributors

https://v2.vitest.dev/guide/improving-performance

Выпущено на условиях лицензии MIT.

Авторские права (c) 2024 Mithril Contributors