You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vitest中所有测试模块前后执行指定函数?

解决方案

方案1:全局 Setup 文件(通用场景)

你可以通过Vitest的setupFiles配置指定一个全局初始化文件,文件内的beforeAll和afterAll会作用于所有测试文件的执行前后:

  1. 新建全局setup文件,比如tests/global.setup.ts:
import { beforeAll, afterAll } from 'vitest';

// 所有测试启动前执行一次数据库清理
beforeAll(async () => {
  await clearTestDatabase(); // 替换成你的清理函数
});

// 所有测试结束后执行一次数据库清理
afterAll(async () => {
  await clearTestDatabase();
});
  1. 在vitest.config.ts中配置setupFiles:
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    setupFiles: ['./tests/global.setup.ts'],
    threads: false, // 对应你脚本中的--no-threads
    coverage: {
      // 你的覆盖率相关配置
    }
  }
});

这样不管有多少个.spec.ts测试文件,全局的清理逻辑只会在所有测试开始前和结束后各执行一次。

方案2:全局启动/销毁钩子(Vitest >=0.23.0)

如果你的Vitest版本在0.23.0及以上,可以用globalSetup和globalTeardown配置,这两个钩子在Vitest进程启动/结束时执行,优先级高于测试上下文,适合完全独立的全局操作:

  1. 新建全局启动文件tests/global.setup.ts:
export default async function globalSetup() {
  await clearTestDatabase(); // 测试启动前清理数据库
}
  1. 新建全局销毁文件tests/global.teardown.ts:
export default async function globalTeardown() {
  await clearTestDatabase(); // 测试结束后清理数据库
}
  1. 在vitest.config.ts中配置:
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    globalSetup: './tests/global.setup.ts',
    globalTeardown: './tests/global.teardown.ts',
    threads: false,
    coverage: {
      // 你的覆盖率相关配置
    }
  }
});

注意事项

  • 如果你的清理函数是异步的,必须加上await,避免钩子提前结束导致测试在清理完成前执行。
  • 因为你启用了--no-threads,全局钩子的执行顺序会更稳定,不会出现线程隔离导致的逻辑失效问题。

内容的提问来源于stack exchange,提问作者Eshaan Aggarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:40:35