Skip to content

按文件隔离设置

默认情况下,每个测试文件都会在自己的独立模块图中运行,这可以防止一个文件的状态泄漏到另一个文件中。这样的隔离会为每个文件带来初始化时间开销,对于真正需要它的集成测试来说这是可以接受的,但对于不共享可变状态的纯单元测试来说则是浪费。

使用 projectsisolate: false 应用于单元测试套件,同时保持集成测试套件处于隔离状态。

模式

vitest.config.ts
ts
import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    projects: [
      {
        test: {
          // 非隔离的单元测试
          name: 'Unit tests',
          isolate: false,
          exclude: ['**.integration.test.ts'],
        },
      },
      {
        test: {
          // 隔离的集成测试
          name: 'Integration tests',
          include: ['**.integration.test.ts'],
        },
      },
    ],
  },
})

何时隔离很重要

当测试文件不满足以下情况时,可以安全地取消隔离:

  • 修改模块级状态(计数器、缓存、顶层 let 绑定)
  • 调用 vi.stubGlobalvi.stubEnv
  • 对原型进行猴子补丁(Date.prototypeArray.prototype 等)
  • process 或其他长生命周期的事件发射器上注册监听器
  • vi.mock 工厂中依赖一个全新的模块实例

如果上述任意一条适用,那么隔离确实在发挥作用,应保持开启。

验证它是否安全

带上随机打乱顺序运行两次测试套件,以暴露文件间污染:

sh
vitest --shuffle --run --project='Unit tests'
vitest --shuffle --run --project='Unit tests'

如果第二次运行产生了不同的结果,就说明你的测试存在依赖执行顺序的问题。要么修复罪魁祸首,要么为该文件保持启用隔离。

按池隔离

isolate 只控制 threadsforks 池。vmThreadsvmForks 池无论该标志如何,始终以隔离模式运行,因为它们用启动成本换取了更强的保证。

另请参阅