并行化
你将学到
- Cypress如何跨多台机器平衡测试文件
- 如何在多台机器上并行运行测试
- 如何分组测试运行及其优势
- 如何在Cypress Cloud中可视化并行化和分组
如果项目包含大量测试,单台机器串行执行可能需要很长时间。在持续集成(CI)中跨多台虚拟机并行运行测试,可以为团队节省时间和成本。
Cypress支持在多台机器上并行运行已记录的测试。虽然技术上也可以在单台机器上并行运行测试,但我们不建议这样做,因为该机器需要大量资源才能高效运行测试。
本指南假设您已在持续集成环境中设置项目并记录测试。如果尚未设置项目,请参阅我们的持续集成指南。如果您正在或计划跨多种浏览器(Firefox、Chrome或Edge)运行测试,我们还建议查看跨浏览器测试指南,了解使用并行化时的CI策略。

拆分测试套件
Cypress的并行化策略基于文件,因此要利用并行化,需要将测试拆分到不同文件中。
Cypress会根据平衡策略将每个测试文件分配给可用机器。由于这种平衡策略,并行化时测试文件的运行顺序不保证。
启用并行化
- 参考CI提供商的文档设置多台机器
- CI环境中配置好多台机器后,向cypress run传递--parallel参数启用并行化
cypress run --record --key=abc123 --parallel
并行运行测试需要传递--record
标志。这确保Cypress能正确收集并行化未来运行所需数据,同时您可以在Cypress Cloud中查看并行测试结果。如果尚未设置记录,请参考设置指南。
CI并行化交互
并行化模式下,Cypress Cloud通过以下流程与CI机器交互:
- CI机器联系Cypress Cloud获取要运行的测试文件
- 机器通过联系Cypress选择接收测试文件
- Cypress计算每个测试文件的预估运行时间
- 基于估算,Cypress通过负载均衡将文件逐个分配给机器,最小化总运行时间
- 每台机器完成分配的测试文件后,会接收更多文件,直到所有文件完成
- 所有文件完成后,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秒)
注意各测试运行时间总和(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台机器并行运行根据测试时长自动分配,而无并行化的运行则没有。

使用2台机器并行化节省了近50%时间,增加更多机器可进一步减少构建时间。
测试运行分组
通过--group <name>
标志可将多个cypress run调用标记并关联到单个运行中,其中name
是任意引用标签。组名在关联的测试运行中必须唯一。
分组多个运行要求CI机器共享相同的CI构建ID环境变量。通常这些机器会并行运行或在相同构建工作流中,但使用Cypress并行化不是分组运行的必要条件。分组可独立于Cypress并行化使用。

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