测试分片是什么
把一套测试切成多片并发执行:每个分片拿到自己的编号与总数,按分片参数只跑子集,总时长近似收敛到最慢分片。parallel 不是矩阵:矩阵是不同参数维度,parallel 是同一作业的并行副本,用来摊薄长测试套件的反馈时间,均衡性决定收益上限。
基本信息
| GitLab | parallel: N,作业内可用 $CI_NODE_INDEX 与 $CI_NODE_TOTAL |
|---|---|
| 分片工具 | pytest-split、jest --shard、rspec 等按分片号选用例 |
| 收益 | 测试时长近似按分片数收敛,受 Runner 并发上限约束 |
| 均衡 | 最慢分片决定总时长,先按历史耗时切分 |
| 汇总 | 分片报告需要汇总作业统一合并 |
典型使用场景
- 大测试套件:全量跑太慢,切分后并行回收时间。
- 按文件切分:实现简单,均衡性依赖文件耗时分布。
- 按历史耗时切分:按上次耗时分配,长尾明显缩短。
- 按模块切分:集成测试按业务域分开执行。
- 配合缓存:分片共享依赖缓存减少重复安装。
GitLab 分片
GitLab 分片
test:
parallel: 4
script: ./ci/run-tests.sh $CI_NODE_INDEX $CI_NODE_TOTAL切分方式对照
| 方式 | 优点 | 缺点 |
|---|---|---|
| 按文件数 | 实现简单 | 耗时不均,长尾明显 |
| 按历史耗时 | 均衡较好 | 需要历史数据支撑 |
| 按业务模块 | 语义清晰 | 模块大小差异大 |
分片不均衡(个别分片慢)会让整体等待落伍者,先按耗时分布切分再谈扩容。
分片作业的产物默认同名:按分片号命名或控制上传范围,避免互相覆盖。
并行度受 Runner 并发上限约束:分片数超过可用额度,多出的分片只是排队等待。
分片数不是越多越好:加到一定数量后收益趋缓,先优化最慢分片自身再继续增加。
失败定位:分片作业失败时先看该分片负责的用例集合,编号与列表对应关系要保留在日志里。