Zlepšení výkonu
Izolace testů
Vitest ve výchozím nastavení spouští každý testovací soubor v izolovaném prostředí, které je založeno na 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 běhu testů, což nemusí být žádoucí pro projekty, které se nespoléhají na vedlejší efekty a správně čistí svůj stav (což je obvykle případ projektů v prostředí node). V takovém případě deaktivace izolace zlepší rychlost vašich testů. K tomu můžete použít přepínač --no-isolate v příkazovém řádku (CLI) nebo nastavit vlastnost test.isolate v konfiguraci na false.
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, nemůžete izolaci zakázat. Místo toho zvažte použití poolu threads pro zlepšení výkonu vašich testů.
Pro některé projekty může být také žádoucí zakázat paralelismus pro zlepšení doby spuštění. K tomu použijte přepínač --no-file-parallelism v příkazovém řádku (CLI) nebo nastavte vlastnost 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'. I když je pool 'forks' lepší pro řešení problémů s kompatibilitou (zablokovaný proces a segmentační chyby), může být u větších projektů o něco pomalejší než pool: 'threads'.
Můžete zkusit zlepšit dobu běhu testů přepnutím možnosti pool v konfiguraci:
vitest --pool=threadsimport { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'threads',
},
});Sharding
Sharding testů je proces rozdělení vaší testovací sady do skupin, neboli shardů. To může být užitečné, když máte velkou testovací sadu a více strojů, které by mohly spouštět dílčí množiny této sady souběžně.
Pro rozdělení Vitest testů do více běhů použijte možnost --shard 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. strojVitest rozděluje vaše testovací soubory, nikoli testovací scénáře, do shardů. Pokud máte 1000 testovacích souborů, možnost
--shard=1/4spustí 250 testovacích souborů, bez ohledu na to, kolik testovacích scénářů jednotlivé soubory obsahují.
Shromážděte výsledky uložené v adresáři .vitest-reports z každého běhu a sloučte je pomocí možnosti --merge-reports.
vitest run --merge-reportsPříklad akce GitHub
Toto nastavení se také používá na https://github.com/vitest-tests/test-sharding.
# Inspirováno z 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-reportsTIP
Sharding testů může být užitečný i na strojích s velkým počtem CPU.
Vitest spustí pouze jeden Vite server ve svém hlavním vlákně. Zbytek vláken se používá 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 místem, protože nemůž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 ze serveru Vite hlavního vlákna můžete použít sharding testů. Zátěž lze vyvážit na více Vite serverů.
# Příklad rozdělení testů na 32 CPU do 4 shardů.
# Jelikož každý proces potřebuje 1 hlavní vlákno, je zde 7 vláken pro testovací procesy (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 run --merge-reports