Performansı İyileştirme
Test İzolasyonu
Varsayılan olarak Vitest, her test dosyasını havuz tabanlı izole edilmiş bir ortamda çalıştırır:
threads
havuzu her test dosyasını ayrı birWorker
içinde çalıştırır.forks
havuzu her test dosyasını ayrı bir forked alt süreç içinde çalıştırır.vmThreads
havuzu her test dosyasını ayrı bir VM bağlamı içinde çalıştırır, ancak paralellik için işçileri kullanır.
Bu durum, test sürelerini önemli ölçüde artırabilir ve yan etkilere dayanmayan, durumlarını düzgün şekilde temizleyen projeler için (genellikle node
ortamına sahip projelerde olduğu gibi) istenmeyen bir durum olabilir. Bu gibi durumlarda, izolasyonu devre dışı bırakmak testlerinizin hızını artıracaktır. Bunu yapmak için CLI'ye --no-isolate
bayrağını sağlayabilir veya yapılandırmadaki test.isolate
özelliğini false
olarak ayarlayabilirsiniz.
vitest --no-isolate
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
isolate: false,
// İzolasyonu sadece belirli havuzlar için de devre dışı bırakabilirsiniz
poolOptions: {
forks: {
isolate: false,
},
},
},
});
TIP
vmThreads
havuzunu kullanıyorsanız, izolasyonu devre dışı bırakamazsınız. Testlerinizin performansını artırmak için bunun yerine threads
havuzunu kullanın.
Bazı projeler için, başlangıç süresini kısaltmak amacıyla dosya paralelliğini devre dışı bırakmak da istenebilir. Bunu yapmak için CLI'ye --no-file-parallelism
bayrağını sağlayın veya yapılandırmadaki test.fileParallelism
özelliğini false
olarak ayarlayın.
vitest --no-file-parallelism
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
fileParallelism: false,
},
});
Havuz Seçimi
Varsayılan olarak Vitest, testleri pool: 'forks'
içinde çalıştırır. 'forks'
havuzu uyumluluk sorunları açısından daha iyi olsa da (donan süreç ve segfault'lar), büyük projelerde pool: 'threads'
'ten biraz daha yavaş olabilir.
Yapılandırmadaki pool
seçeneğini değiştirerek test çalışma süresini iyileştirmeyi deneyebilirsiniz:
vitest --pool=threads
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'threads',
},
});
Parçalama (Sharding)
Test parçalama, test suite'inizin gruplara veya parçalara bölünmesi işlemidir. Bu, büyük bir test paketiniz varsa ve bu paketin alt kümelerini eş zamanlı olarak çalıştırabilecek birden fazla makineniz varsa faydalı olabilir.
Vitest testlerini birden fazla farklı çalıştırmaya bölmek için --shard
seçeneğini --reporter=blob
seçeneğiyle birlikte kullanın:
vitest run --reporter=blob --shard=1/3 # 1. makine
vitest run --reporter=blob --shard=2/3 # 2. makine
vitest run --reporter=blob --shard=3/3 # 3. makine
Vitest test durumlarınızı değil, test dosyalarınızı parçalara böler. Eğer 1000 test dosyanız varsa,
--shard=1/4
seçeneği, her bir dosyanın kaç test durumu içerdiğine bakılmaksızın 250 test dosyasını çalıştıracaktır.
Her bir makineden .vitest-reports
dizininde kaydedilen sonuçları toplayıp bunları --merge-reports
seçeneğiyle birleştirin:
vitest run --merge-reports
Github eylem örneği
Bu kurulum aynı zamanda https://github.com/vitest-tests/test-sharding adresinde de kullanılmaktadır.
# https://playwright.dev/docs/test-sharding adresinden esinlenilmiştir
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-reports
TIP
Test parçalama, yüksek CPU sayısına sahip makinelerde de yararlı olabilir.
Vitest, ana iş parçacığında yalnızca tek bir Vite sunucusu çalıştırır. Diğer iş parçacıkları test dosyalarını çalıştırmak için kullanılır. Yüksek CPU sayısına sahip bir makinede, ana iş parçacığı, iş parçacıklarından gelen tüm istekleri işleyemediğinden bir darboğaz haline gelebilir. Örneğin, 32 CPU'lu bir makinede ana iş parçacığı, 31 test iş parçacığından gelen yükü yönetmekten sorumludur.
Ana iş parçacığının Vite sunucusundaki yükü azaltmak için test parçalama kullanabilirsiniz. Yük, birden fazla Vite sunucusuna dağıtılabilir.
# 32 CPU'lu bir makinede testleri 4 parçaya bölme örneği.
# Her işlem 1 ana iş parçacığı gerektirdiğinden, test çalıştırıcıları için 7 iş parçacığı kullanılır (1+7)*4 = 32
# Havuza bağlı olarak VITEST_MAX_THREADS veya VITEST_MAX_FORKS kullanın:
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