Vlastní pool
WARNING
Toto je pokročilé nízkoúrovňové API. Pokud chcete pouze spouštět testy, pravděpodobně ho nepotřebujete. Používají ho především tvůrci knihoven.
Vitest spouští testy v poolech. Ve výchozím nastavení existuje několik předdefinovaných poolů:
threads
pro spouštění testů pomocínode:worker_threads
(izolace je zajištěna novým kontextem workeru)forks
pro spouštění testů pomocínode:child_process
(izolace je zajištěna novým procesem vytvořeným pomocíchild_process.fork
)vmThreads
pro spouštění testů pomocínode:worker_threads
(ale izolace je zajištěna modulemvm
namísto nového kontextu workeru)browser
pro spouštění testů pomocí poskytovatelů prohlížečůtypescript
pro kontrolu typů v testech
Můžete definovat svůj vlastní pool zadáním cesty k souboru:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
// ve výchozím nastavení spustí každý soubor s vlastním poolem
pool: './my-custom-pool.ts',
// možnosti můžete nastavit pomocí objektu `poolOptions`
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
},
});
Pokud potřebujete spouštět testy v různých poolech, použijte funkci projects
:
export default defineConfig({
test: {
projects: [
{
extends: true,
test: {
pool: 'threads',
},
},
],
},
});
API
Soubor specifikovaný v možnosti pool
by měl exportovat (asynchronní) funkci, která jako svůj první argument přijímá rozhraní Vitest
. Tato funkce musí vrátit objekt implementující rozhraní ProcessPool
:
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>;
}
Tato funkce je volána pouze jednou (pokud nebyla aktualizována konfigurace serveru). Obecně je dobré inicializovat vše, co potřebujete pro testy, uvnitř této funkce a znovu to použít při volání runTests
.
Vitest volá runTests
, když jsou naplánovány nové testy k provedení. Nebude ji volat, pokud je pole files
prázdné. Prvním argumentem je pole TestSpecifications. Soubory jsou seřazeny pomocí sequencer
před voláním runTests
. Může se stát (i když je to nepravděpodobné), že stejný soubor bude uveden dvakrát, ale vždy bude patřit k jinému projektu – to je implementováno pomocí konfigurace projects
.
Vitest počká, dokud se runTests
nedokončí, než dokončí běh (tj. onFinished
se vyvolá až po vyřešení runTests
).
Při použití vlastního poolu musíte sami zajistit zpracování testovacích souborů a jejich výsledků – můžete se odkazovat na vitest.state
(nejdůležitější metody jsou collectFiles
a updateTasks
). Vitest k tomu používá funkci startTests
z balíčku @vitest/runner
.
Vitest zavolá collectTests
, pokud je volána vitest.collect
nebo je vyvolán vitest list
pomocí příkazu CLI. Funguje to stejně jako runTests
, ale nemusíte spouštět testovací funkce, pouze hlásit jejich úkoly voláním vitest.state.collectFiles(files)
.
Pro komunikaci mezi procesy můžete vytvořit objekt s metodami pomocí createMethodsRPC
z balíčku vitest/node
a použít jakoukoli preferovanou formu komunikace. Například pro použití WebSockets s birpc
můžete napsat něco takového:
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,
});
}
Jednoduchý příklad poolu vytvořeného od základu, který nespouští testy, ale označuje je jako sebrané, naleznete v pool/custom-pool.ts.