Özel Havuz
WARNING
Bu gelişmiş bir API'dir. Sadece testleri çalıştırmak istiyorsanız, muhtemelen buna ihtiyacınız yok. Esas 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_threadskullanarak çalıştırmak için (yeni bir worker context ile izolasyon sağlanır)forks: Testlerinode:child_processkullanarak çalıştırmak için (yeni birchild_process.forksüreci ile izolasyon sağlanır)vmThreads: Testlerinode:worker_threadskullanarak çalıştırmak için (ancak izolasyon yeni bir worker context yerinevmmodü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';
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>;
collectTests: (
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.
vitest.collect çağrılırsa veya bir CLI komutu aracılığıyla vitest list çağrılırsa Vitest, collectTests'i çağırır. Aynı runTests gibi çalışır, ancak test geri çağrılarını çalıştırmanıza gerek yoktur, yalnızca vitest.state.collectFiles(files) çağırarak görevlerini bildirmeniz yeterlidir.
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 { createMethodsRPC, WorkspaceProject } 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.