如何加速NestJS中Jest测试执行速度?2000用例耗时3分钟
Jest + NestJS 测试执行耗时优化方案
一、针对性优化适配器重复执行问题
- 复用全局测试模块实例:不要在每个测试用例/
beforeEach里重新创建Nest测试模块,改用beforeAll一次性创建模块和应用实例,所有测试用例共享,只在afterAll中销毁。示例:let app: INestApplication; beforeAll(async () => { const moduleFixture = await Test.createTestingModule({ imports: [AppModule], }).compile(); app = moduleFixture.createNestApplication(); await app.init(); }); afterAll(async () => { await app.close(); }); - 拆分全局初始化逻辑:把适配器里通用的初始化操作(比如数据库连接、全局配置加载)抽离到Jest的
setupFilesAfterEnv配置文件中,让它只在测试启动时执行一次,而非每次测试前重复跑。
二、测试用例执行策略优化
- 按模块拆分测试文件:把大型模块的2000个测试用例拆分成多个小文件,让Jest的多进程能更均匀分配任务,避免单个文件测试耗时过长拖慢整体进度。
- 用
test.concurrent并行同文件测试:对于无依赖的独立测试用例,替换普通test为test.concurrent,让同一文件内的测试也能并行执行,压缩单文件的执行时间。
三、Mock 所有外部IO依赖
- 替换真实服务为Mock实现:测试时不要连接真实数据库、调用外部API,用
overrideProvider替换Nest服务为Mock,或直接用jest.mock()Mock第三方库。示例:beforeEach(async () => { const moduleFixture = await Test.createTestingModule({ providers: [UserService], }) .overrideProvider(UserRepository) .useValue(mockUserRepository) .compile(); service = moduleFixture.get<UserService>(UserService); }); - 禁用非必要IO操作:关掉测试里的日志输出、文件读写等无关操作,减少无意义的耗时。
四、Jest配置进阶优化
- 启用编译结果缓存:在
jest.config.js里加cacheDirectory: '.jest-cache',让Jest缓存编译后的测试文件,避免每次测试都重新编译。 - 仅测试变更文件:开发阶段用
jest --onlyChanged命令,只跑修改过的文件对应的测试,不用全量执行2000个用例。 - 调整超时时间:检查是否有测试用例设置了过长的
testTimeout,根据实际情况缩短,避免无意义的等待。
五、工具链替换加速
- 用
swc-jest替代ts-jest:SWC是比TypeScript快数倍的编译器,替换后能大幅缩短测试文件的编译时间:- 安装依赖:
npm install --save-dev @swc/core @swc/jest - 修改Jest配置:
module.exports = { transform: { '^.+\\.(t|j)sx?$': '@swc/jest', }, };
- 安装依赖:
- 启用轻量运行器:使用
jest-light-runner替代默认运行器,减少进程启动和通信的开销,适合大规模测试场景,安装后在配置中添加runner: 'jest-light-runner'。
内容的提问来源于stack exchange,提问作者Cain김보성
相关产品推荐
相关产品推荐

