如何在Vitest中所有测试模块前后执行指定函数?
解决方案
方案1:全局 Setup 文件(通用场景)
你可以通过Vitest的setupFiles配置指定一个全局初始化文件,文件内的beforeAll和afterAll会作用于所有测试文件的执行前后:
- 新建全局setup文件,比如
tests/global.setup.ts:
import { beforeAll, afterAll } from 'vitest'; // 所有测试启动前执行一次数据库清理 beforeAll(async () => { await clearTestDatabase(); // 替换成你的清理函数 }); // 所有测试结束后执行一次数据库清理 afterAll(async () => { await clearTestDatabase(); });
- 在
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进程启动/结束时执行,优先级高于测试上下文,适合完全独立的全局操作:
- 新建全局启动文件
tests/global.setup.ts:
export default async function globalSetup() { await clearTestDatabase(); // 测试启动前清理数据库 }
- 新建全局销毁文件
tests/global.teardown.ts:
export default async function globalTeardown() { await clearTestDatabase(); // 测试结束后清理数据库 }
- 在
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
相关产品推荐
相关产品推荐

