Özel Havuz
WARNING
Bu, gelişmiş ve düşük seviyeli bir API'dir. Yalnızca testleri çalıştırmak istiyorsanız, muhtemelen buna ihtiyacınız yoktur. Öncelikle kütüphane yazarları tarafından kullanılır.
Vitest, testleri havuzlarda çalıştırır. Varsayılan olarak birkaç havuz mevcuttur:
threads
: Testlerinode:worker_threads
kullanarak çalıştırmak içindir (izolasyon yeni bir worker bağlamında sağlanır).forks
: Testlerinode:child_process
kullanarak çalıştırmak içindir (izolasyon yeni birchild_process.fork
sürecinde sağlanır).vmThreads
: Testlerinode:worker_threads
kullanarak çalıştırmak içindir (ancak izolasyon yeni bir worker bağlamı yerinevm
modülü ile sağlanır).browser
: Tarayıcı sağlayıcılarını kullanarak testleri çalıştırmak içindir.typescript
: Testlerde tip kontrolü yapmak içindir.
Kendi havuzunuzu bir dosya yolu belirterek tanımlayabilirsiniz:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
// Varsayılan olarak her dosyayı özel bir havuzda çalıştırır
pool: './my-custom-pool.ts',
// `poolOptions` nesnesini kullanarak seçenekleri belirtebilirsiniz
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
},
});
Testleri farklı havuzlarda çalıştırmanız gerekirse, projects
özelliğini kullanın:
export default defineConfig({
test: {
projects: [
{
extends: true,
test: {
pool: 'threads',
},
},
],
},
});
API
pool
seçeneğinde belirtilen dosya, ilk parametre olarak Vitest
arayüzünü kabul eden bir fonksiyonu (eşzamansız olabilir) dışa aktarmalıdır. Bu fonksiyon, ProcessPool
arayüzüne uygun bir nesne döndürmelidir:
import type { ProcessPool, TestSpecification } from 'vitest/node';
export interface ProcessPool {
name: string;
runTests: (
files: TestSpecification[],
invalidates?: string[]
) => Promise<void>;
collectTests: (
files: TestSpecification[],
invalidates?: string[]
) => Promise<void>;
close?: () => Promise<void>;
}
Fonksiyon yalnızca bir kez çağrılır (sunucu yapılandırması güncellenmediği sürece). Genellikle testler için ihtiyacınız olan her şeyi bu fonksiyon içinde başlatmak ve runTests
çağrıldığında yeniden kullanmak iyi bir yaklaşımdır.
Vitest, yeni testler çalıştırılmak üzere planlandığında runTests
'i çağırır. files
boşsa çağırmaz. İlk argüman, bir TestSpecifications dizisidir. Dosyalar, runTests
çağrılmadan önce sequencer
kullanılarak sıralanır. Aynı dosyanın iki kez bulunması mümkün olsa da (ancak olası değil), her zaman farklı bir projeye ait olacaktır. Bu durum, projects
yapılandırması aracılığıyla uygulanır.
Vitest, bir çalıştırmayı tamamlamadan önce runTests
'in yürütülmesini bekleyecektir (yani, runTests
çözümlendikten sonra onFinished
olayını yayınlayacaktır).
Özel bir havuz kullanıyorsanız, test dosyalarını ve sonuçlarını kendiniz sağlamanız gerekecektir. Bunun için vitest.state
sayfasına başvurabilirsiniz (en önemlileri collectFiles
ve updateTasks
'tır). Vitest, bu işlem için @vitest/runner
paketindeki startTests
fonksiyonunu kullanır.
Vitest, vitest.collect
çağrıldığında veya bir CLI komutu aracılığıyla vitest list
çağrıldığında collectTests
'i çağıracaktır. runTests
ile aynı şekilde çalışır, ancak test geri çağırmalarını çalıştırmanıza gerek yoktur; yalnızca vitest.state.collectFiles(files)
çağırarak görevlerini raporlamanız yeterlidir.
Farklı süreçler arasında iletişim kurmak için, vitest/node
'dan createMethodsRPC
kullanarak bir yöntem nesnesi oluşturabilir ve tercih ettiğiniz herhangi bir iletişim yöntemini kullanabilirsiniz. Örneğin, birpc
ile WebSockets kullanmak için aşağıdaki gibi bir kod yazabilirsiniz:
import { createBirpc } from 'birpc';
import { parse, stringify } from 'flatted';
import { createMethodsRPC, TestProject } from 'vitest/node';
function createRpc(project: TestProject, wss: WebSocketServer) {
return createBirpc(createMethodsRPC(project), {
post: msg => wss.send(msg),
on: fn => wss.on('message', fn),
serialize: stringify,
deserialize: parse,
});
}
Testleri çalıştırmayan ancak toplanmış olarak işaretleyen, sıfırdan oluşturulmuş basit bir havuz örneğini pool/custom-pool.ts adresinde görebilirsiniz.