Vlastní pool
WARNING
Toto je pokročilé API. Pokud chcete pouze spouštět testy, pravděpodobně to nepotřebujete. Používají ho primárně autoři knihoven.
Vitest spouští testy v poolech. Ve výchozím nastavení existuje několik 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 procesemchild_process.fork)vmThreads: pro spouštění testů pomocínode:worker_threads(ale izolace je zajištěna modulemvmnamísto nového kontextu workeru)browser: pro spouštění testů pomocí browser providerůtypescript: pro provádění kontroly typů na testech
Můžete vytvořit 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',
// můžete poskytnout možnosti pomocí objektu `poolOptions`
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
// můžete také určit pool pro podmnožinu souborů
poolMatchGlobs: [['**/*.custom.test.ts', './my-custom-pool.ts']],
},
});API
Soubor určený v možnosti pool by měl exportovat funkci (může být asynchronní), která jako první argument přijímá rozhraní Vitest. Tato funkce musí vrátit objekt, který odpovídá rozhraní ProcessPool:
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>;
}Funkce je volána pouze jednou (pokud se nezmění konfigurace serveru) a obvykle je vhodné inicializovat vše potřebné pro testy uvnitř této funkce. Poté ji znovu použijte, když je volána funkce runTests.
Vitest volá runTests, když jsou naplánovány nové testy ke spuštění. Nezavolá ji, pokud je pole files prázdné. Prvním argumentem je pole tuples: prvním prvkem je odkaz na workspace projekt a druhým prvkem je absolutní cesta k testovacímu souboru. Soubory jsou seřazeny pomocí sequencer před tím, než je volána runTests. Je možné (i když nepravděpodobné), že se stejný soubor objeví dvakrát, ale vždy bude mít jiný projekt - to je implementováno pomocí konfigurace vitest.workspace.ts.
Vitest počká, dokud nebude runTests dokončeno, než dokončí spuštění (tj. vysílá událost onFinished až po vyřešení runTests).
Pokud používáte vlastní pool, budete muset sami zajistit načtení testovacích souborů a zpracování jejich výsledků - můžete se odkazovat na vitest.state (nejdůležitější jsou collectFiles a updateTasks). Vitest používá funkci startTests z balíčku @vitest/runner k tomuto účelu.
Vitest zavolá collectTests, pokud je zavoláno vitest.collect nebo pokud je pomocí příkazu CLI vyvoláno vitest list. Funguje to stejně jako runTests, ale nemusíte spouštět testovací zpětná volání, stačí nahlásit jejich úkoly voláním vitest.state.collectFiles(files).
Pro komunikaci mezi různými procesy můžete vytvořit metody pomocí createMethodsRPC z vitest/node a použít jakoukoli formu komunikace, kterou preferujete. Například pro použití WebSockets s birpc můžete napsat něco jako toto:
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,
});
}Abyste se ujistili, že jsou všechny testy shromážděny, zavolali byste ctx.state.collectFiles a nahlásili to Vitest reporterům:
async function runTests(project: WorkspaceProject, tests: string[]) {
// ... running tests, put into "files" and "tasks"
const methods = createMethodsRPC(project);
await methods.onCollected(files);
// most reporters rely on results being updated in "onTaskUpdate"
await methods.onTaskUpdate(tasks);
}Jednoduchý příklad můžete vidět v pool/custom-pool.ts.