如何在GitLab Runner中并行运行Cypress测试(无需Cypress Dashboard)
仅用Cypress + GitLab实现E2E测试并行运行方案
核心思路
借助Cypress的测试分片能力,结合GitLab CI的并行作业机制,将180个测试用例拆分到多个Runner节点同时执行,完全不依赖Cypress Dashboard的配额限制。
具体实现步骤
1. 基于Cypress原生分片的并行配置
在.gitlab-ci.yml中定义并行作业,利用Cypress内置的分片逻辑自动分配测试用例:
e2e-tests: stage: test image: cypress/browsers:node18.12.0-chrome107-ff106 parallel: 4 # 根据Runner资源设置并行数,比如4个 script: - npm install - npx cypress run --parallel --ci-build-id $CI_PIPELINE_ID artifacts: paths: - cypress/screenshots/ - cypress/videos/ when: always cache: paths: - node_modules/
关键参数说明:
parallel: 4:让GitLab启动指定数量的并行作业实例--parallel:触发Cypress的分片模式,自动分配测试用例$CI_PIPELINE_ID:用GitLab流水线ID作为唯一标识,确保分片属于同一次测试运行
2. 纯手动分片方案(完全脱离Cypress Dashboard)
如果不想使用Cypress的记录功能,可通过GitLab提供的环境变量手动分配测试文件:
e2e-tests: stage: test image: cypress/browsers:node18.12.0-chrome107-ff106 parallel: 4 script: - npm install - # 根据作业索引计算要执行的测试文件 - TEST_FILES=$(node -e " const fs = require('fs'); const testFiles = fs.readdirSync('cypress/e2e').filter(f => f.endsWith('.cy.js')); const index = $CI_NODE_INDEX; const totalJobs = $CI_NODE_TOTAL; const chunkSize = Math.ceil(testFiles.length / totalJobs); const start = index * chunkSize; const targetFiles = testFiles.slice(start, start + chunkSize).map(f => \`cypress/e2e/\${f}\`); console.log(targetFiles.join(' ')); ") - npx cypress run --spec "$TEST_FILES" artifacts: paths: - cypress/screenshots/ - cypress/videos/ when: always cache: paths: - node_modules/
这里利用$CI_NODE_INDEX(当前作业的索引,从0开始)和$CI_NODE_TOTAL(总并行作业数),直接将测试文件平均分配到不同作业中,无需任何外部服务。
3. GitLab Runner常见错误排查
针对你遇到的运行错误,优先检查以下几点:
- Runner资源不足:每个执行E2E测试的Runner至少分配2核CPU、4GB内存,避免因资源耗尽导致崩溃
- 测试路径错误:确认
cypress/e2e下的测试文件后缀、路径符合预期,避免找不到用例 - 依赖安装失败:通过缓存
node_modules提升安装速度,同时检查镜像源是否稳定
4. 优化建议
- 根据测试耗时调整分片数:如果存在大体积测试用例,先拆分为小用例,再调整并行数保证负载均匀
- 给Runner打标签:指定性能较好的Runner执行E2E测试,避免与其他轻量任务抢占资源
内容的提问来源于stack exchange,提问作者Tirath Sojitra
相关产品推荐
相关产品推荐

