Zlepšení výkonu
Izolace testů
Vitest ve výchozím nastavení spouští každý testovací soubor v izolovaném prostředí, v závislosti na nastavení poolu:
- pool
threads
spouští každý testovací soubor v samostatnémWorkeru
. - pool
forks
spouští každý testovací soubor v samostatném forkovaném podřízeném procesu. - pool
vmThreads
spouští každý testovací soubor v samostatném VM kontextu, ale pro paralelismus využívá workery.
Tato izolace může výrazně prodloužit dobu testování, což nemusí být žádoucí pro projekty, které se nespoléhají na vedlejší účinky a správně uklízejí svůj stav (což je typické pro projekty běžící v prostředí node
). V takovém případě můžete vypnutím izolace zlepšit rychlost vašich testů. Toho lze dosáhnout použitím příznaku --no-isolate
v CLI nebo nastavením vlastnosti test.isolate
v konfiguraci na false
. Pokud používáte více poolů najednou s poolMatchGlobs
, můžete izolaci zakázat i pro konkrétní pool.
vitest --no-isolate
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
isolate: false,
// izolaci můžete zakázat pouze pro konkrétní pooly
poolOptions: {
forks: {
isolate: false,
},
},
},
});
TIP
Pokud používáte pool vmThreads
, izolaci nelze zakázat. Pro zlepšení výkonu testů místo toho zvažte použití poolu threads
.
Pro některé projekty může být také žádoucí zakázat paralelismus pro zlepšení doby spuštění. Toho lze dosáhnout zadáním příznaku --no-file-parallelism
v CLI nebo nastavením vlastnosti test.fileParallelism
v konfiguraci na false
.
vitest --no-file-parallelism
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
fileParallelism: false,
},
});
Pool
Vitest ve výchozím nastavení spouští testy v pool: 'forks'
. Zatímco pool 'forks'
je vhodnější pro řešení problémů s kompatibilitou (jako jsou zavěšené procesy a segfaulty), u větších projektů může být o něco pomalejší než pool: 'threads'
.
Dobu běhu testů můžete zlepšit přepnutím možnosti pool
v konfiguraci:
vitest --pool=threads
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'threads',
},
});
Sharding
Sharding testů znamená spouštění malé podmnožiny testovacích případů v daném okamžiku. Může to být užitečné, když máte k dispozici více strojů, které lze použít ke spouštění testů současně.
Chcete-li rozdělit testy Vitest do více různých běhů, použijte možnost --shard
společně s možností --reporter=blob
:
vitest run --reporter=blob --shard=1/3 # 1. stroj
vitest run --reporter=blob --shard=2/3 # 2. stroj
vitest run --reporter=blob --shard=3/3 # 3. stroj
Shromážděte výsledky uložené v adresáři .vitest-reports
z každého stroje a slučte je pomocí možnosti --merge-reports
:
vitest --merge-reports
Příklad GitHub Actions
Toto nastavení se také používá na adrese https://github.com/vitest-tests/test-sharding.
# Inspirováno podle 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
Sharding testů je užitečný i na strojích s vysokým počtem CPU.
Vitest spustí pouze jeden Vite server ve svém hlavním vlákně. Ostatní vlákna se používají ke spouštění testovacích souborů. Na stroji s vysokým počtem CPU se hlavní vlákno může stát úzkým hrdlem, protože nedokáže zpracovat všechny požadavky přicházející z testovacích vláken. Například na stroji s 32 CPU je hlavní vlákno zodpovědné za zpracování zátěže přicházející z 31 testovacích vláken.
Pro snížení zátěže z Vite serveru hlavního vlákna můžete použít sharding testů. Zátěž může být rozložena mezi více Vite serverů.
# Příklad rozdělení testů na 32 CPU na 4 shardy.
# Jelikož každý proces potřebuje 1 hlavní vlákno, zbývá 7 vláken pro spouštěče testů (1+7)*4 = 32
# Použijte VITEST_MAX_THREADS nebo VITEST_MAX_FORKS v závislosti na poolu:
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