如何在GitLab中并行运行E2E测试脚本?
实现Cypress E2E在GitLab CI中并行执行的方案
一、解决同一Stage任务串行的核心问题
你当前配置的test1和test2属于同一stage,理论上GitLab CI默认会并行执行,但实际串行大概率是Runner并发数限制:
- 检查你的GitLab Runner配置文件(
config.toml),确保concurrent参数值大于1,比如设置为concurrent = 2或更高(根据可用资源调整)。这个参数控制Runner能同时执行的最大任务数,若为1则所有任务只能串行。
二、优化配置,减少冗余并高效拆分测试用例
1. 复用Build阶段的依赖,避免重复安装
当前每个test任务都执行npm ci,浪费大量时间,建议用缓存共享依赖:
stages: - build - test build: stage: build image: cypress/browsers:node18.12.0-chrome107 script: - npm ci # 缓存node_modules,供test阶段拉取使用 cache: key: ${CI_COMMIT_REF_SLUG} paths: - node_modules/ test1: image: cypress/browsers:node18.12.0-chrome107 stage: test script: # 无需重复安装依赖,直接使用缓存内容 - npm run test-run1 cache: key: ${CI_COMMIT_REF_SLUG} paths: - node_modules/ policy: pull # 仅拉取缓存,不上传 test2: image: cypress/browsers:node18.12.0-chrome107 stage: test script: - npm run test-run2 cache: key: ${CI_COMMIT_REF_SLUG} paths: - node_modules/ policy: pull
2. 合理拆分测试用例到两个任务
确保test-run1和test-run2对应不同的测试用例集,比如按业务模块拆分:
- 在
package.json中配置脚本:
{ "scripts": { "test-run1": "cypress run --spec 'cypress/e2e/order/**/*.cy.js'", "test-run2": "cypress run --spec 'cypress/e2e/user/**/*.cy.js'" } }
尽量让两个任务的耗时均衡,最大化并行效率。
三、更灵活的方式:用GitLab CI的parallel关键字
无需手动创建多个test任务,直接用parallel自动生成并行任务,结合Cypress的分片功能自动分配用例(Cypress 10+支持):
stages: - build - test build: stage: build image: cypress/browsers:node18.12.0-chrome107 script: - npm ci cache: key: ${CI_COMMIT_REF_SLUG} paths: - node_modules/ test: image: cypress/browsers:node18.12.0-chrome107 stage: test parallel: 2 # 生成2个并行执行的任务实例 script: - npm run test-shard cache: key: ${CI_COMMIT_REF_SLUG} paths: - node_modules/ policy: pull
然后在package.json中配置分片执行脚本,利用GitLab环境变量自动拆分用例:
{ "scripts": { "test-shard": "cypress run --shard=${CI_NODE_INDEX}/${CI_NODE_TOTAL}" } }
Cypress会根据CI_NODE_INDEX(当前任务序号)和CI_NODE_TOTAL(总并行数)自动均匀分配测试用例,无需手动拆分。
四、排查其他可能的串行原因
- 检查test任务是否配置了
needs或dependencies,如果依赖同一stage的其他任务,会强制串行执行。 - 若使用共享Runner,可能是Runner资源不足,需联系管理员调整并发数或申请专属Runner。
内容的提问来源于stack exchange,提问作者Noel
相关产品推荐
相关产品推荐

