按文件隔离设置
默认情况下,每个测试文件都会在自己的独立模块图中运行,这可以防止一个文件的状态泄漏到另一个文件中。这样的隔离会为每个文件带来初始化时间开销,对于真正需要它的集成测试来说这是可以接受的,但对于不共享可变状态的纯单元测试来说则是浪费。
使用 projects 将 isolate: false 应用于单元测试套件,同时保持集成测试套件处于隔离状态。
模式
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.stubGlobal或vi.stubEnv - 对原型进行猴子补丁(
Date.prototype、Array.prototype等) - 在
process或其他长生命周期的事件发射器上注册监听器 - 在
vi.mock工厂中依赖一个全新的模块实例
如果上述任意一条适用,那么隔离确实在发挥作用,应保持开启。
验证它是否安全
带上随机打乱顺序运行两次测试套件,以暴露文件间污染:
sh
vitest --shuffle --run --project='Unit tests'
vitest --shuffle --run --project='Unit tests'如果第二次运行产生了不同的结果,就说明你的测试存在依赖执行顺序的问题。要么修复罪魁祸首,要么为该文件保持启用隔离。
按池隔离
isolate 只控制 threads 和 forks 池。vmThreads 和 vmForks 池无论该标志如何,始终以隔离模式运行,因为它们用启动成本换取了更强的保证。
