4. 联锁逻辑静态检查与测试覆盖分析
动态测试只能证明“跑过的用例没出错”,却无法回答“没跑到的逻辑是否可信”。静态检查与覆盖分析正是为了在测试执行前后回答这个问题:联锁表与逻辑表达式是否一致、表达式是否被正确化简、测试用例究竟覆盖了哪些语句、分支和条件组合,以及哪些逻辑分支从未被任何用例触发。本节围绕联锁表一致性检查、逻辑表达式化简、三类覆盖准则和测试盲区识别展开,并给出可直接套用的检查与统计方法。
一、联锁表一致性检查:从表格到逻辑的核对
联锁表是联锁逻辑的“需求源”,通常以进路为单位列出每条进路的始端、终端、道岔位置、敌对进路、区段占用条件、信号开放条件等。静态检查的第一步是把联锁表逐行与逻辑表达式核对,重点看三类不一致:遗漏(表中有条件、逻辑中未体现)、多余(逻辑中有条件、表中无依据)、取反错误(如“区段空闲”被写成“区段占用”)。
实操中建议采用“逐进路建对照表”的方法。以某进路 X 为例,联锁表给出:道岔 1# 定位、3# 反位,区段 DG1、DG2 空闲,无敌对进路,信号 X 开放。对应逻辑表达式应写成各条件的合取:
X_open = P1_locked & R3_locked & DG1_free & DG2_free
& !Hostile_route & Signal_X_ready
核对时逐项打钩:表中每个条件都能在表达式中找到对应项,表达式中每个合取项都能在表中找到依据。若表达式多出 DG3_free,而联锁表未列 DG3,则属于“多余条件”,可能导致进路无法开放;若表中列了“敌对进路锁闭”而表达式缺失,则属于“遗漏”,是安全隐患。检查结果应记录为“进路号—条件项—表中值—表达式中值—结论”的对照清单,便于复核和回归。
二、逻辑表达式化简:让覆盖对象可数
未经化简的表达式往往存在冗余项和重复子式,直接用于覆盖统计会虚增分支数量、掩盖真实盲区。化简的目标是在保持逻辑等价的前提下,减少文字和项数,使分支与条件组合清晰可数。常用手段是布尔代数化简与卡诺图,工程中更实用的是“提取公共子式 + 消除冗余项”。
例如某信号开放条件原始表达式为:
Y = (A & B) | (A & B & C) | (A & !B & D)
其中 A&B 被 A&B&C 吸收(因为 A&B 已蕴含 A&B&C 的情形),化简后为:
Y = (A & B) | (A & !B & D) = A & (B | (!B & D)) = A & (B | D)
化简后只剩 3 个变量、2 个分支,覆盖统计的对象从 3 个乘积项降为 2 个,测试用例设计也随之收敛。需要强调的是,化简必须保留“安全侧”语义:涉及故障—安全的条件(如区段占用、道岔失表)不得因化简而被弱化,化简后应再次与联锁表核对,确认等价性。
三、三类覆盖准则的落地统计
语句覆盖要求逻辑中每条可执行语句至少执行一次,是最弱的准则,只能发现“完全没跑到”的代码,无法发现分支判断错误。分支覆盖要求每个判断的真、假两个方向都至少走一次,能发现“条件写反”类缺陷。条件组合覆盖要求同一判断内各原子条件的取值组合被覆盖,强度最高但用例数随条件数指数增长,工程中常退化为“关键组合覆盖”或 MC/DC(修正条件/判定覆盖),即每个原子条件都能独立影响判断结果。
以化简后的 Y = A & (B | D) 为例,分支覆盖至少需要:A=1 且 (B|D)=1 使 Y=1;A=0 或 (B|D)=0 使 Y=0。条件组合覆盖则需覆盖 A、B、D 的关键组合,例如 A=1,B=1,D=0;A=1,B=0,D=1;A=1,B=0,D=0;A=0,B=1,D=1 等。统计时用一张“条件—用例”矩阵记录每个用例触发的分支与组合,未被任何用例置位的格子即为盲区。
| 覆盖准则 | 统计对象 | 本例最少用例数(示例) | 能发现的典型缺陷 |
|---|---|---|---|
| 语句覆盖 | 可执行语句 | 1~2 | 整段逻辑未执行 |
| 分支覆盖 | 判断的真/假方向 | 2 | 条件取反、分支遗漏 |
| 条件组合覆盖 | 原子条件取值组合 | 4~6(示例) | 组合边界、隐性耦合 |
四、识别测试盲区并补齐用例
盲区通常出现在三类位置:一是化简后仍保留的“与或”嵌套分支,如 !B&D 这种需要 B=0、D=1 同时成立的组合;二是故障—安全侧条件,如道岔失表、区段红光带,正常用例很少触发;三是进路组合边界,如两条敌对进路同时请求。识别方法是把覆盖矩阵中“从未置位”的行列挑出,反推所需的条件取值,再构造对应场景。
例如发现 B=0、D=1 组合从未出现,可设计用例:A=1、B=0(某条件不满足)、D=1(替代条件满足),预期 Y=1,用以验证“或”分支的替代路径确实生效;再设计 A=1、B=0、D=0,预期 Y=0,验证该分支在替代条件也不满足时能正确关闭。补齐后重新统计覆盖率,并对化简前后的表达式分别跑同一用例集,确认化简未改变输出,形成“静态核对—化简—覆盖统计—补用例—回归”的闭环。