自訂池
WARNING
這是進階的 API。如果您只是執行測試,您可能不需要這個。它主要供程式庫作者使用。
Vitest 在池中執行測試。預設情況下,有以下幾種池:
threads
使用node:worker_threads
執行測試(透過新的 worker 上下文實現隔離)forks
使用node:child_process
執行測試(透過新的child_process.fork
進程實現隔離)vmThreads
使用node:worker_threads
執行測試(但隔離是透過vm
模組而非新的 worker 上下文實現)browser
使用瀏覽器供應商執行測試typescript
對測試執行類型檢查
您可以透過指定檔案路徑來定義您自己的池:
import { defineConfig } from 'vitest/config';
// ---cut---
export default defineConfig({
test: {
// 預設情況下,每個檔案都會使用自訂池執行
pool: './my-custom-pool.ts',
// 您可以使用 `poolOptions` 物件提供選項
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
// 您還可以為檔案的子集指定池
poolMatchGlobs: [['**/*.custom.test.ts', './my-custom-pool.ts']],
},
});
API
在 pool
選項中指定的檔案應匯出一個函數(可以是 async),該函數將 Vitest
介面作為其第一個參數。此函數需要返回一個符合 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>;
}
該函數只會被呼叫一次(除非伺服器配置已更新)。通常建議在該函數中初始化測試所需的所有內容,並在呼叫 runTests
時重複使用。
當有新的測試排定要執行時,Vitest 會呼叫 runTests
。如果 files
為空,則不會呼叫此函數。第一個參數是元組陣列:第一個元素是 workspace project 的參考,第二個元素是測試檔案的絕對路徑。在呼叫 runTests
之前,檔案會使用 sequencer
進行排序。同一個檔案有可能(但不常見)出現兩次,但每次都會對應到不同的 project。這是透過 vitest.workspace.ts
配置實現的。
Vitest 會等待 runTests
執行完成後,才會結束執行(也就是說,只有在 runTests
解析完成後,才會發出 onFinished
事件)。
如果您正在使用自訂池,則必須自行提供測試檔案及其結果。您可以參考 vitest.state
來達成此目的(其中最重要的是 collectFiles
和 updateTasks
)。Vitest 使用來自 @vitest/runner
套件的 startTests
函數來執行此操作。
為了在不同的進程之間進行通訊,您可以使用 vitest/node
中的 createMethodsRPC
建立方法物件,並採用您偏好的通訊方式。例如,要將 WebSockets 與 birpc
一起使用,您可以編寫如下內容:
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,
});
}
為了確保收集到每個測試,您需要呼叫 ctx.state.collectFiles
並將其報告給 Vitest 報告工具:
async function runTests(project: WorkspaceProject, tests: string[]) {
// ... 執行測試,將結果存入 "files" 和 "tasks"
const methods = createMethodsRPC(project);
await methods.onCollected(files);
// 大多數 reporters 仰賴 "onTaskUpdate" 中更新的結果
await methods.onTaskUpdate(tasks);
}
您可以在 pool/custom-pool.ts 中查看一個簡單的範例程式。