Test Performansını Profillendirme
Vitest'i çalıştırdığınızda, testlerinizin çeşitli zaman metriklerini raporlar:
bashRUN v2.1.1 /x/vitest/examples/profiling ✓ test/prime-number.test.ts (1) 4517ms ✓ generate prime number 4517ms Test Files 1 passed (1) Tests 1 passed (1) Start at 09:32:53 Duration 4.80s (transform 44ms, setup 0ms, collect 35ms, tests 4.52s, environment 0ms, prepare 81ms) # Time metrics ^^
- Transform: Dosyaların dönüştürülmesi için harcanan süre. Bkz. Dosya Dönüştürme.
- Setup:
setupFiles
dosyalarının çalıştırılması için harcanan süre. - Collect: Test dosyalarındaki tüm testlerin toplanması için harcanan süre. Buna, tüm dosya bağımlılıklarını içe aktarmak için geçen süre de dahildir.
- Tests: Test senaryolarını fiilen çalıştırmak için harcanan süre.
- Environment: Test
environment
(örneğin JSDOM) kurulumu için harcanan süre. - Prepare: Vitest'in test çalıştırıcısını hazırlamak için kullandığı süre.
Test Çalıştırıcısı
Test yürütme süreniz yüksek olduğunda, test çalıştırıcısı için bir profil oluşturabilirsiniz. Aşağıdaki seçenekler için NodeJS belgelerine bakın:
WARNING
--prof
seçeneği, node:worker_threads
sınırlamaları nedeniyle pool: 'threads'
ile çalışmaz.
Bu seçenekleri Vitest'in test çalıştırıcısına iletmek için, Vitest yapılandırmanızda poolOptions.<pool>.execArgv
öğesini tanımlayın:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'forks',
poolOptions: {
forks: {
execArgv: [
'--cpu-prof',
'--cpu-prof-dir=test-runner-profile',
'--heap-prof',
'--heap-prof-dir=test-runner-profile',
],
// Tek bir profil oluşturmak için
singleFork: true,
},
},
},
});
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
pool: 'threads',
poolOptions: {
threads: {
execArgv: [
'--cpu-prof',
'--cpu-prof-dir=test-runner-profile',
'--heap-prof',
'--heap-prof-dir=test-runner-profile',
],
// Tek bir profil oluşturmak için
singleThread: true,
},
},
},
});
Testler çalıştırıldıktan sonra test-runner-profile/*.cpuprofile
ve test-runner-profile/*.heapprofile
dosyaları oluşturulmuş olacaktır. Bu dosyaları nasıl analiz edeceğinize ilişkin talimatlar için Profillendirme kayıtlarını inceleme bölümüne bakın.
Örnek için Profillendirme | Örnekler bölümüne bakın.
Ana İş Parçacığı
Ana iş parçacığını profillendirmek, Vitest'in Vite kullanımını ve globalSetup
dosyalarını hata ayıklamada kullanışlıdır. Vite eklentileriniz de burada çalışır.
TIP
Vite'a özgü profillendirme hakkında daha fazla ipucu için Performans | Vite bölümüne bakın.
Vite eklenti performansınızı profillendirmek için vite-plugin-inspect
kullanmanızı öneririz.
Bunu yapmak için, Vitest'i çalıştıran Node sürecine argümanlar iletmeniz gerekir.
$ node --cpu-prof --cpu-prof-dir=main-profile ./node_modules/vitest/vitest.mjs --run
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
# NodeJS argümanları Vitest argümanları
Testler çalıştıktan sonra main-profile/*.cpuprofile
dosyası oluşturulmuş olacaktır. Bu dosyaları nasıl analiz edeceğinize ilişkin talimatlar için Profillendirme kayıtlarını inceleme bölümüne bakın.
Dosya Dönüştürme
Test dönüştürme ve toplama süreleriniz yüksekse, hangi dosyaların vite-node
tarafından dönüştürüldüğünü ve yürütüldüğünü görmek için DEBUG=vite-node:*
ortam değişkenini kullanabilirsiniz.
$ DEBUG=vite-node:* vitest --run
RUN v2.1.1 /x/vitest/examples/profiling
vite-node:server:request /x/vitest/examples/profiling/global-setup.ts +0ms
vite-node:client:execute /x/vitest/examples/profiling/global-setup.ts +0ms
vite-node:server:request /x/vitest/examples/profiling/test/prime-number.test.ts +45ms
vite-node:client:execute /x/vitest/examples/profiling/test/prime-number.test.ts +26ms
vite-node:server:request /src/prime-number.ts +9ms
vite-node:client:execute /x/vitest/examples/profiling/src/prime-number.ts +9ms
vite-node:server:request /src/unnecessary-file.ts +6ms
vite-node:client:execute /x/vitest/examples/profiling/src/unnecessary-file.ts +4ms
...
Bu profilleme stratejisi, barrel dosyalarının neden olduğu gereksiz dönüşümleri tanımlamak için iyi bir yoldur. Bu günlükler, testiniz çalıştırıldığında yüklenmemesi gereken dosyaları içeriyorsa, gereksiz dosyaları içe aktaran barrel dosyalarınız bulunabilir.
Barrel dosyalarının yol açtığı yavaşlığı analiz etmek için Vitest UI kullanabilirsiniz. Aşağıdaki örnek, barrel dosyası olmadan dosyaları içe aktarmanın dönüştürülen dosya miktarını yaklaşık %85 oranında nasıl azalttığını göstermektedir.
├── src
│ └── utils
│ ├── currency.ts
│ ├── formatters.ts <-- Test edilecek dosya
│ ├── index.ts
│ ├── location.ts
│ ├── math.ts
│ ├── time.ts
│ └── users.ts
├── test
│ └── formatters.test.ts
└── vitest.config.ts
import { expect, test } from 'vitest';
import { formatter } from '../src/utils';
import { formatter } from '../src/utils/formatters';
test('formatter works', () => {
expect(formatter).not.toThrow();
});

Dosya dönüşümlerini incelemek için, dönüştürülen dosyaları dosya sistemine yazmak üzere VITE_NODE_DEBUG_DUMP
ortam değişkenini kullanabilirsiniz:
$ VITE_NODE_DEBUG_DUMP=true vitest --run
[vite-node] [debug] dump modules to /x/examples/profiling/.vite-node/dump
RUN v2.1.1 /x/vitest/examples/profiling
...
$ ls .vite-node/dump/
_x_examples_profiling_global-setup_ts-1292904907.js
_x_examples_profiling_test_prime-number_test_ts-1413378098.js
_src_prime-number_ts-525172412.js
Kod Kapsamı
Projenizde kod kapsamı oluşturma yavaşsa, performans günlüğünü etkinleştirmek için DEBUG=vitest:coverage
ortam değişkenini kullanabilirsiniz.
$ DEBUG=vitest:coverage vitest --run --coverage
RUN v3.1.1 /x/vitest-example
vitest:coverage Reading coverage results 2/2
vitest:coverage Converting 1/2
vitest:coverage 4 ms /x/src/multiply.ts
vitest:coverage Converting 2/2
vitest:coverage 552 ms /x/src/add.ts
vitest:coverage Uncovered files 1/2
vitest:coverage File "/x/src/large-file.ts" is taking longer than 3s
vitest:coverage 3027 ms /x/src/large-file.ts
vitest:coverage Uncovered files 2/2
vitest:coverage 4 ms /x/src/untested-file.ts
vitest:coverage Generate coverage total time 3521 ms
Bu profilleme yaklaşımı, kapsam sağlayıcıları tarafından yanlışlıkla seçilen büyük dosyaları tespit etmek için oldukça etkilidir. Örneğin, yapılandırmanız yanlışlıkla büyük, küçültülmüş Javascript dosyalarını kod kapsamına dahil ediyorsa, bunlar günlüklerde görünecektir. Bu durumlarda coverage.include
ve coverage.exclude
seçeneklerinizi ayarlamak isteyebilirsiniz.
Profillendirme Kayıtlarını İnceleme
*.cpuprofile
ve *.heapprofile
dosyalarının içeriklerini çeşitli araçlarla inceleyebilirsiniz. Örnekler için aşağıdaki listeye bakın.