3. MC/DC与语句覆盖、判定覆盖、条件覆盖、MCC的关系

在航空机载软件的结构覆盖测试中,DO-178C 把覆盖率指标按软件等级(DAL)分层要求:A 级要求 MC/DC,B 级要求判定覆盖,C 级要求语句覆盖。理解 MC/DC 与语句覆盖(SC)、判定覆盖(DC)、条件覆盖(CC)、多重条件覆盖(MCC)之间的包含关系与强度差异,是选择测试策略、评估测试充分性、判断"测够了没有"的基础。本节从集合包含关系入手,逐层剖析各准则的判定能力,并给出工程选用原则。

一、五种覆盖准则的定义回顾

先明确各准则的判定对象。设一个判定由若干原子条件通过逻辑运算符(AND、OR、NOT)组合而成,例如 D = A && (B || C),其中 A、B、C 为原子条件。

  • 语句覆盖(SC):每条可执行语句至少执行一次。它只关心"代码有没有跑到",不关心判定的真假分支。
  • 判定覆盖(DC):每个判定的真、假结果至少各出现一次。它保证每个 if/while 的两个出口都被走到。
  • 条件覆盖(CC):每个原子条件的真、假取值至少各出现一次。注意它不保证判定本身的真假被覆盖。
  • 判定/条件覆盖(D/CC):同时满足 DC 与 CC,是两者的交集要求。
  • MC/DC:在满足 DC 的基础上,每个原子条件都能独立影响判定结果——即在固定其他条件不变时,单独翻转该条件会使判定结果翻转。对 N 个条件的判定,最少需要 N+1 个测试用例。
  • 多重条件覆盖(MCC):枚举判定中所有原子条件的全部真值组合,N 个条件需 2^N 个用例,强度最高但用例数指数增长。

二、覆盖强度与子集关系

从集合包含角度看,各准则并非简单的线性包含链,而是存在交叉与严格包含并存的关系。关键结论如下:

  • MC/DC 蕴含 DC:满足 MC/DC 必然满足判定覆盖,因为独立影响对本身就要求判定出现真、假两种结果。
  • MC/DC 不蕴含 CC:MC/DC 只要求每个条件能独立影响结果,并不强制每个条件都取到真和假。例如 D = A && B,用例 (A=T,B=T)→T 与 (A=F,B=T)→F 已满足 MC/DC,但 B 从未取假值,故不满足 CC。
  • CC 不蕴含 DC:条件都取过真假,判定却可能只出现一种结果。例如 D = A || B,用例 (T,F) 与 (F,T) 使 A、B 均取真假,但 D 恒为真。
  • MCC 蕴含 MC/DC、DC、CC:全组合覆盖必然满足所有较弱准则。
  • SC 是最弱准则,被 DC、CC、MC/DC、MCC 全部蕴含(在无死代码前提下)。
强度排序(由弱到强):SC < DC < D/CC < MC/DC < MCC。但需注意 DC 与 CC 之间无包含关系,二者是交叉的,D/CC 才是它们的共同下界。

下面的 SVG 以 D = A && (B || C) 为例,直观展示五种准则的用例集合包含关系与强度阶梯。

覆盖准则强度阶梯与集合包含关系(示例判定 D = A && (B || C)) 强度阶梯(由弱到强) SC 语句覆盖 每条语句至少执行一次 DC 判定覆盖 每个判定真/假各一次 CC 条件覆盖 每个原子条件真/假各一次 D/CC 判定/条件覆盖 DC 与 CC 同时满足 MC/DC 修正条件/判定覆盖 每条件独立影响判定结果 MCC 多重条件覆盖 枚举全部 2^N 真值组合 强度递增 集合包含关系(Venn 示意) MCC(2^N 全组合) MC/DC DC CC D/CC 交集 SC 注:DC 与 CC 互不包含,D/CC 为二者交集;MC/DC 蕴含 DC 但不蕴含 CC;MCC 蕴含其余全部。

三、为什么 MC/DC 是 A 级软件的"甜点"

MCC 虽然强度最高,但对 N 个条件的判定需要 2^N 个用例。机载软件中一个判定常含 5~10 个条件,2^10 = 1024 个用例,测试成本不可接受。MC/DC 用 N+1 个用例(线性增长)就达到了接近 MCC 的缺陷检出能力——它强制每个条件都"单独被证明能改变结果",能有效暴露短路求值、条件写错、运算符误用等缺陷,同时用例数可控。这正是 DO-178C 在 A 级软件中要求 MC/DC 而非 MCC 的工程原因。

四、工程选用原则

实际项目中,覆盖准则的选择不是"越强越好",而是与软件等级、判定复杂度、测试成本三者匹配:

软件等级DO-178C 最低要求典型判定复杂度建议策略
A 级MC/DC多条件复合判定逐判定构造 N+1 用例,工具辅助生成独立影响对
B 级判定覆盖 DC多为简单判定保证真假分支,必要时补充 CC
C 级语句覆盖 SC简单分支保证语句执行,关注死代码
D 级无结构覆盖要求—以需求覆盖为主

选用时还需注意三点工程细节:

  1. 短路求值的影响:C/C++ 中 A && B 在 A 为假时 B 不被求值,导致 B 的取值无法被观测。构造 MC/DC 用例时必须让被考察条件处于"被求值"的位置,否则独立影响对不成立。
  2. 不可达条件的处理:若某条件因上游逻辑恒为某值(如 A && !A 或受前置守卫约束),无法构造独立影响对,需在覆盖率分析报告中标注为"不可达/等效条件",并给出理由,而非强行凑用例。
  3. 工具与人工结合:LDRA、VectorCAST、CTC++ 等工具可自动统计 MC/DC 并给出未覆盖的独立影响对,但用例的语义正确性仍需人工依据需求判定,工具只回答"覆盖到了没有",不回答"测得对不对"。
快速判断口诀:语句看"跑没跑到",判定看"真假两出口",条件看"每个原子真假",MC/DC 看"每个条件能否单独翻盘",MCC 看"全组合"。A 级选 MC/DC,B 级选 DC,C 级选 SC,MCC 一般仅用于关键小规模判定。