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
threadsspouští každý testovací soubor v samostatnémWorkeru. - pool
forksspouští každý testovací soubor v samostatném forkovaném podřízeném procesu. - pool
vmThreadsspouš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-isolateimport { 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-parallelismimport { 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=threadsimport { 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. strojShromáž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-reportsPří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-reportsTIP
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