如何在Vitest中识别测试运行线程以实现内存数据库隔离?
在Vitest中识别当前运行线程的方案
方法1:读取内置环境变量VITEST_POOL_ID
Vitest会为每个运行线程自动注入VITEST_POOL_ID环境变量,作为线程的唯一标识(通常为数字,如0、1)。可直接在测试代码或钩子中读取:
const workerId = process.env.VITEST_POOL_ID;
结合你的内存数据库场景,用这个ID区分不同线程的数据库实例,避免并行冲突:
import { beforeEach } from 'vitest'; import { createInMemoryDb } from './your-db-utils'; // 模块级变量缓存,每个线程只初始化一次数据库 let db; if (!db) { const workerId = process.env.VITEST_POOL_ID; db = createInMemoryDb(`db_thread_${workerId}`); } beforeEach(async () => { // 将当前线程的数据库恢复至预设状态 await db.resetToInitialState(); });
方法2:调用Vitest的getWorkerId() API
Vitest提供了getWorkerId()方法,可直接获取当前工作线程ID,比环境变量更直观:
import { beforeEach, beforeAll, getWorkerId } from 'vitest'; import { createInMemoryDb } from './your-db-utils'; let db; beforeAll(async () => { const workerId = getWorkerId(); db = createInMemoryDb(`db_${workerId}`); }); beforeEach(async () => { await db.resetToInitialState(); });
核心注意点
- 用
beforeAll或模块级缓存确保每个线程只初始化一次数据库,避免不必要的开销 - 数据库重置操作需仅作用于当前线程对应的实例,保证线程间状态完全隔离
- 若使用的内存数据库支持命名实例(如SQLite内存库可通过自定义名称区分),直接以线程ID作为实例名即可实现隔离
内容的提问来源于stack exchange,提问作者Rafael Kennedy
相关产品推荐
相关产品推荐

