Özellikler
- Vite'ın yapılandırmasını, dönüştürücülerini, çözümleyicilerini ve eklentilerini kullanır.
- Uygulamanızdaki aynı kurulumu kullanarak testleri çalıştırın!
- Testler için HMR benzeri akıllı ve anında izleme modu!
- Vue, React, Svelte, Lit, Marko ve daha fazlası için bileşen testi desteği.
- Kutudan çıktığı gibi TypeScript / JSX desteği.
- Önce ESM, üst düzey await desteği.
- Tinypool ile çoklu iş parçacığı desteği.
- Tinybench ile karşılaştırmalı performans testi desteği.
- Süitler ve testler için filtreleme, zaman aşımları ve eşzamanlı çalıştırma seçenekleri.
- Projeler desteği.
- Jest uyumlu Snapshot testi.
- Doğrulamalar için yerleşik Chai + Jest expect uyumlu API'ler.
- Mocklama için yerleşik Tinyspy.
- DOM mocklama için happy-dom veya jsdom desteği.
- Tarayıcıda bileşen testlerini çalıştırmak için Tarayıcı Modu.
- v8 veya istanbul aracılığıyla kod kapsamı raporlama.
- Rust tarzı kaynak kodu içi test.
- expect-type aracılığıyla Tür Testi.
- Sharding Desteği.
- Yakalanmayan Hataların Raporlanması.
Test, Geliştirme ve Derleme Arasında Paylaşılan Yapılandırma
Vite'ın yapılandırmasını, dönüştürücülerini, çözümleyicilerini ve eklentilerini kullanarak uygulamanızdaki aynı kurulumla testleri çalıştırın.
Daha fazla bilgi için Vitest'i Yapılandırma bölümüne bakın.
İzleme Modu
$ vitestKaynak kodunuzu veya test dosyalarınızı değiştirdiğinizde, Vitest akıllıca modül grafiğini tarar ve yalnızca ilgili testleri yeniden çalıştırır; tıpkı Vite'ta HMR'nin çalıştığı gibi!
vitest geliştirme ortamında varsayılan olarak izleme modunda ve CI ortamında ( process.env.CI mevcut olduğunda) akıllıca çalıştırma modunda başlar. İstenen modu açıkça belirtmek için vitest watch veya vitest run kullanabilirsiniz.
Vitest'i --standalone bayrağıyla başlatarak arka planda çalışmaya devam etmesini sağlayın. Değişiklik olana kadar hiçbir testi çalıştırmaz. Kaynak kodu değiştiğinde, Vitest, bu kodu kullanan testler çalıştırılana kadar testleri çalıştırmaz.
Kutudan Çıktığı Gibi Ortak Web Deyimleri
Kutudan çıktığı gibi ES Modülü / TypeScript / JSX desteği / PostCSS.
İş Parçacıkları
Varsayılan olarak Vitest, test dosyalarını Tinypool ( Piscina'nın hafif bir fork'u) aracılığıyla node:child_process kullanarak birden fazla işlemde çalıştırır ve testlerin eşzamanlı olarak çalışmasına olanak tanır. Test süitinizi daha da hızlandırmak isterseniz, node:worker_threads kullanarak testleri çalıştırmak için --pool=threads seçeneğini etkinleştirmeyi düşünebilirsiniz (bazı paketlerin bu kurulumla çalışmayabileceğini unutmayın).
Testleri tek bir iş parçacığında veya işlemde çalıştırmak için poolOptions bölümüne bakın.
Vitest ayrıca her dosyanın ortamını izole eder, böylece bir dosyadaki ortam mutasyonları diğerlerini etkilemez. İzolasyon, CLI'ye --no-isolate geçirilerek devre dışı bırakılabilir (doğruluktan ödün vererek çalışma performansı artırılır).
Test Filtreleme
Vitest, testleri filtrelemek için birçok yol sunar, böylece test hızını artırabilir ve geliştirmeye odaklanabilirsiniz.
Daha fazla bilgi için Test Filtreleme bölümüne bakın.
Testleri Eşzamanlı Çalıştırma
Ardışık testlerde .concurrent kullanarak testleri paralel olarak başlatın.
import { describe, it } from 'vitest';
// Eşzamanlı olarak işaretlenmiş iki test paralel olarak çalıştırılacaktır
describe('suite', () => {
it('serial test', async () => {
/* ... */
});
it.concurrent('concurrent test 1', async ({ expect }) => {
/* ... */
});
it.concurrent('concurrent test 2', async ({ expect }) => {
/* ... */
});
});Bir süitte .concurrent kullanırsanız, içindeki her test paralel olarak başlatılacaktır.
import { describe, it } from 'vitest';
// Bu süit içindeki tüm testler paralel olarak çalıştırılacaktır
describe.concurrent('suite', () => {
it('concurrent test 1', async ({ expect }) => {
/* ... */
});
it('concurrent test 2', async ({ expect }) => {
/* ... */
});
it.concurrent('concurrent test 3', async ({ expect }) => {
/* ... */
});
});Eşzamanlı süitler ve testlerle .skip, .only ve .todo da kullanabilirsiniz. Daha fazla bilgi için API Referansı bölümüne bakın.
WARNING
Eşzamanlı testler çalıştırılırken, Snapshot'lar ve Doğrulamalar yerel Test Bağlamı içindeki expect kullanmalıdır.
Snapshot
Jest uyumlu snapshot desteği.
import { expect, it } from 'vitest';
it('renders correctly', () => {
const result = render();
expect(result).toMatchSnapshot();
});Daha fazla bilgi için Snapshot bölümüne bakın.
Chai ve Jest expect Uyumluluğu
Chai ve Jest expect uyumlu API'lerle doğrulamalar için yerleşiktir.
Eşleştiriciler ekleyen üçüncü taraf kütüphaneler kullanıyorsanız, test.globals değerini true olarak ayarlamak daha iyi uyumluluk sağlayacaktır.
Mocklama
Tinyspy, vi nesnesinde jest uyumlu API'lerle mocklama için yerleşiktir.
import { expect, vi } from 'vitest';
const fn = vi.fn();
fn('hello', 1);
expect(vi.isMockFunction(fn)).toBe(true);
expect(fn.mock.calls[0]).toEqual(['hello', 1]);
fn.mockImplementation((arg: string) => arg);
fn('world', 2);
expect(fn.mock.results[1].value).toBe('world');Vitest, DOM ve tarayıcı API'lerini mocklamak için hem happy-dom hem de jsdom desteği sunar. Bunlar Vitest ile birlikte gelmez, bunları ayrı olarak yüklemeniz gerekir:
$ npm i -D happy-dom$ npm i -D jsdomBundan sonra, yapılandırma dosyanızdaki environment seçeneğini değiştirin:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
environment: 'happy-dom', // veya 'jsdom', 'node'
},
});Daha fazla bilgi için Mocklama bölümüne bakın.
Kapsam
Vitest, v8 aracılığıyla Yerel kod kapsamını ve istanbul aracılığıyla enstrümante kod kapsamını destekler.
{
"scripts": {
"test": "vitest",
"coverage": "vitest run --coverage"
}
}Daha fazla bilgi için Kapsam bölümüne bakın.
Kaynak İçi Test
Vitest ayrıca, Rust'ın modül testlerine benzer şekilde, uygulamanızla birlikte kaynak kodunuz içinde testleri çalıştırmanın bir yolunu sunar.
Bu, testlerin uygulamalarla aynı kapanışı paylaşmasını ve dışa aktarmaya gerek kalmadan özel durumları test etmesini sağlar. Aynı zamanda, geliştirme için geri bildirim döngüsünü de kısaltır.
// uygulama
export function add(...args: number[]): number {
return args.reduce((a, b) => a + b, 0);
}
// kaynak içi test süitleri
if (import.meta.vitest) {
const { it, expect } = import.meta.vitest;
it('add', () => {
expect(add()).toBe(0);
expect(add(1)).toBe(1);
expect(add(1, 2, 3)).toBe(6);
});
}Daha fazla bilgi için Kaynak içi test bölümüne bakın.
Kıyaslama Deneysel
Performans sonuçlarını kıyaslamak için Tinybench aracılığıyla bench fonksiyonu ile kıyaslama testleri çalıştırabilirsiniz.
import { bench, describe } from 'vitest';
describe('sort', () => {
bench('normal', () => {
const x = [1, 5, 4, 2, 3];
x.sort((a, b) => {
return a - b;
});
});
bench('reverse', () => {
const x = [1, 5, 4, 2, 3];
x.reverse().sort((a, b) => {
return a - b;
});
});
});Tip Testi Deneysel
Tip regresyonlarını yakalamak için testler yazabilirsiniz. Vitest, size benzer ve anlaşılması kolay bir API sağlamak için expect-type paketiyle birlikte gelir.
import { assertType, expectTypeOf, test } from 'vitest';
import { mount } from './mount.js';
test('my types work properly', () => {
expectTypeOf(mount).toBeFunction();
expectTypeOf(mount).parameter(0).toMatchTypeOf<{ name: string }>();
// @ts-expect-error name string tipinde bekleniyor
assertType(mount({ name: 42 }));
});Parçalama
--shard ve --reporter=blob bayraklarını kullanarak testleri farklı makinelerde çalıştırın. Tüm test ve kapsam sonuçları, CI hattınızın sonunda --merge-reports komutu kullanılarak birleştirilebilir:
vitest --shard=1/2 --reporter=blob --coverage
vitest --shard=2/2 --reporter=blob --coverage
vitest --merge-reports --reporter=junit --coverageDaha fazla bilgi için Performansı İyileştirme | Sharding bölümüne bakın.
Ortam Değişkenleri
Vitest, ön uçla ilgili testlerle uyumluluğu sürdürmek için .env dosyalarından yalnızca VITE_ ön ekli ortam değişkenlerini otomatik olarak yükler ve Vite'ın belirlenmiş kuralına uygun olarak çalışır. .env dosyalarından her ortam değişkenini yine de yüklemek için vite'dan içe aktarılan loadEnv yöntemini kullanabilirsiniz:
import { loadEnv } from 'vite';
import { defineConfig } from 'vitest/config';
export default defineConfig(({ mode }) => ({
test: {
// mode, varsa ".env.{mode}" dosyasının seçilmesini belirler
env: loadEnv(mode, process.cwd(), ''),
},
}));İşlenmeyen Hatalar
Varsayılan olarak, Vitest tüm işlenmeyen reddetmeleri, yakalanmayan istisnaları (Node.js'de) ve hata olaylarını ( tarayıcıda) yakalar ve raporlar.
Bu raporlama davranışını, hataları manuel olarak işleyerek devre dışı bırakabilirsiniz. Vitest, geri aramanın sizin tarafınızdan işlendiğini varsayar ve hatayı raporlamaz.
// Node.js'de
process.on('unhandledRejection', () => {
// kendi işleyiciniz
});
process.on('uncaughtException', () => {
// kendi işleyiciniz
});// tarayıcıda
window.addEventListener('error', () => {
// kendi işleyiciniz
});
window.addEventListener('unhandledrejection', () => {
// kendi işleyiciniz
});Alternatif olarak, dangerouslyIgnoreUnhandledErrors seçeneğiyle bildirilen hataları da yoksayabilirsiniz. Vitest bunları yine de raporlayacaktır, ancak test sonucunu etkilemeyeceklerdir (çıkış kodu değişmeyecektir).
Eğer hatanın yakalanmadığını test etmeniz gerekiyorsa, aşağıdaki gibi bir test oluşturabilirsiniz:
test('fonksiyonum yakalanmayan bir hata fırlatıyor', async ({ onTestFinished }) => {
onTestFinished(() => {
// olay test sırasında hiç çağrılmadıysa,
// bir sonraki test başlamadan önce kaldırıldığından emin olun
process.removeAllListeners('unhandledrejection');
});
return new Promise((resolve, reject) => {
process.once('unhandledrejection', error => {
try {
expect(error.message).toBe('my error');
resolve();
} catch (error) {
reject(error);
}
});
callMyFunctionThatRejectsError();
});
});