Teljesítmény javítása
Teszt izoláció
Alapértelmezetten a Vitest minden tesztfájlt egy izolált környezetben futtatja, a pool beállítása alapján:
- A
threads
pool minden tesztfájlt különWorker
szálban futtat. - A
forks
pool minden tesztfájlt külön forkolt gyermekfolyamatban futtat. - A
vmThreads
pool minden tesztfájlt külön VM kontextusban futtat, de a párhuzamosság érdekében munkafolyamatokat használ.
Ez jelentősen megnövelheti a tesztidőket, ami nem kívánatos olyan projektek esetén, amelyek nem támaszkodnak mellékhatásokra és helyesen kezelik/tisztítják állapotukat (ami általában igaz a node
környezetben futó projektekre). Ebben az esetben az izoláció letiltása javítja a tesztek sebességét. Ehhez megadhatja a --no-isolate
kapcsolót a CLI-nek, vagy beállíthatja a test.isolate
tulajdonságot a konfigurációban false
értékre. Ha több poolt használ egyszerre a poolMatchGlobs
segítségével, akkor az izolációt egy adott használt pool esetében is kikapcsolhatja.
vitest --no-isolate
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
isolate: false,
// az izolációt csak bizonyos pooloknál is kikapcsolhatja
poolOptions: {
forks: {
isolate: false,
},
},
},
});
TIP
Ha a vmThreads
poolt használja, nem kapcsolhatja ki az izolációt. Használja helyette a threads
poolt a tesztek teljesítményének javításához.
Egyes projektek esetén hasznos lehet a párhuzamosság kikapcsolása is az indítási idő javítása érdekében. Ehhez adja meg a --no-file-parallelism
kapcsolót a CLI-nek, vagy állítsa be a test.fileParallelism
tulajdonságot a konfigurációban false
értékre.
vitest --no-file-parallelism
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
fileParallelism: false,
},
});
Pool
Alapértelmezetten a Vitest a teszteket a pool: 'forks'
beállítással futtatja. Bár a 'forks'
pool jobb a kompatibilitási problémák (lefagyott folyamatok hanging process és segfaultok) kezelésére, nagyobb projektekben kissé lassabb lehet, mint a pool: 'threads'
.
Megpróbálhatja javítani a teszt futási idejét a pool
opció átkapcsolásával a konfigurációban:
vitest --pool=threads
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'threads',
},
});
Sharding
A teszt sharding azt jelenti, hogy egyszerre a tesztesetek egy kis részhalmazát futtatjuk. Ez hasznos lehet, ha több gép áll rendelkezésre a tesztek egyidejű futtatásához.
A Vitest tesztek több különböző futtatásra való felosztásához használja a --shard
opciót a --reporter=blob
opcióval együtt:
vitest run --reporter=blob --shard=1/3 # 1. gép
vitest run --reporter=blob --shard=2/3 # 2. gép
vitest run --reporter=blob --shard=3/3 # 3. gép
Gyűjtse össze minden gépről az .vitest-reports
könyvtárban tárolt eredményeket, és egyesítse őket a --merge-reports
opcióval:
vitest --merge-reports
Github action példa
Ez a beállítás a https://github.com/vitest-tests/test-sharding oldalon is megtalálható.
# A https://playwright.dev/docs/test-sharding alapján
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
A teszt sharding hasznos lehet nagy CPU-számú gépeken is.
A Vitest csak egyetlen Vite szervert futtat a fő szálában. A többi szál a tesztfájlok futtatására szolgál. Nagy CPU-számú gépen a fő szál szűk keresztmetszetté válhat, mivel nem tudja kezelni a szálakból érkező összes kérést. Például egy 32 CPU-s gépen a fő szál felelős a 31 teszt szálból érkező terhelés kezeléséért.
A fő szál Vite szerverének terhelését csökkentheti a teszt sharding használatával. A terhelés több Vite szerverre is elosztható.
# Példa tesztek szétosztására 32 CPU-n 4 részre (shards).
# Mivel minden folyamatnak szüksége van 1 fő szálra, 7 szál áll rendelkezésre a tesztfuttatóknak (1+7)*4 = 32
# A futtató környezettől (pool) függően használd a VITEST_MAX_THREADS vagy a VITEST_MAX_FORKS változót:
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