系统特性:确定性回放、统计判定、证据链与 CI 原生
Cyclone 确定性场景测试内核的四个系统特性:同 seed 证据日志逐字节一致的确定性回放、Wilson+SPRT 统计判定、四件套证据链、JUnit/Bazel 的 CI 原生集成。
§1 · PROBLEM测试结果为什么没人信
场景测试报告的常见命运:跑出来,没人复核,出事没人认。根子上的原因有三个——不可复现(同一场景重跑结果不一样,FAIL 无法回归验证)、判定靠感觉(”跑了 30 把过 27 把”算不算过,谁也说不服谁)、证据不成链(报告里的 pass 无法回溯到用例版本和原始数据)。
§2 · CHARACTERISTICS四个特性,对应四味药
§2.1 确定性回放 已支持
虚拟时间回放 + 内容寻址:同 seed 的证据日志逐字节一致。时钟是虚拟的,调度是确定的,回放结果可以拿 SHA-256 比对——”我机器上能跑”这件事从此不存在。
§2.2 统计判定 已支持
Wilson 置信区间下界 + SPRT 序贯检验——用统计显著性替代人肉阈值。判定结论长这样:”0.99(95% CI 下界,n=300,case hash 可复算)”,证据攒够就提前下判,不浪费一把仿真。
§2.3 证据链 已支持
四件套:case hash + JSONL SHA-256 digest + 失败快照 + JUnit XML——每条 CI 记录可回溯到用例版本与原始数据,第三方可复算。
§2.4 CI 原生
JUnit XML 开箱即用已支持;rules_cyclone 让场景测试成为 bazel test 一等公民原型验证中;BES 就绪原型验证中。
§2.5 架构:一个内核,两种时间观
离线模式用虚拟时钟换可复现,在线模式用真实时钟换真实感——场景 YAML 不动,拨一下时钟模式即可切换:
| 虚拟时钟 | 真实时钟 | |
|---|---|---|
| 回放数据 | 离线模式:完全受控的实验室,同 seed 重跑比特级一致 已支持 | 很少用(回放不赶时间) |
| 实采总线 | 没意义——真实数据不等人 | 在线模式:真实世界的现场,SocketCAN/UDP 接入 + 硬件时间戳 已支持 |
capture once, replay forever:实车采一次总线,回到离线模式无限复现。C++ 内核 + Python 场景层的分层单引擎,进程边界 = YAML schema + 证据包格式。详见双模时钟博客。
§2.6 判定流水线
用例 YAML → 数据源回放 → 故障注入 → SUT → 统计判定 → 证据报告
261 项自动化测试全绿 · JUnit/Jenkins 就绪 · UDS 诊断演示原型验证中 · Bazel 规则包 rules_cyclone原型验证中。
§2.7 集成接口
Bazel 用户原型验证中:
# MODULE.bazel
bazel_dep(name = "rules_cyclone", version = "0.1.0")
# BUILD.bazel
cyclone_test(
name = "aeb_regression",
scenario = "scenarios/aeb.yaml",
)
# bazel test //... —— 与单元测试同图、同缓存、同看板
其他 CI:
# 单文件二进制,下载即跑(规划中)
$ cyclone run cases/aeb.yaml --out out/
# JUnit XML → Jenkins / GitLab CI 直接消费(已支持)
out/aeb_report.xml
out/aeb_manifest.json # 证据索引
§3 · DEEP DIVES深入了解
方法学背景阅读:
§4 · HONEST BOUNDARIES诚实边界
- 确定性限于平台管辖的链路。被测件自身的非确定性(多线程竞态、未播种的随机数)需要先治理,平台才能放大你的治理能力而不是掩盖它。
- Bazel 集成与 BES 是原型。rules_cyclone 可演示,但未达到生产 SLA;POC 阶段可先用 JUnit XML 直出。
- 文中示例数值均为演示数据,非真实 SUT 实测。
范围与非范围
| 非范围(Cyclone 不是) | 范围(Cyclone 是) |
|---|---|
| 仿真器——CarMaker / Carla 负责”世界有多真” | 测试内核——负责”测试信不信得过” |
| 测试管理平台——管人和流程 | 执行引擎——管机器和证据 |