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ů:
threadspro spouštění testů pomocínode:worker_threads(izolace je zajištěna novým kontextem workeru)forkspro spouštění testů pomocínode:child_process(izolace je zajištěna novým procesem vytvořeným pomocíchild_process.fork)vmThreadspro spouštění testů pomocínode:worker_threads(ale izolace je zajištěna modulemvmnamísto nového kontextu workeru)browserpro spouštění testů pomocí poskytovatelů prohlížečůtypescriptpro 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.