Egyéni Pool
WARNING
Ez egy fejlett és rendkívül alacsony szintű API. Ha csak teszteket szeretne futtatni, valószínűleg nincs szüksége erre. Elsősorban könyvtárfejlesztők használják.
A Vitest a teszteket poolokban futtatja. Alapértelmezés szerint több pool létezik:
threads
: tesztek futtatásanode:worker_threads
használatával (az izolációt új worker kontextus biztosítja)forks
: tesztek futtatásanode:child_process
használatával (az izolációt újchild_process.fork
folyamat biztosítja)vmThreads
: tesztek futtatásanode:worker_threads
használatával (de az izolációt avm
modul biztosítja új worker kontextus helyett)browser
: tesztek futtatása böngésző szolgáltatók használatávaltypescript
: típusellenőrzés futtatása a teszteken
Saját poolt egy fájlútvonal megadásával adhat meg:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
// alapértelmezés szerint minden fájlt egyéni poollal futtat
pool: './my-custom-pool.ts',
// az opciókat a `poolOptions` objektumban adhatja meg
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
},
});
Ha különböző poolokban kell teszteket futtatnia, használja a projects
funkciót:
export default defineConfig({
test: {
projects: [
{
extends: true,
test: {
pool: 'threads',
},
},
],
},
});
API
A pool
opcióban megadott fájlnak egy függvényt kell exportálnia (lehet aszinkron), amely első paraméterként elfogadja a Vitest
interfészt. Ennek a függvénynek egy ProcessPool
interfésznek megfelelő objektumot kell visszaadnia:
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>;
}
A függvényt csak egyszer hívják meg (kivéve, ha a szerver konfigurációja frissült), és általában jó ötlet mindent inicializálni, amire a tesztekhez szüksége van a függvényen belül, és azt újra felhasználni, amikor a runTests
meghívásra kerül.
A Vitest akkor hívja meg a runTests
-t, amikor új teszteket ütemeznek futtatásra. Nem hívja meg, ha a files
üres. Az első argumentum egy TestSpecification tömb. A fájlokat a sequencer
rendezi, mielőtt a runTests
meghívásra kerül. Lehetséges (de valószínűtlen), hogy ugyanaz a fájl kétszer is szerepeljen, de mindig más projekthez fog tartozni – ezt a projects
konfigurációval valósítják meg.
A Vitest megvárja a runTests
végrehajtását, mielőtt befejezi a futtatást (azaz csak a runTests
feloldása után bocsátja ki az onFinished
eseményt).
Ha egyéni poolt használ, akkor Önnek kell biztosítania a tesztfájlok futtatását és azok eredményeinek kezelését – ehhez hivatkozhat a vitest.state
állapotra (a legfontosabbak a collectFiles
és az updateTasks
). A Vitest ehhez a @vitest/runner
csomag startTests
függvényét használja.
A Vitest meghívja a collectTests
-t, ha a vitest.collect
meghívásra kerül, vagy a vitest list
parancsot CLI-n keresztül hívják meg. Ugyanúgy működik, mint a runTests
, de nem kell teszt visszahívásokat futtatnia, csak a feladataikat kell jelentenie a vitest.state.collectFiles(files)
meghívásával.
A különböző folyamatok közötti kommunikációhoz létrehozhat egy metódusokat tartalmazó objektumot a createMethodsRPC
segítségével a vitest/node
csomagból, és bármilyen kommunikációs formát használhat, amelyet előnyben részesít. Például, ha WebSockets-et szeretne használni a birpc
-vel, írhat valami ilyesmit:
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,
});
}
Egy egyszerű példát láthat egy teljesen a semmiből épített poolra, amely nem futtat teszteket, hanem összegyűjtöttként jelöli meg őket a pool/custom-pool.ts fájlban.