Skip to content
Vitest 0
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。如果您只是运行测试,可能不需要它。它主要供库作者使用。

您可以在配置文件中使用 runner 选项来指定测试运行器的路径。该文件应默认导出一个类,该类实现以下方法:

ts
export interface VitestRunner {
  /**
   * 在实际收集和运行测试之前,第一个被调用的方法。
   */
  onBeforeCollect?(paths: string[]): unknown;
  /**
   * 在收集测试之后,"onBeforeRun" 之前被调用。
   */
  onCollected?(files: File[]): unknown;

  /**
   * 当测试运行器应该取消后续测试运行时被调用。
   * 运行器应该监听此方法,并在调用 "onBeforeRunSuite" 和 "onBeforeRunTest" 时,将测试和套件标记为跳过。
   */
  onCancel?(reason: CancelReason): unknown;

  /**
   * 在运行单个测试之前被调用。此时还没有 "result"。
   */
  onBeforeRunTest?(test: Test): unknown;
  /**
   * 在实际运行测试函数之前被调用。此时已经有包含 "state" 和 "startTime" 的 "result"。
   */
  onBeforeTryTest?(test: Test, retryCount: number): unknown;
  /**
   * 在设置 result 和 state 之后被调用。
   */
  onAfterRunTest?(test: Test): unknown;
  /**
   * 在运行测试函数之后立即被调用。此时还没有新的 state。如果测试函数抛出异常,则不会被调用。
   */
  onAfterTryTest?(test: Test, retryCount: number): unknown;

  /**
   * 在运行单个套件之前被调用。此时还没有 "result"。
   */
  onBeforeRunSuite?(suite: Suite): unknown;
  /**
   * 在运行单个套件之后被调用。此时有 state 和 result。
   */
  onAfterRunSuite?(suite: Suite): unknown;

  /**
   * 如果定义了此方法,将会替代 Vitest 默认的套件划分和处理逻辑。"before" 和 "after" 钩子不会被忽略。
   */
  runSuite?(suite: Suite): Promise<void>;
  /**
   * 如果定义了此方法,将会替代 Vitest 默认的处理逻辑。如果您有自定义的测试函数,这将非常有用。"before" 和 "after" 钩子不会被忽略。
   */
  runTest?(test: Test): Promise<void>;

  /**
   * 当任务更新时被调用。与 reporter 中的 "onTaskUpdate" 相同,但此方法在与测试相同的线程中运行。
   */
  onTaskUpdate?(task: [string, TaskResult | undefined][]): Promise<void>;

  /**
   * 在收集路径中的所有测试运行之前被调用。
   */
  onBeforeRun?(files: File[]): unknown;
  /**
   * 在收集路径中的所有测试运行之后立即被调用。
   */
  onAfterRun?(files: File[]): unknown;
  /**
   * 当为测试定义新的上下文时被调用。如果您想向上下文中添加自定义属性,这将非常有用。
   * 如果您只想使用 runner 定义自定义上下文,请考虑在 "setupFiles" 中使用 "beforeAll" 代替。
   */
  extendTestContext?(context: TestContext): TestContext;
  /**
   * 当导入某些文件时被调用。可以在两种情况下调用:收集测试时和导入 setup 文件时。
   */
  importFile(filepath: string, source: VitestRunnerImportSource): unknown;
  /**
   * 公开可用的配置。
   */
  config: VitestRunnerConfig;
}

在初始化这个类时,Vitest 会传递 Vitest 配置,您应该将其公开为 config 属性。

WARNING

Vitest 还会注入一个 ViteNodeRunner 的实例作为 __vitest_executor 属性。您可以使用它在 importFile 方法中处理文件(这是 TestRunner 和 BenchmarkRunner 的默认行为)。

ViteNodeRunner 公开了 executeId 方法,该方法用于在 Vite 友好的环境中导入测试文件,即在运行时解析导入并转换文件内容,以便 Node 可以理解它。

TIP

快照支持等功能依赖于运行器实现。如果您不想丢失这些功能,您可以从 vitest/runners 导入 VitestTestRunner 来扩展您的运行器。如果您想扩展基准测试功能,还可以使用 BenchmarkNodeRunner。

自定义任务函数 ​

您可以通过自定义任务来扩展 Vitest 的任务系统。任务是套件的一部分,它会自动使用 suite.custom 方法添加到当前套件:

js
// ./utils/custom.js
import { getCurrentSuite, setFn } from 'vitest/suite';

export { describe, beforeAll, afterAll } from 'vitest';

// 当 Vitest 收集任务时,将调用此函数
export const myCustomTask = function (name, fn) {
  const task = getCurrentSuite().custom(name);
  task.meta = {
    customPropertyToDifferentiateTask: true,
  };
  setFn(task, fn || (() => {}));
};
js
// ./garden/tasks.test.js
import {
  afterAll,
  beforeAll,
  describe,
  myCustomTask,
} from '../utils/custom.js';
import { gardener } from './gardener.js';

describe('take care of the garden', () => {
  beforeAll(() => {
    gardener.putWorkingClothes();
  });

  myCustomTask('weed the grass', () => {
    gardener.weedTheGrass();
  });
  myCustomTask('water flowers', () => {
    gardener.waterFlowers();
  });

  afterAll(() => {
    gardener.goHome();
  });
});
bash
vitest ./garden/tasks.test.js

WARNING

如果未使用自定义运行器或未定义 runTest 方法,Vitest 将尝试自动检索任务。如果未通过 setFn 添加函数,则执行将会失败。

TIP

自定义任务系统支持钩子和上下文功能。如果您希望支持属性链式调用(例如 only、skip 以及您自定义的属性),可以从 vitest/suite 导入 createChainable 并用它来包装您的函数。如果您决定这样做,您需要将 custom 作为 custom.call(this) 调用。

Pager
上一页Node API
下一页任务元数据

基于 MIT 许可证 发布。

版权所有 (c) 2024 Mithril Contributors

https://v0.vitest.dev/advanced/runner

基于 MIT 许可证 发布。

版权所有 (c) 2024 Mithril Contributors