Pull Request已成功合入, 合并人@ascend-robot
(感谢 fengyixing 的贡献)变更摘要
此 PR 引入了一种基于历史执行耗时的用例拆分机制,替代原有的简单轮询(round-robin)分配策略。核心思路是:通过 time_data.json 中记录的各用例文件及类的执行耗时,使用 LPT 贪心算法将用例尽量均衡地分配到多台机器上;同时支持对执行时间较长的「慢文件」(≥300秒)进行类级拆分,以便更细粒度地均衡负载。新增 ci/split_by_time.py 模块实现拆分逻辑,并在 TestMgr 和 exec_ut 中适配类级执行与耗时数据收集。
主要改动
-
新增
split_by_time.py模块:实现load_and_validate_time_data(加载并校验time_data.json)、build_split_units(构建文件级/类级拆分单元)、split_by_time(LPT 贪心算法分配)等核心函数;定义SLOW_FILE_THRESHOLD = 300.0作为慢文件阈值,慢文件优先按类拆分,无类级数据时通过discover_test_classes用 AST 自动发现Test开头的类名。 -
TestMgr新增test_classes属性:用于存储类级拆分信息,格式为{'ut_files': {file_path: [class_name, ...]}, 'op_ut_files': {}},作为split_by_time结果中类级映射的载体。 -
exec_ut支持类级执行与耗时记录:新增test_classes参数,当传入类级映射时对每个类单独执行并记录耗时;执行完成后将所有成功用例的耗时数据写入temp_time_data.json,为后续迭代提供历史数据。 -
主流程切换为基于耗时的拆分:在
access_control_test.py的__main__中,当存在有效time_data.json时调用split_by_time进行分配,否则回退到原有的split_test_files轮询方式。


代码审查
审查总结
| 文件 | 审查结果 |
|---|---|
ci/access_control/test_manager.py |
无问题 — 仅新增 test_classes 属性初始化,结构一致 |
ci/access_control_test.py |
1 个 P3(ut_info / test_key 格式不一致) |
ci/split_by_time.py |
1 个 P2 + 2 个 P3 |
问题分布:P2 × 1,P3 × 3
整体风险判断:中等偏低。核心逻辑(LPT 拆分、类级执行、耗时记录)设计合理且自洽。主要风险集中在 discover_test_classes(AST 发现)的兜底路径上,该路径仅在慢文件(≥300s)且无历史类级耗时数据时触发,触发面有限。load_and_validate_time_data 的校验不完整和 ut_info 格式不一致为健壮性/可维护性问题,不影响正常流程。建议在上线前修复 P2 问题(discover_test_classes 可能匹配 0 条用例),其他 P3 可在后续迭代中收敛。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论




【合入来源】
【修改方案】
【资料变更】
【接口变更】
【功能验证】
【CheckList】