自訂 Pool
WARNING
這是一個進階且非常底層的 API。如果您只是想執行測試,您可能不需要這個。它主要由函式庫作者使用。
Vitest 在 Pool 中執行測試。預設情況下,有幾種 Pool:
threads使用node:worker_threads執行測試(透過新的 worker context 提供隔離)forks使用node:child_process執行測試(透過新的child_process.fork程序提供隔離)vmThreads使用node:worker_threads執行測試(但隔離是透過vm模組而非新的 worker context 提供)browser使用瀏覽器提供者執行測試typescript對測試執行型別檢查
您可以透過指定檔案路徑來提供自己的 Pool:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
// 預設情況下,每個檔案都將使用自訂 Pool 執行
pool: './my-custom-pool.ts',
// 您可以使用 `poolOptions` 物件提供選項
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
},
});如果您需要在不同的 Pool 中執行測試,請使用 projects 功能:
export default defineConfig({
test: {
projects: [
{
extends: true,
test: {
pool: 'threads',
},
},
],
},
});API
pool 選項中指定的檔案應匯出一個函式(可以是非同步的),該函式將 Vitest 介面作為其第一個參數。此函式需要回傳一個符合 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>;
}此函式只會被呼叫一次(除非伺服器設定已更新),通常最好在該函式內部初始化測試所需的一切,並在呼叫 runTests 時重複使用。
當新的測試排定執行時,Vitest 會呼叫 runTests。若 files 為空,則不會呼叫此方法。第一個參數是 TestSpecification 的陣列。在呼叫 runTests 之前,檔案會使用 sequencer 進行排序。同一個檔案可能(雖然機率很低)會出現兩次,但它總是會有不同的專案 - 這是透過 projects 設定實現的。
Vitest 將等待 runTests 執行完畢後才結束執行(即,它只會在 runTests 完成後發出 onFinished)。
如果您使用自訂 Pool,您將必須自行提供測試檔案及其執行結果 - 您可以參考 vitest.state(最重要的是 collectFiles 和 updateTasks)。Vitest 使用 @vitest/runner 套件中的 startTests 函式來執行此操作。
如果呼叫 vitest.collect 或透過 CLI 命令呼叫 vitest list,Vitest 將呼叫 collectTests。其運作方式與 runTests 相同,但您不必執行測試回調,只需透過呼叫 vitest.state.collectFiles(files) 回報任務狀態即可。
為了在不同程序之間進行通訊,您可以使用 vitest/node 中的 createMethodsRPC 建立方法物件,並使用您喜歡的任何通訊形式。例如,要將 WebSockets 與 birpc 一起使用,您可以這樣寫:
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,
});
}您可以在 pool/custom-pool.ts 中看到一個從零開始建立的簡單 Pool 範例,它不執行測試,但將它們標記為已收集。