已合并
【RFC】split ut case by execute time #40543
fengyixing创建于 7月9日
【RFC】split ut case by execute time #40543
已合并
fengyixing创建于 7月9日
fengyixing
fengyixing成员
7月9日

【合入来源】

如有社区issue,请关联issue链接
请勿携带内部流程信息(需求链接、问题单、内部issue等)

【修改方案】

1.access_control_test.py中,判断是否存在历史耗时数据文件,如果存在,按照用例文件耗时时间和类级别耗时时间数据进行用例装箱
2.test_manager.py中增加self.test_classes用于存储类级拆分的用例文件路径和用例名信息
3.增加split_by_time.py模块,用于按照用例文件耗时时间和类级别耗时时间数据进行用例装箱

【资料变更】

不涉及

【接口变更】

不涉及

【功能验证】

测试方法:
1.当没有耗时数据文件存在时,用例文件按照字典序排列,按顺序装箱到容器中执行,每一个容器中的用例文件数相同,执行时全部按照用例文件级别执行
2.当存在耗时数据文件时,用例文件按照耗时时间排序,如果用例文件耗时超过300s,对该用例文件取消用例文件级别排序,替换为使用类级别耗时数据排序。按照时间顺序进行贪心算法方式装箱到容器中执行,每一个容器中的用例文件总耗时几乎相同,文件数量大概率不相同。执行时既有文件级别也有类级别执行
无需UT用例看护

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 fengyixing 的贡献)
fengyixingfengyixing成员
7月9日 创建了 pull request,commit 102a32d2
atomgit-bot
atomgit-bot
7月9日 评论:

变更摘要

此 PR 引入基于历史执行耗时的用例拆分机制,替代原有的轮询(round-robin)分配方式,并支持对慢文件(总耗时 ≥ 300 秒)进行类级拆分。新增 ci/split_by_time.py 模块实现 LPT 贪心算法,将用例按预估耗时均匀分配到各机器;同时改造 exec_ut 函数,使其能按类粒度执行并记录类级耗时数据,最终输出到 temp_time_data.json 用于后续迭代。

主要改动

  • 新增 ci/split_by_time.py 模块:实现 load_and_validate_time_databuild_split_unitssplit_by_time 等函数,基于 time_data.json 中的 timedata 字典,使用 LPT 贪心算法将用例文件及类按预估耗时分配到 world_size 台机器,慢文件在无类级数据时通过 AST 发现测试类并以默认 60 秒拆分。
  • TestMgr 增加 test_classes 字段:在 ci/access_control/test_manager.py__init__ 中初始化 self.test_classes,用于存储类级拆分信息,格式为 {'ut_files': {file_path: [class_name]}, 'op_ut_files': {}}
  • exec_ut 支持类级执行与耗时记录:在 ci/access_control_test.py 中扩展 exec_ut 和内部 run_tests,当传入 test_classes 时逐个类执行(通过 pytest -k 过滤),记录每个成功类的耗时到 class_durations,最终汇总写入 BASE_DIR / 'temp_time_data.json'
  • 主流程集成基于时间的分发逻辑:在 ci/access_control_test.py__main__ 中加载 time_data.json,若有效则调用 split_by_time 进行分发并设置 test_mgr.test_classes,否则回退到原有的 split_test_files 轮询方式。
likedislike
atomgit-bot
atomgit-bot
7月9日 评论:

代码审查

现在我已经对所有三个变更文件进行了全面审查。让我给出最终总结。


审查总结

各文件审查结果

文件 审查结论
ci/access_control/test_manager.py 无问题 — 仅新增 test_classes 属性初始化,变更安全
ci/access_control_test.py 发现 2 个 P3 问题:不可达死代码 + 数据一致性
ci/split_by_time.py 无问题 — 逻辑清晰,LPT 算法实现正确,边界处理合理

问题统计

  • P0: 0
  • P1: 0
  • P2: 0
  • P3: 2

整体风险评估:低风险

此变更的核心逻辑(基于历史耗时数据使用 LPT 算法拆分用例)设计合理,实现正确。发现的两个问题均为 P3 级别:一个是防御性死代码可能在未来成为潜伏缺陷,另一个是 npu_core 过滤路径上的数据一致性问题(无运行时影响)。两个问题均不影响当前功能的正确性和 CI 流水线的正常运转,可以合入后再优化。

类型 数量
🔴 阻塞 0
🟡 建议 1

💬 仅评论

likedislike
ascend-robotascend-robot成员
7月9日 添加了label:ascend-cla/yes
此处折叠了53条消息 查看更多
wjlflyer成员
7月14日 评论:

/lgtm
/approve

likedislike
ascend-robotascend-robot成员
7月14日 添加了label:lgtm
ascend-robotascend-robot成员
7月14日 删除了label:ci-pipeline-passed
ascend-robotascend-robot成员
7月14日 合入了pull request
ascend-robot
ascend-robot成员
7月14日 评论:
流水线 pytorch_gitcode_PR_multiVersion#12493 [ commitID:262fe625 ] 已完成
likedislike