Skip to main content
Cypress云服务免费试用

并行化

info
你将学到
  • Cypress如何跨多台机器平衡测试文件
  • 如何在多台机器上并行运行测试
  • 如何分组测试运行及其优势
  • 如何在Cypress Cloud中可视化并行化和分组

如果项目包含大量测试,单台机器串行执行可能需要很长时间。在持续集成(CI)中跨多台虚拟机并行运行测试,可以为团队节省时间和成本。

Cypress支持在多台机器上并行运行已记录的测试。虽然技术上也可以在单台机器上并行运行测试,但我们不建议这样做,因为该机器需要大量资源才能高效运行测试。

本指南假设您已在持续集成环境中设置项目并记录测试。如果尚未设置项目,请参阅我们的持续集成指南。如果您正在或计划跨多种浏览器(Firefox、Chrome或Edge)运行测试,我们还建议查看跨浏览器测试指南,了解使用并行化时的CI策略。

并行化示意图

拆分测试套件

Cypress的并行化策略基于文件,因此要利用并行化,需要将测试拆分到不同文件中。

Cypress会根据平衡策略将每个测试文件分配给可用机器。由于这种平衡策略,并行化时测试文件的运行顺序不保证。

启用并行化

  1. 参考CI提供商的文档设置多台机器
  2. CI环境中配置好多台机器后,向cypress run传递--parallel参数启用并行化
cypress run --record --key=abc123 --parallel
info

并行运行测试需要传递--record标志。这确保Cypress能正确收集并行化未来运行所需数据,同时您可以在Cypress Cloud中查看并行测试结果。如果尚未设置记录,请参考设置指南

CI并行化交互

并行化模式下,Cypress Cloud通过以下流程与CI机器交互:

  1. CI机器联系Cypress Cloud获取要运行的测试文件
  2. 机器通过联系Cypress选择接收测试文件
  3. Cypress计算每个测试文件的预估运行时间
  4. 基于估算,Cypress通过负载均衡将文件逐个分配给机器,最小化总运行时间
  5. 每台机器完成分配的测试文件后,会接收更多文件,直到所有文件完成
  6. 所有文件完成后,Cypress会等待可配置时间才认为运行完全结束,以更好支持运行分组

简言之:每个Cypress实例发送测试文件列表给Cypress Cloud,后者每次返回一个文件给应用运行。

并行化流程

并行化概览

示例

以下示例来自Kitchen Sink示例项目的运行结果,可在Cypress Cloud查看。

无并行化

单台机器运行名为1x-electron的任务,按字母顺序串行运行19个测试文件,耗时1分51秒

1x-electron, 机器 #1
--------------------------
-- actions.cy.js (14秒)
-- aliasing.cy.js (1秒)
-- assertions.cy.js (1秒)
-- connectors.cy.js (2秒)
-- cookies.cy.js (2秒)
-- cypress_api.cy.js (3秒)
-- files.cy.js (2秒)
-- local_storage.cy.js (1秒)
-- location.cy.js (1秒)
-- misc.cy.js (4秒)
-- navigation.cy.js (3秒)
-- network_requests.cy.js (3秒)
-- querying.cy.js (1秒)
-- spies_stubs_clocks.cy.js (1秒)
-- traversal.cy.js (4秒)
-- utilities.cy.js (3秒)
-- viewport.cy.js (3秒)
-- waiting.cy.js (5秒)
-- window.cy.js (1秒)
info

注意各测试运行时间总和(55秒)小于总耗时(1分51秒),因为每个测试需要额外时间启动浏览器、编码上传视频、请求下一个测试。

有并行化

相同测试使用2台机器并行运行,Cypress根据负载均衡策略基于历史运行时间分配测试,耗时59秒

2x-electron, 机器 #1, 9个测试          2x-electron, 机器 #2, 10个测试
-------------------------------- -----------------------------------
-- actions.cy.js (14秒) -- waiting.cy.js (6秒)
-- traversal.cy.js (4秒) -- navigation.cy.js (3秒)
-- misc.cy.js (4秒) -- utilities.cy.js (3秒)
-- cypress_api.cy.js (4秒) -- viewport.cy.js (4秒)
-- cookies.cy.js (3秒) -- network_requests.cy.js (3秒)
-- files.cy.js (3秒) -- connectors.cy.js (2秒)
-- location.cy.js (2秒) -- assertions.cy.js (1秒)
-- querying.cy.js (2秒) -- aliasing.cy.js (1秒)
-- location.cy.js (1秒) -- spies_stubs_clocks.cy.js (1秒)
-- window.cy.js (1秒)

在Cypress Cloud的机器视图中差异明显。2台机器并行运行根据测试时长自动分配,而无并行化的运行则没有。

无并行化 vs 2台机器并行化

使用2台机器并行化节省了近50%时间,增加更多机器可进一步减少构建时间。

测试运行分组

通过--group <name>标志可将多个cypress run调用标记并关联到单个运行中,其中name是任意引用标签。组名在关联的测试运行中必须唯一。

info

分组多个运行要求CI机器共享相同的CI构建ID环境变量。通常这些机器会并行运行或在相同构建工作流中,但使用Cypress并行化不是分组运行的必要条件。分组可独立于Cypress并行化使用。

机器视图分组展开
info
跨浏览器测试

无论是否使用并行化,分组测试运行都是实现跨浏览器测试CI策略的有用机制。详见跨浏览器测试指南

按浏览器分组

可针对不同浏览器测试应用,并在Cypress Cloud中查看单一运行的汇总结果。例如:

第一组命名为Windows/Chrome 69

cypress run --record --group Windows/Chrome-69 --browser chrome

第二组命名为Mac/Chrome 70

cypress run --record --group Mac/Chrome-70 --browser chrome

第三组命名为Linux/Electron(Electron是Cypress运行的默认浏览器):

cypress run --record --group Linux/Electron
浏览器分组

标记并行化分组

我们可以在分组中使用Cypress并行化。例如:

cypress run --record --group 1x-electron
cypress run --record --group 2x-chrome --browser chrome --parallel
cypress run --record --group 4x-electron --parallel

此处1x2x4x前缀是表示并行级别的约定,非必需。

info

每个cypress run调用分配的机器数量取决于项目的CI配置。

这种命名方式有助于在Cypress Cloud中查看测试运行:

带分组和并行化的时间线视图

按测试上下文分组

如果应用有客户门户、访客门户和管理门户,可以在同一运行中组织测试:

cypress run --record --group package/admin --spec 'cypress/e2e/packages/admin/**/*'
cypress run --record --group package/customer --spec 'cypress/e2e/packages/customer/**/*'
cypress run --record --group package/guest --spec 'cypress/e2e/packages/guest/**/*'
monorepo分组

这种模式特别适用于monorepo项目。monorepo的每个部分可以分配自己的组,较大的部分可以并行化以加速测试。

关联CI机器进行并行化或分组

CI构建ID用于将多台CI机器关联到一个测试运行。该ID基于各CI构建特有的环境变量,不同CI提供商有所不同。Cypress支持大多数常用CI提供商,通常无需通过--ci-build-id标志直接设置。

通过ci-build-id关联CI机器

各CI提供商的构建ID环境变量

Cypress目前使用以下环境变量确定测试运行的CI构建ID:

提供商环境变量
AppVeyorAPPVEYOR_BUILD_NUMBER
AWS CodeBuildCODEBUILD_INITIATOR
Azure PipelinesBUILD_BUILDNUMBER
Bamboobamboo_buildNumber
BitbucketBITBUCKET_BUILD_NUMBER
BuildkiteBUILDKITE_BUILD_ID
CircleCIRCLE_WORKFLOW_ID, CIRCLE_BUILD_NUM
CodeshipCI_BUILD_NUMBER
Codeship BasicCI_BUILD_NUMBER
Codeship ProCI_BUILD_ID
DroneDRONE_BUILD_NUMBER
GitLabCI_PIPELINE_ID
JenkinsBUILD_NUMBER
SemaphoreSEMAPHORE_EXECUTABLE_UUID
TravisTRAVIS_BUILD_ID

可通过CLI传递不同值来关联代理到同一运行。例如Jenkins中若BUILD_TAGBUILD_NUMBER更唯一:

cypress run --record --parallel --ci-build-id $BUILD_TAG

运行完成延迟

并行化模式或分组运行时,Cypress会等待指定时间才完成测试运行,以防还有相关工作。这是为了补偿CI机器可能排队的情况。

此等待期称为运行完成延迟,从最后一台已知CI机器完成后开始:

测试运行完成延迟

默认延迟为60秒,可在Cypress Cloud项目设置页面配置。

在Cypress Cloud中可视化并行化和分组

可在Cypress Cloud运行的测试选项卡中查看每个测试文件的结果。测试在时间线条形图机器视图中可视化。

时间线视图

时间线视图按时间顺序显示所有机器上运行的测试文件,帮助可视化测试的时序关系。

带并行化的时间线视图

条形图视图

条形图视图显示各测试文件的持续时间相对关系。

带并行化的条形图视图

机器视图

机器视图按执行机器分组显示测试文件,可评估每台机器对总运行的贡献。

带并行化的机器视图

后续步骤