已合并
【RFC】split ut case by execute time #40544
fengyixing创建于 7月9日
【RFC】split ut case by execute time #40544
已合并
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 42154626
atomgit-bot
atomgit-bot
7月9日 评论:

变更摘要

此 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)。

likedislike
atomgit-bot
atomgit-bot
7月9日 评论:

代码审查


审查总结

本次审查覆盖了全部 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

💬 仅评论

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日 合入了pull request
ascend-robot
ascend-robot成员
7月14日 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
ascend-robot
ascend-robot成员
7月14日 评论:
流水线 pytorch_gitcode_PR_multiVersion#12494 [ commitID:5715bbe3 ] 已完成
likedislike