在GitLab CI中运行Cypress
您将学习到
- 如何设置GitLab CI/CD来运行Cypress测试
- 如何缓存依赖项和构建产物
- 如何使用GitLab CI/CD并行化Cypress测试
- 如何在GitLab CI/CD中使用Cypress Cloud
GitLab通过其托管的 CI/CD服务, 为开发者提供了"一个内置在GitLab中的工具,用于通过持续方法论进行软件开发"。
详细文档可在 GitLab CI/CD文档中找到。
基础设置
以下示例是使用
GitLab CI/CD
在Electron浏览器中运行Cypress测试的基本CI设置和任务。此GitLab CI配置位于.gitlab-ci.yml
中。
stages:
- test
test:
image: node:latest
stage: test
script:
# 安装依赖
- npm ci
# 在后台启动服务器
- npm start &
# 运行Cypress测试
- npm run e2e
此配置的工作原理:
- 当代码推送到此仓库时,此任务将配置并启动GitLab托管的Linux实例,用于运行在
test
任务部分中声明的stages
脚本。 - 代码从GitLab仓库中检出。
- 最后,我们的脚本将:
- 安装npm依赖
- 启动项目Web服务器(
npm start
) - 在GitLab仓库中使用Electron运行Cypress测试。
使用Cypress Docker镜像测试
Cypress团队维护了官方的
Docker镜像,
用于在本地和CI中运行Cypress测试,这些镜像内置了Google Chrome、Mozilla Firefox和Microsoft Edge。
例如,这允许我们通过向cypress run
传递--browser firefox
属性来在Firefox中运行测试。
stages:
- test
test:
image: cypress/browsers:22.15.0
stage: test
script:
# 安装依赖
- npm ci
# 在后台启动服务器
- npm start &
# 运行Cypress测试
- npx cypress run --browser firefox
缓存依赖项和构建产物
可以通过cache
配置实现 依赖项和构建产物的缓存。
缓存文档包含了跨多种工作流缓存依赖项和构建产物的所有选项。
任务的产物可以通过提供路径和可选的过期时间来定义。
stages:
- test
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
- .npm/
test:
image: cypress/browsers:22.15.0
stage: test
script:
# 安装依赖
- npm ci
# 在后台启动服务器
- npm start &
# 运行Cypress测试
- npx cypress run --browser firefox
artifacts:
when: always
paths:
- cypress/videos/**/*.mp4
- cypress/screenshots/**/*.png
expire_in: 1 day
并行化
Cypress Cloud提供了 并行化和分组测试运行的能力, 以及Cypress测试的额外洞察和分析。
在任务配置中添加
parallel
属性将允许我们同时运行多个Cypress实例,
如本节稍后 将看到的那样。
在深入并行化设置示例之前,重要的是理解我们将声明的两种不同类型的任务:
- 安装任务:安装并缓存后续任务将在GitLab CI工作流中使用的依赖项的任务。
- 工作器任务:处理Cypress测试执行并依赖于_安装任务_的任务。
安装任务
将安装与测试运行分离在运行并行任务时是必要的。它允许通过缓存辅助重用各种构建步骤。
首先,我们将定义build
阶段以及cache
和与缓存相关的变量。
然后我们定义将被工作器任务使用的install
步骤,并将其分配给build
阶段。
stages:
- build
## 为"cache"任务设置中的文件夹设置环境变量
## 用于npm模块和Cypress二进制文件
variables:
npm_config_cache: '$CI_PROJECT_DIR/.npm'
CYPRESS_CACHE_FOLDER: '$CI_PROJECT_DIR/cache/Cypress'
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- cache/Cypress
- node_modules
- build
## 安装npm依赖和Cypress
install:
image: cypress/browsers:22.15.0
stage: build
script:
- npm ci
工作器任务
接下来,我们添加一个test
阶段,并定义一个名为ui-chrome-tests
的工作器任务,
该任务将在test
阶段并行运行带有Chrome的Cypress测试。
在任务配置中添加
parallel
属性将允许我们同时运行多个Cypress实例。
以下配置使用--parallel
和--record
标志到
cypress run需要设置将测试结果记录到
Cypress Cloud。
stages:
- build
- test
## 为"cache"任务设置中的文件夹设置环境变量
## 用于npm模块和Cypress二进制文件
variables:
npm_config_cache: '$CI_PROJECT_DIR/.npm'
CYPRESS_CACHE_FOLDER: '$CI_PROJECT_DIR/cache/Cypress'
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- .cache/*
- cache/Cypress
- node_modules
- build
## 安装npm依赖和Cypress
install:
image: cypress/browsers:22.15.0
stage: build
script:
- npm ci
ui-chrome-tests:
image: cypress/browsers:22.15.0
stage: test
parallel: 5
script:
# 安装依赖
- npm ci
# 在后台启动服务器
- npm start &
# 并行运行Cypress测试
- npx cypress run --record --parallel --browser chrome --group UI-Chrome
在GitLab CI/CD中使用Cypress Cloud
在上一节定义的GitLab CI配置中,我们利用了 Cypress Cloud的三个有用功能:
-
使用
--record
标志将测试结果记录到Cypress Cloud- 深入且可共享的测试报告
- 通过快速访问测试回放、错误信息、堆栈跟踪、截图、视频和上下文详情,清晰掌握测试失败原因
- 通过与拉取请求(PR)流程集成测试,包括提交状态检查防护和便捷的测试报告评论
- 检测不稳定测试,并通过Slack警报或GitHub PR状态检查进行展示
-
通过
--parallel
标志实现测试并行运行,并借助智能负载均衡跨CI机器优化测试规范执行 -
通过标签分组将多个
cypress run
调用组织合并为Cypress Cloud中的单一报告。如上例所示,我们使用--group UI-Chrome
标志将所有Chrome浏览器的UI测试组织到Cypress Cloud报告中标记为"UI-Chrome"的组内。