Skip to content
Vitest 1
Main Navigation 指南API配置高級
1.6.1
0.34.6

繁體中文

English
简体中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

繁體中文

English
简体中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

外觀

Sidebar Navigation

高級

Node API

測試執行器

任務元數據

擴充報告器

自訂池

本頁導覽

自訂池 ​

WARNING

這是進階的 API。如果您只是執行測試,您可能不需要這個。它主要供程式庫作者使用。

Vitest 在池中執行測試。預設情況下,有以下幾種池:

  • threads 使用 node:worker_threads 執行測試(透過新的 worker 上下文實現隔離)
  • forks 使用 node:child_process 執行測試(透過新的 child_process.fork 進程實現隔離)
  • vmThreads 使用 node:worker_threads 執行測試(但隔離是透過 vm 模組而非新的 worker 上下文實現)
  • browser 使用瀏覽器供應商執行測試
  • typescript 對測試執行類型檢查

您可以透過指定檔案路徑來定義您自己的池:

ts
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 介面的物件:

ts
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 一起使用,您可以編寫如下內容:

ts
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 報告工具:

ts
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 中查看一個簡單的範例程式。

Pager
上一頁擴充報告器

以 MIT 授權條款 發布。

版權所有 (c) 2024 Mithril Contributors

https://v1.vitest.dev/advanced/pool

以 MIT 授權條款 發布。

版權所有 (c) 2024 Mithril Contributors