如何在GitLab中通过多Job并行运行Vitest测试
GitLab CI 实现 Vitest 并行测试与 Cobertura 覆盖率报告
核心方案
利用GitLab CI的并行Job特性,结合Vitest内置的测试分片功能,将800+测试用例拆分到多个并行Job中执行,最后合并各Job生成的覆盖率文件,输出符合GitLab要求的Cobertura格式报告。
具体实现步骤
1. 配置并行测试Job
在GitLab CI配置中,通过parallel关键字指定并行执行的Job数量(比如4个,可根据测试耗时调整)。每个并行Job会自动获得CI_NODE_INDEX(当前Job序号,从1开始)和CI_NODE_TOTAL(总并行数)两个环境变量,用这两个变量给Vitest指定分片参数。
每个Job执行时,不仅要跑对应分片的测试,还要单独生成该分片的Cobertura覆盖率文件,避免互相覆盖。
2. 合并覆盖率报告
新增一个依赖所有并行测试Job的后续Job,使用cobertura-merge工具将多个分片的覆盖率文件合并成一个完整的报告,最后上传给GitLab展示。
完整的.gitlab-ci.yml示例
stages: - test - coverage # 缓存依赖,减少每次Job的安装时间 cache: paths: - node_modules/ vitest-parallel-tests: stage: test parallel: 4 # 可根据测试用例规模调整并行数,比如800个用例用4-8个都可以 script: - npm install - npx vitest run --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL --coverage --coverage.reporter=cobertura --coverage.reportOnFailure --coverage.outputFile=./coverage/cobertura-${CI_NODE_INDEX}.xml artifacts: paths: - ./coverage/cobertura-${CI_NODE_INDEX}.xml expire_in: 1 week # 临时保存分片覆盖率文件,过期自动清理 merge-coverage-report: stage: coverage needs: ["vitest-parallel-tests"] # 等待所有并行测试Job完成 script: - npm install cobertura-merge # 自动查找所有分片覆盖率文件并合并 - npx cobertura-merge -o ./coverage/cobertura-merged.xml $(ls ./coverage/cobertura-*.xml | xargs echo) artifacts: reports: cobertura: ./coverage/cobertura-merged.xml # 上传合并后的报告给GitLab expire_in: 1 month
优化建议
- 测试分片均匀性:如果发现部分Job耗时明显更长,可给Vitest添加
--split-by=filesize参数,按测试文件大小更均匀地拆分用例,命令调整为:npx vitest run --shard=$CI_NODE_INDEX/$CI_NODE_TOTAL --split-by=filesize --coverage ... - 并行数调整:建议先从4个并行开始测试,观察各Job耗时,再逐步调整到最优数量,避免并行过多导致GitLab调度开销增加。
内容的提问来源于stack exchange,提问作者spoilerd do
相关产品推荐
相关产品推荐

