3. CBTC安全场景测试用例的等价类与边界设计
为什么位置报告与移动授权必须做边界设计
CBTC 的安全输出不是“连续函数”,而是由离散判定阈值切出来的状态。以列车位置报告为例,车载周期上报“车头可信位置 + 位置不确定度”,轨旁 ATP 用 安全车尾 = 车头位置 − 不确定度 − 安全余量 计算后,再与前方障碍/进路终点比较,决定移动授权(MA)的终点。这里真正决定安全的是几个参数边界:不确定度上限、MA 计算的最小安全余量、以及“车尾是否越过授权终点”的判定阈值。等价类负责把无限输入压成有限类,边界值负责在类与类的接缝处补刀——因为缺陷几乎总藏在“刚好等于”和“刚好超过”的那一格。
参数与判定模型(先定参照,再定用例)
约定:位置沿运行方向为正,单位米;d_head 为车头可信位置,u 为位置不确定度,m 为安全余量(取 2.0 m),L_MA 为授权终点位置。安全车尾 d_tail = d_head − u − m。安全判定条件为 d_tail ≥ L_MA 时保持/延伸授权,d_tail < L_MA 时收缩授权至 d_tail 并触发制动曲线。参数约束:0 ≤ u ≤ 6.0 m(超限视为位置报告失效,进入降级)。
等价类划分:把输入压成可判定的类
针对 u 与 d_tail 两个核心参数,按“有效/无效”和“安全/不安全”两个维度划分:
| 参数 | 等价类 | 代表值 | 预期安全输出 |
|---|---|---|---|
| u | EC1 有效小值 (0,3) | 1.5 | 正常计算 d_tail,参与 MA 判定 |
| u | EC2 有效大值 (3,6] | 5.0 | 正常计算,d_tail 偏保守 |
| u | EC3 无效 >6.0 | 6.5 | 报告失效,进入降级,不输出 MA |
| d_tail vs L_MA | 安全类 d_tail ≥ L_MA | 995.0 vs 990.0 | 保持/延伸授权 |
| d_tail vs L_MA | 不安全类 d_tail < L_MA | 988.0 vs 990.0 | 收缩授权至 d_tail,触发制动曲线 |
边界值用例设计(可直接执行)
以下用例以 d_head=1000.0、m=2.0、L_MA=990.0 为固定基线,只变动被测参数,便于定位缺陷。ε 取 0.1 m,对应位置报告分辨率。
| 用例 | u | d_tail | 判定 | 预期输出 |
|---|---|---|---|---|
| BV-01 | −0.1 | — | 无效输入 | 拒绝报告,记录异常,不更新 MA |
| BV-02 | 0 | 998.0 | ≥990 | 保持授权,MA 终点不变 |
| BV-03 | 3.0 | 995.0 | ≥990 | 保持授权 |
| BV-04 | 6.0 | 992.0 | ≥990 | 保持授权(上边界仍有效) |
| BV-05 | 6.1 | — | 越界 | 报告失效,降级,MA 冻结 |
| BV-06 | 8.0 | 990.0 | =990 | 保持授权(判定取 ≥,等号归安全侧) |
| BV-07 | 8.1 | 989.9 | <990 | 收缩授权至 989.9,触发制动曲线 |
BV-06 与 BV-07 是本节最关键的“接缝用例”:判定条件写
≥ 还是 >,直接决定 990.0 这一格是保持还是收缩。测试必须显式覆盖等号点,否则该缺陷在常规用例中不可见。结果判读与通过条件
- 通过:每个边界点的实际输出与上表“预期输出”一致,且等号点(BV-06)落在安全侧(保持授权)。
- 不通过典型表现:u=6.0 被误判为失效(边界闭合方向错误);d_tail=990.0 被误判为收缩(等号归属错误);u=6.1 仍参与 MA 计算(无效类未拦截)。
- 记录要求:每条用例记录输入参数、计算出的 d_tail、判定分支、MA 终点值与制动曲线触发标志,便于回溯是参数错误还是判定逻辑错误。
等价类保证“类内代表值”覆盖,边界值保证“类间接缝”覆盖,两者组合才能把参数边界这一约束对象测透。若时间受限,优先保留所有等号点与越界点用例。