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 个,测试用例设计也随之收敛。需要强调的是,化简必须保留“安全侧”语义:涉及故障—安全的条件(如区段占用、道岔失表)不得因化简而被弱化,化简后应再次与联锁表核对,确认等价性。

联锁表—逻辑表达式—覆盖准则的核对关系 联锁表(需求源) 进路 X:1#定位、3#反位 DG1、DG2 空闲 无敌对进路 信号 X 开放条件 道岔失表→安全侧 逻辑表达式(实现) X_open = P1 & R3 & DG1_free & DG2_free & !Hostile & Sig_ready 化简:A&(B|D) 分支数由 3 降为 2 覆盖准则 语句覆盖:每句至少一次 分支覆盖:真/假各一次 条件组合:关键组合 MC/DC:独立影响 盲区:未触发分支 逐项核对 化简后统计 三类不一致(静态检查重点) 遗漏:表中有、逻辑中无 → 安全隐患 多余:逻辑中有、表中无 → 进路无法开放 取反错误:空闲/占用写反 → 危险侧 记录:进路号—条件项—表中值—逻辑值—结论 测试盲区识别 未覆盖分支:如 !B&D 从未为真 未覆盖组合:B=0,D=1 未出现 补用例:构造 B=0、D=1 场景 回归:化简前后用例集对比

三、三类覆盖准则的落地统计

语句覆盖要求逻辑中每条可执行语句至少执行一次,是最弱的准则,只能发现“完全没跑到”的代码,无法发现分支判断错误。分支覆盖要求每个判断的真、假两个方向都至少走一次,能发现“条件写反”类缺陷。条件组合覆盖要求同一判断内各原子条件的取值组合被覆盖,强度最高但用例数随条件数指数增长,工程中常退化为“关键组合覆盖”或 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,验证该分支在替代条件也不满足时能正确关闭。补齐后重新统计覆盖率,并对化简前后的表达式分别跑同一用例集,确认化简未改变输出,形成“静态核对—化简—覆盖统计—补用例—回归”的闭环。

静态检查与覆盖分析不是一次性的:联锁表变更、表达式修改后都应重新核对并重跑覆盖统计,尤其关注化简是否弱化了安全侧条件。
覆盖率达到 100% 不等于逻辑正确,它只说明已有用例触发了所有统计对象;联锁表本身的错误、需求遗漏仍需通过人工核对和领域评审发现。