Özel Havuz
WARNING
Bu gelişmiş bir API'dir. Sadece testleri çalıştırıyorsanız, buna ihtiyacınız olmayabilir. Öncelikli olarak kütüphane yazarları tarafından kullanılır.
Vitest, testleri havuzlarda çalıştırır. Varsayılan olarak aşağıdaki havuzlar mevcuttur:
threads
: Testlerinode:worker_threads
kullanarak çalıştırmak için (yeni bir worker context ile izolasyon sağlanır)forks
: Testlerinode:child_process
kullanarak çalıştırmak için (yeni birchild_process.fork
süreci ile izolasyon sağlanır)vmThreads
: Testlerinode:worker_threads
kullanarak çalıştırmak için (ancak izolasyon yeni bir worker context yerinevm
modülü ile sağlanır)browser
: Testleri tarayıcı sağlayıcıları kullanarak çalıştırmak içintypescript
: Testler için tür denetimi yapmak için
Bir dosya yolu belirterek kendi havuzunuzu oluşturabilirsiniz:
import { defineConfig } from 'vitest/config';
// ---cut---
export default defineConfig({
test: {
// varsayılan olarak her dosyayı özel bir havuzla çalıştırır
pool: './my-custom-pool.ts',
// `poolOptions` nesnesi ile seçenekler belirleyebilirsiniz
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
// ayrıca dosyaların bir alt kümesi için havuz belirleyebilirsiniz
poolMatchGlobs: [['**/*.custom.test.ts', './my-custom-pool.ts']],
},
});
API
pool
seçeneğinde belirtilen dosya, ilk parametresi Vitest
arayüzü olan bir fonksiyonu dışa aktarmalıdır (bu fonksiyon async
olabilir). Bu fonksiyon, ProcessPool
arayüzüne uyan bir nesne döndürmelidir:
import { ProcessPool, WorkspaceProject } from 'vitest/node';
export interface ProcessPool {
name: string;
runTests: (
files: [project: WorkspaceProject, testFile: string][],
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 gerekli her şeyi bu fonksiyonda başlatmak ve runTests
çağrıldığında bunları yeniden kullanmak iyi bir uygulamadır.
Vitest, yeni testlerin çalıştırılması gerektiğinde runTests
fonksiyonunu çağırır. files
dizisi boşsa çağırmaz. İlk argüman, çokuzlardan oluşan bir dizidir. Dosyalar, runTests
çağrılmadan önce sequencer
kullanılarak sıralanır. Aynı dosyaya iki kez sahip olmak mümkündür, ancak bu durum olası değildir. Ancak her zaman farklı bir projeye sahip olacaktır - bu, vitest.workspace.ts
yapılandırması aracılığıyla sağlanır.
Vitest, bir çalıştırmayı bitirmeden önce runTests
fonksiyonunun tamamlanmasını bekleyecektir. Yani, yalnızca runTests
çözüldükten sonra onFinished
olayını tetikleyecektir.
Özel bir havuz kullanıyorsanız, test dosyalarını ve sonuçlarını kendiniz sağlamanız gerekecektir - bunun için vitest.state
referans alabilirsiniz (en önemlileri collectFiles
ve updateTasks
). Vitest bunu yapmak için @vitest/runner
paketinden startTests
fonksiyonunu kullanır.
Farklı süreçler arasında iletişim kurmak için, vitest/node
'dan createMethodsRPC
kullanarak yöntemler nesnesi oluşturabilir ve tercih ettiğiniz herhangi bir iletişim biçimini 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 { WorkspaceProject, createMethodsRPC } from 'vitest/node';
function createRpc(project: WorkspaceProject, wss: WebSocketServer) {
return createBirpc(createMethodsRPC(project), {
post: msg => wss.send(msg),
on: fn => wss.on('message', fn),
serialize: stringify,
deserialize: parse,
});
}
Her testin toplandığından emin olmak için, ctx.state.collectFiles
fonksiyonunu çağırır ve Vitest raporlayıcılarına bildirirsiniz:
async function runTests(project: WorkspaceProject, tests: string[]) {
// ... testleri çalıştırma, "files" ve "tasks" içine koyma
const methods = createMethodsRPC(project);
await methods.onCollected(files);
// çoğu raporlayıcı, sonuçların "onTaskUpdate" içinde güncellenmesine güvenir
await methods.onTaskUpdate(tasks);
}
pool/custom-pool.ts içinde basit bir örneğe göz atabilirsiniz.