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