Niestandardowa Pula
WARNING
To jest zaawansowane API. Jeśli po prostu uruchamiasz testy, prawdopodobnie nie będziesz go potrzebować. Jest ono najczęściej wykorzystywane przez twórców bibliotek.
Vitest uruchamia testy w pulach. Domyślnie dostępne są następujące pule:
threadsdo uruchamiania testów przy użyciunode:worker_threads(izolacja jest zapewniana przez nowy kontekst wątku)forksdo uruchamiania testów przy użyciunode:child_process(izolacja jest zapewniana przez nowy proceschild_process.fork)vmThreadsdo uruchamiania testów przy użyciunode:worker_threads(izolacja jest zapewniana przez modułvmzamiast nowego kontekstu roboczego)browserdo uruchamiania testów przy użyciu dostawców przeglądarkowychtypescriptdo sprawdzania typów w testach
Możesz zdefiniować własną pulę, podając ścieżkę do pliku:
import { defineConfig } from 'vitest/config';
// ---cut---
export default defineConfig({
test: {
// domyślnie uruchomi każdy plik z niestandardową pulą
pool: './my-custom-pool.ts',
// możesz przekazać opcje za pomocą obiektu `poolOptions`
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
// możesz również określić pulę dla podzbioru plików
poolMatchGlobs: [['**/*.custom.test.ts', './my-custom-pool.ts']],
},
});API
Plik określony w opcji pool powinien eksportować funkcję (może być asynchroniczna), która przyjmuje interfejs Vitest jako swój pierwszy argument. Ta funkcja musi zwrócić obiekt zgodny z interfejsem ProcessPool:
import { ProcessPool, WorkspaceProject } from 'vitest/node';
export interface ProcessPool {
name: string;
runTests: (
files: [project: WorkspaceProject, testFile: string][],
invalidates?: string[]
) => Promise<void>;
close?: () => Promise<void>;
}Funkcja jest wywoływana tylko raz, chyba że konfiguracja serwera została zaktualizowana. Zazwyczaj dobrym rozwiązaniem jest zainicjowanie w niej wszystkiego, co jest potrzebne do testów, i ponowne wykorzystywanie tych zasobów przy każdym wywołaniu runTests.
Vitest wywołuje runTests, gdy nowe testy są zaplanowane do uruchomienia. Nie wywoła jej, jeśli tablica files jest pusta. Pierwszym argumentem jest tablica krotek (ang. tuple), gdzie pierwszy element to referencja do projektu workspace'u, a drugi to bezwzględna ścieżka do pliku testowego. Pliki są sortowane za pomocą sequencer przed wywołaniem runTests. Choć mało prawdopodobne, ten sam plik może pojawić się dwukrotnie, ale zawsze będzie powiązany z innym projektem. Jest to realizowane za pomocą konfiguracji vitest.workspace.ts.
Vitest zaczeka z zakończeniem uruchomienia testów, aż funkcja runTests zostanie wykonana (tzn. wyemituje zdarzenie onFinished dopiero po zakończeniu działania runTests).
Jeśli używasz niestandardowej puli, musisz samodzielnie dostarczyć pliki testowe i ich wyniki - możesz w tym celu skorzystać z vitest.state, a szczególnie z funkcji collectFiles i updateTasks. Vitest używa funkcji startTests z pakietu @vitest/runner, aby to zrobić.
Aby komunikować się między różnymi procesami, możesz utworzyć obiekt metod przy użyciu createMethodsRPC z vitest/node i użyć dowolnej formy komunikacji, którą preferujesz. Na przykład, aby użyć WebSockets z birpc, możesz napisać coś w tym stylu:
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,
});
}Aby upewnić się, że każdy test został uwzględniony, wywołaj ctx.state.collectFiles i przekaż zebrane dane do reporterów Vitest:
async function runTests(project: WorkspaceProject, tests: string[]) {
// ... uruchamianie testów, wyniki zapisywane w "files" i "tasks"
const methods = createMethodsRPC(project);
await methods.onCollected(files);
// większość reporterów opiera się na aktualizacji wyników za pomocą "onTaskUpdate"
await methods.onTaskUpdate(tasks);
}Możesz znaleźć prosty przykład w pool/custom-pool.ts.