Pull Request已成功合入, 合并人@ascend-robot
(感谢 fengyixing 的贡献)变更摘要
此 PR 引入了基于历史执行耗时数据对单元测试用例进行负载均衡拆分的能力。新增 split_by_time.py 模块,通过读取 time_data.json 中记录的各测试用例执行耗时,使用 LPT(最长处理时间优先)贪心算法将用例分配到多台机器上,使各机器预估总耗时尽量均衡。同时,慢文件(总耗时 ≥300 秒)支持类级拆分,每个测试类作为独立单元分配到不同机器。exec_ut 函数被增强以支持类级执行并收集耗时数据,TestMgr 新增 test_classes 字段用于存储类级拆分信息。
主要改动
-
新增
split_by_time.py模块:实现了基于耗时的用例拆分核心逻辑,包含load_and_validate_time_data(加载并校验耗时数据)、build_split_units(根据阈值构建文件级/类级拆分单元)、split_by_time(LPT 贪心分配算法)等函数,以及SLOW_FILE_THRESHOLD = 300.0等配置常量。 -
TestMgr.__init__新增test_classes字段:用于存储类级拆分映射{'ut_files': {file_path: [class_name, ...]}, 'op_ut_files': {}},以便exec_ut在类级执行模式下逐类运行测试。 -
exec_ut函数增强类级执行与耗时收集:新增test_classes参数,当文件有类级拆分信息时,通过pytest -k class_name逐类执行并记录每个类的耗时;执行成功后将success_durations写入temp_time_data.json。 -
主流程引入基于耗时的拆分回退机制:在
access_control_test.py的__main__中,当多机场景下先尝试加载time_data.json并通过split_by_time进行耗时均衡拆分;若数据无效或不存在则回退到原有的轮询拆分(round-robin)。


代码审查
审查总结
本次审查覆盖了全部 3 个变更文件,共发现 4 个问题:
| 优先级 | 数量 | 说明 |
|---|---|---|
| P2 | 1 | classes 字段缺少类型校验,异常 JSON 可导致 AttributeError 崩溃 |
| P3 | 3 | 异常静默吞掉、多 rank 写竞争、不可达死代码 |
各文件审查结果:
ci/access_control/test_manager.py:仅新增test_classes属性初始化,无问题。ci/access_control_test.py:发现 2 个 P3 问题(多 rank 并发写temp_time_data.json;op_ut_files 类级分支为不可达死代码)。ci/split_by_time.py:发现 1 个 P2 问题(classes类型校验缺失)+ 1 个 P3 问题(discover_test_classes静默吞异常)。
总体风险评估:中等。P2 问题在外部提供异常格式 time_data.json 时会触发崩溃;P3 问题均为防御性不足或代码整洁性缺陷,正常流程下不会触发。核心的基于耗时的 LPT 拆分逻辑本身正确,get_test_key 与原有 ut_info 生成逻辑一致性良好。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.




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