pytest-split 历史时间分片器
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/shard-slow-pytest-suites-by-historic-timings-before-ci-bottlenecks-pile-up-with-pytest-split。
技能介绍
痛点:当 pytest 套件成为 CI 的“堵点”
在持续集成中,随着测试用例不断累积,大型 pytest 套件的运行时间往往呈线性甚至指数级增长。当多个开发分支同时触发 CI 时,排队等待执行的测试任务会堆积,导致反馈延迟加剧,直接影响迭代效率。传统按文件或模块简单的平均分配测试任务,由于不同模块测试耗时差异大,反而会造成各并行流水线负载不均,部分任务长期处于等待状态。
技能核心:基于历史时长的智能分片
该技能的核心是通过 pytest-split 工具,利用历史测试时长数据将套件分割为时间均衡的“分片”。具体工作步骤如下:
- 采集历史时长数据:首先完整运行一次测试套件,将每个测试用例的执行时间记录并持久化,为后续分片提供数据基础。
- 生成均衡分片:技能根据记录的时长数据,自动计算并分配测试用例到不同分片,确保每个分片的总耗时尽可能接近,从而让并行 CI 流水线能同时完成执行,减少等待时间。
- 适配并行 CI 执行:每个 CI 流水线仅需运行分配到的特定分片,通过指定
--shard-id和--total-shards参数即可实现精准调度,无需修改原有测试代码结构。
适用边界与注意点
- 测试顺序敏感性:部分测试用例间存在执行顺序依赖,或共享全局状态(如数据库、缓存)。直接分割可能导致单个分片内的测试因前置条件缺失而失败,使用前需确认套件的独立性。
- 历史数据有效性:分片依赖历史时长数据的准确性。若近期有大量新增或修改的测试用例,需重新采集数据,否则分片结果可能与实际耗时不符,影响均衡性。
- 工具依赖:需确保环境中已安装
pytest-split工具,且版本与当前pytest兼容,避免因版本冲突导致分片生成失败。
使用场景
- 在 CI 中需要运行超过 30 分钟的大型 pytest 套件时,通过分片让多个并行任务同时跑完以缩短总耗时
- 现有 CI 流水线中多个分支同时提交导致测试任务堆积排队时,按历史时长均衡分片后同时启动多条流水线执行
- 团队发现不同模块测试耗时差异大导致部分流水线长期等待时,用历史时长数据分割套件使各分片耗时均衡
- 需要在本地或 CI 中验证 pytest-split 基于历史时长的分片效果时,先采集完整运行数据再模拟多分片执行过程
适合人员
- 后端开发工程师:需要缩短大型 pytest 套件在 CI 中的总运行时间以加快代码合并反馈
- CI/CD 平台工程师:负责优化流水线并行策略并降低因测试耗时不均导致的排队延迟
- 测试架构师:需要设计基于历史时长的测试拆分方案并评估其在并行 CI 中的实际效果
- Python 项目技术负责人:希望在不修改现有测试代码的前提下提升 CI 资源利用率