Vlastní pool
WARNING
Toto je pokročilé API. Pokud pouze spouštíte testy, pravděpodobně ho nebudete potřebovat. Primárně je určeno pro autory 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 modulemvm
namí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';
// ---cut---
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>;
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.
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 { 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,
});
}
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.