自訂 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 範例,它不執行測試,但將它們標記為已收集。