为什么 HIL 时代“夜间全量回归”是奢侈品

“下班触发,天亮看报告”——夜间全量回归是互联网/SIL 时代的 CI 标配,普通到没人觉得它需要辩护。

到了 HIL 时代,它变成了奢侈品。因为这个动作隐含三个假设——算力可弹性扩展、时间可压缩、失败成本低廉——而 HIL 恰好一个都不具备。这篇文章把账算清楚:夜间全量为什么贵、行业怎么安排节奏、全球团队怎么协调“没有共同的夜”。

一、先算一笔账

假设用例库 5000 条,平均每条 3 分钟 → 全量一遍 = 250 机时。一台机柜一夜可用约 10 小时 → 需要 25 台机柜并行才能天亮看结果。一台 HIL 机柜几十万到上百万人民币——几千万固定资产投入,只为把全量回归塞进一个晚上。

不是做不到,是贵到只有大厂玩得起(头部 OEM 确有“机柜农场”干这个)。这就是“奢侈”的数学含义。

二、HIL 缺少的三个假设

1. 算力不可弹性扩展

2. 时间不可压缩

3. 失败成本不低廉

三、还有两笔隐性开销

四、所以行业怎么做

层 节奏 原因
SIL 每晚全量 容器随便开、逻辑时钟加速、失败可复现,成本忽略不计
HIL 每晚精选冒烟/必跑集(几十到几百条) 机时贵,只烧在最值钱的用例上
HIL 全量 周末跑 / 发版前跑 / 多机柜分片跑 攒够机时才敢动

推论:scope: smoke / nightly / regression / release 这个用例标签维度,就是为“HIL 跑不起全量”这个资源现实设计的——全量回归压在 SIL 层,HIL 靠标签筛子集。“SIL 先行”不只是好实践,是经济必然。

五、哪些软件需要夜间回归

跳出 HIL 看全行业。夜间回归存在的根本原因只有一个:全量测试跑不进每次提交的分钟级流水线预算,只能攒到夜里批量跑。所以判断“哪类软件需要”,本质是判断“哪类软件的完整验证又慢又贵又必须有”。按这个逻辑过一遍:

类型 为什么必须夜间跑 夜间跑什么
嵌入式/汽车软件 依赖稀缺硬件(HIL 台架就几台);场景库成千上万条 全量 SIL 场景回归、HIL 台架排队跑冒烟+核心用例、跨 ECU 变体矩阵
操作系统/驱动/编译器 测试套件以小时计(Linux 内核 LTP/kselftest、GCC/LLVM 测试集);多架构交叉矩阵 每晚对 main 分支全量构建 + 全架构回归(KernelCI、LLVM buildbot 就是这个模式)
数据库/存储系统 崩溃恢复、故障注入、长时间压力测试没法在 PR 里跑 断电恢复、Jepsen 式一致性验证、数小时 soak
EDA/芯片仿真 回归农场文化的发源地——一次仿真几小时,用例上万 夜间回归农场排队,早上出失败报告(Synopsys/Cadence 流程的标配)
游戏引擎/图形软件 跨 GPU/平台渲染对比、着色器排列组合爆炸 图像逐像素对比回归、性能基线对比
大型 Web/微服务系统 全量 E2E 上千条用例 × 浏览器矩阵 Selenium/Playwright 全量、跨浏览器、性能基线
移动应用 设备碎片化:几十款真机 × 多个 OS 版本 设备农场夜间批跑(Firebase Test Lab 模式)
金融/交易系统 日终批处理的正确性、监管合规证据 账务对账回放、历史数据重算对比
AI/ML 模型与平台 模型评测集跑一次几十分钟到几小时;数据/模型每天变 每晚对 benchmark 集评测、精度回归、推理性能漂移监控
医疗器械/航空软件 合规驱动:每次构建都要留全量验证证据 全量回归 + 证据归档(认证审计用)

六、共同特征:判断你的软件要不要

满足两条以上,夜间回归基本是刚需:

  1. 全量测试时长 > 15 分钟:MR 流水线等不起(业界共识是 MR 反馈超过 10 分钟,开发者就开始绕过它)
  2. 依赖稀缺资源:台架、GPU 集群、license 有限的仿真器——必须排队调度,排队天然适合夜间
  3. 状态空间爆炸:平台矩阵(芯片×OS×变体)、场景库、参数组合——全量只能批处理
  4. 质量门槛高:安全关键/合规行业,每次构建都要有“全量过一遍”的证据留存
  5. 外部依赖每天在动:上游数据、第三方服务、模型权重——昨晚还过,今天就挂,只有 nightly 能抓住

七、业界通行的分层结构

每次提交/MR   → 冒烟(≤5~10 min):编译 + 静态检查 + 20~50 条核心用例
每天夜间      → 全量功能回归:整个用例库 + 平台矩阵 + 性能基线对比
每周/按需     → 稳定性浸泡(soak):数小时压力、内存泄漏、长稳运行
发布前        → 稀缺资源全量:HIL 全场景、认证证据包生成

关键点:夜间回归不是“唯一的测试”,而是分层金字塔的中间层——冒烟拦住 90% 的低级错误(反馈快),nightly 兜底剩下的(覆盖全),两层职责不重叠。

智驾域控软件其实同时命中上面表里好几行:嵌入式(台架稀缺)+ 安全关键(证据要求)+ 场景爆炸(智驾场景库)+ AI 成分(感知模型漂移)。这就是为什么智驾行业的测试架构清一色是“MR 冒烟 → 夜间 SIL 全量 → 发布前 HIL”的三层结构。

八、全球团队:地球上没有“共同的夜”

全球开发把“夜间回归”这个词里藏着的假设打破了:地球上没有“共同的夜”。上海夜里 2 点是慕尼黑晚上 8 点(他们还在提交)、加州上午 11 点(他们刚上班)。所以全球团队的第一课是认知转换:

nightly 的本质不是“夜里跑”,而是“固定节奏的快照回归”——协调的核心从“几点跑”变成“跑哪个快照、谁看结果、资源归谁”。

三种主流协调模式

模式 做法 适合谁 代价
单锚点 固定一个参考时刻(如 UTC 02:00)全球统一跑 单一时区为主、海外是小团队 总有一个地区的人上班看到的是“半截”结果;对全球均衡团队不公平
分区域窗口 每个区域工作日结束切一个快照跑一轮(亚洲 EOD 一轮、欧洲 EOD 一轮、美洲 EOD 一轮,每天 2~3 轮) 多地均衡的大团队、有硬件台架约束 调度与结果管理复杂度翻倍
连续回归 取消“夜间”概念:合并队列 + 随到随跑,回归按容量流水化 资源充足、自动化成熟的团队 要先把合并队列和快速冒烟做扎实

汽车行业的现实答案通常是分区域窗口——因为 HIL 台架是物理资产,台架在哪个时区,就按哪个时区的夜来排(上海的台架跑上海的夜,慕尼黑的台架跑慕尼黑的夜),数据汇到统一看板。纯 SIL/GPU 资源则可以 follow-the-sun 连轴转——全球分布反而成了资源利用率的优势:同一片 GPU 农场,亚洲下班欧洲用,欧洲下班美洲用,24 小时不空转。

让三种模式都能转的五个关键机制

1. 按提交切,不按钟点切(最重要) “今晚的版本”必须是一个具体的 git SHA(如“18:00 前所有已绿 MR 的合并点”),而不是“跑的时候 main 上是什么”。否则德国同事 21:00 推的一个提交会溜进亚洲的回归里,结果张冠李戴。回归报告永远钉在 commit 上——所以规范的测试平台会把代码版本/工件哈希列为运行清单(run manifest)的一等公民。

2. 合并队列(merge queue / merge train)保住主干常绿 全球 24 小时都有人合并,主干必然频繁被撞红。合并队列让每个 MR 排队、先过门禁再合入,主干任何时刻都是绿的——回归才能放心地“随时取快照”。这是从“分窗口”走向“连续回归”的桥梁。

3. 自动归因与自动处置 夜间跑完发现挂了,不能让失败等 8 小时到责任人上班。成熟做法:

4. 结果交接的“追日”流程 定义跨时区的接力 SLA,例如:亚洲早上由亚洲值班人首轮分诊(triage),属于欧洲模块的失败 @欧洲对应人,欧洲上班时看到的不该是“一片红”,而是“已初步归因、待你确认”。看板是唯一事实源,禁止用邮件/IM 传递失败结论。

5. flaky 治理全球统一 多时区最放大的毒瘤是 flaky test(时过时不过的用例):亚洲标了“已知 flaky”,欧洲不知道,又查两小时。必须有全球统一的隔离区制度(连续 N 次不稳定就移出主干套件、单独跑、限期修复)。

一个典型的全球化配置

外资车企的典型配置:中国团队 + 欧洲总部 + 北美软件中心。常见的组合拳是:


回看全文:“夜间全量”在 SIL 是标配,在 HIL 是奢侈品——行业的答案是分层:全量压给 SIL,HIL 靠标签筛子集,全球团队再把“夜”拆成区域窗口。而全球协调表面是时区问题,实质是快照治理、失败归属、资源调度三件事:时区只决定窗口几点开,剩下 90% 的工作是让任何时区的人早上打开看板,都能回答三个问题——跑的是哪个版本?谁弄挂的?现在轮到谁修?


附:名词解释(按出场顺序)

名词 通俗解释
HIL(硬件在环) 真实 ECU 接仿真台架的测试环境;最接近装车,但台架贵、数量少
SIL(软件在环) 控制器软件整体在 PC/服务器上仿真运行的测试环境;纯软件、可大规模并行
CI(持续集成) 每次提交自动构建并跑测试的开发实践
OEM(主机厂) 整车厂,汽车产业链顶端的整车品牌方
ECU 电子控制单元,车上的嵌入式控制器
AEB 自动紧急制动,典型的智驾安全功能,常被拿来做测试场景的例子
soak(浸泡测试) 数小时起步的长时间稳定性测试,专抓内存泄漏、长稳衰退
Jepsen 著名的分布式系统一致性验证框架,专抓“你以为一致其实不一致”
EDA 电子设计自动化,芯片设计与仿真工具链的统称
E2E(端到端测试) 从用户入口到出口把整条链路走一遍的测试
MR Merge Request,合并请求;流水线门禁通常挂在它上面
合并队列(merge queue / merge train) MR 排队、先过门禁再合入的机制,保证主干任何时刻都是绿的
follow-the-sun(追日) 工作随时区接力传递的全球协作模式,资源 24 小时不空转
门禁(质量门禁) 流水线上的自动关卡:不达标就不许合入
bisect(二分定位) 在提交历史里二分查找,定位引入问题的那个 commit
CODEOWNERS 仓库里声明“哪块代码归谁管”的文件,自动化工具按它路由问题
triage(分诊) 对失败结果的第一轮分拣:谁的模块、什么性质、转给谁
flaky test(不稳定用例) 同一个用例不改代码、时而过时不过的“神经刀”用例

下一步:

查看全部文章