☰
嵌入式软件动态测试(三十三)——测试覆盖率不是越高越好:语句/分支/MC-DC 到底该追哪一种?
2026/10/14 1:48:51 网站建设 项目流程

❄️ 我的个人专栏:
《智能软件工程AI4SE》
《嵌入式面试总结》
《嵌入式处理器架构解析》
《嵌入式与虚拟化》
《嵌入式软件测试》
🌟 Simplicity is the ultimate sophistication

摘要:本文围绕嵌入式软件动态测试中的覆盖率指标展开,指出「覆盖率越高越好」是常见误区。文章对比了语句覆盖、分支覆盖和 MC/DC 三种主流指标的含义、度量粒度与适用场景,并通过表格直观呈现三者在测试用例要求、适用场景和成本上的差异。核心观点是:覆盖率并非越高越好,应结合项目安全等级与风险,按分层思路设定合理目标——语句覆盖作为底线,分支覆盖是一般嵌入式项目的性价比之选,MC/DC 则用于安全关键系统。最终强调覆盖率是提升测试质量的手段,而非被数字绑架的 KPI。

1. 引言

在嵌入式软件动态测试中,覆盖率常被视为衡量测试充分性的关键指标。很多团队把「覆盖率越高越好」当作默认信条,甚至把 100% 语句覆盖作为硬性门槛。然而,覆盖率并非越高越好,不同覆盖率指标反映的测试充分性维度完全不同。盲目追求高覆盖率,不仅会带来高昂的测试成本,还可能给人虚假的安全感。本文围绕语句覆盖、分支覆盖和 MC/DC 三种主流覆盖率指标,分析它们各自的含义、适用场景与取舍逻辑,帮助读者在真实项目中做出更理性的选择。

2. 覆盖率指标的本质:度量什么,就优化什么

覆盖率指标本质上是对「测试执行到了哪些代码结构」的度量。不同的指标关注不同的代码结构,因此它们对测试充分性的刻画能力也不同。理解这一点,是正确选择覆盖率指标的前提。

从度量维度看,三种指标可以这样区分:

  • 语句覆盖:度量每条可执行语句是否至少被执行一次。它回答的问题是「每一行代码都跑过了吗」。
  • 分支覆盖:度量每个判定条件的真、假两个分支是否都被执行过。它回答的问题是「每个 if/else 的两条路都走过吗」。
  • MC/DC 覆盖:度量每个判定中的每个条件是否独立地影响判定结果。它回答的问题是「每个条件单独翻转时,判定结果是否随之改变」。

可以看出,从语句覆盖到分支覆盖再到 MC/DC,度量粒度越来越细,对测试用例的设计要求也越来越高。相应地,达到同等覆盖率所需的测试用例数量和执行成本也会显著上升。

3. 语句覆盖:最基础的底线,但远远不够

语句覆盖是最容易理解和实现的覆盖率指标。它的目标是让每一条可执行语句至少被执行一次。对于简单的顺序结构代码,语句覆盖几乎可以轻松达到 100%。

然而,语句覆盖存在明显的盲区。它不关心判定条件的真假分支是否都被覆盖,也不关心条件之间的组合关系。一个典型的例子是:

if (a && b) { // 业务处理 }

如果测试用例只让 a 和 b 同时为真,那么语句覆盖可以达到 100%,但「a 为假」和「b 为假」这两个分支从未被执行。一旦代码中隐藏着对假分支的依赖,缺陷就会被漏掉。

因此,语句覆盖更适合作为测试的底线指标,用于快速发现「有没有代码根本没被执行」的问题,但不应作为充分性的唯一依据。

4. 分支覆盖:比语句覆盖更进一步

分支覆盖要求每个判定的真、假两个分支都至少被执行一次。相比语句覆盖,它能发现更多与判定逻辑相关的缺陷。

仍以上面的例子说明:

if (a && b) { // 业务处理 }

要达到分支覆盖,测试用例需要覆盖「a 为真且 b 为真」和「a 为假或 b 为假」两种情况。这样,假分支中的代码也会被执行到,缺陷暴露的概率显著提高。

但分支覆盖仍有局限。它只要求每个分支被执行,并不要求每个条件独立影响判定结果。对于复合条件,分支覆盖无法发现「某个条件被短路逻辑掩盖」的问题。例如,当 a 为假时,b 是否被求值取决于短路规则,分支覆盖无法区分这种差异。

5. MC/DC 覆盖:航空级标准,成本也最高

MC/DC(Modified Condition/Decision Coverage)是 DO-178C 等安全标准中 A 级软件要求的覆盖率指标。它的核心要求是:每个判定中的每个条件都必须独立地影响判定结果。

具体来说,MC/DC 要求对每个条件 C,至少存在一对测试用例,使得仅改变 C 的真假,而其他条件保持不变时,判定结果随之改变。这能有效发现被短路逻辑或冗余条件掩盖的缺陷。

MC/DC 的优点是测试充分性极高,特别适合安全关键系统。但它的成本也非常高:

  • 测试用例数量显著增加,尤其是复合条件较多的判定。
  • 测试用例设计难度大,需要精确构造条件组合。
  • 执行和回归成本高,对测试环境和工具链要求也更高。

因此,MC/DC 并不适合所有项目。对于非安全关键系统,盲目追求 MC/DC 会造成巨大的资源浪费。

6. 三种指标的对比与选择逻辑

为了更直观地对比三种指标,下面用一个表格汇总它们的核心差异:

指标度量对象测试用例要求适用场景成本
语句覆盖每条可执行语句低通用底线、快速冒烟低
分支覆盖每个判定的真假分支中一般嵌入式项目中
MC/DC每个条件独立影响判定高安全关键系统(如航空、医疗)高

选择覆盖率指标时,建议遵循以下逻辑:

  • 先明确项目的安全等级和行业规范要求。如果规范强制要求 MC/DC,则必须满足。
  • 对于一般嵌入式产品,分支覆盖通常是性价比最高的选择,能覆盖绝大多数判定逻辑缺陷。
  • 语句覆盖作为底线,确保没有代码被遗漏执行。
  • 不要盲目追求 100% 覆盖率。覆盖率只是手段,发现并修复缺陷才是目的。

7. 实战案例:一个嵌入式模块的覆盖率选择

下面通过一个温度采集模块的实例,演示如何根据安全等级选择不同的覆盖率指标,并给出对应的测试用例设计与覆盖率数据对比。

假设某嵌入式系统包含一个温度采集模块,其核心逻辑如下:当温度超过阈值且连续采样次数达到要求时,触发报警;否则进入正常采集流程。该模块的判定逻辑可简化为:

if (temp > THRESHOLD && sample_count >= MIN_SAMPLES) { trigger_alarm(); } else { normal_collect(); }

针对该模块,不同安全等级下的覆盖率选择如下:

  • 非安全关键场景(如消费电子):采用语句覆盖即可。只需让 temp 和 sample_count 满足条件进入报警分支,或进入正常分支,保证每条语句至少执行一次。测试用例数量少,成本低。
  • 一般工业控制场景:采用分支覆盖。需要覆盖「条件为真」和「条件为假」两个分支,即分别构造 temp 超限且采样次数足够、以及 temp 未超限或采样次数不足两组用例,确保两个分支都被执行。
  • 安全关键场景(如航空、医疗):采用 MC/DC。需要为每个条件独立影响判定结果构造用例,即分别验证 temp 单独翻转、sample_count 单独翻转时判定结果是否随之改变,测试用例数量显著增加。

以 MC/DC 为例,针对上述判定条件,需要构造以下测试用例:

用例编号temp > THRESHOLDsample_count >= MIN_SAMPLES判定结果覆盖目标
TC1真真触发报警两个条件同时为真
TC2假真正常采集验证 temp 独立影响判定
TC3真假正常采集验证 sample_count 独立影响判定

通过上述用例,可以验证每个条件都能独立影响判定结果,满足 MC/DC 要求。对比三种指标下的测试成本与覆盖率数据:

覆盖率指标测试用例数量语句覆盖分支覆盖MC/DC适用场景
语句覆盖1-2 个100%50%不适用非安全关键
分支覆盖2-3 个100%100%不适用一般工业控制
MC/DC3 个及以上100%100%100%安全关键系统

从对比可以看出,随着覆盖率指标要求的提高,测试用例数量和执行成本显著上升,但测试充分性也随之增强。因此,在实际项目中,应根据模块的安全等级和行业规范,选择最合适的覆盖率指标,而不是盲目追求最高标准。

7. 覆盖率不是越高越好:成本与收益的平衡

很多团队把覆盖率数字当作 KPI,却忽略了覆盖率背后的成本。达到 90% 的语句覆盖可能只需要少量测试用例,但从 90% 提升到 100%,往往需要付出数倍的成本,而新增的收益却可能微乎其微。

这是因为,剩余未覆盖的代码往往是异常处理、边界条件或防御性代码,这些路径在真实运行中极少触发。为它们设计测试用例,投入产出比很低。

更值得警惕的是「覆盖率虚高」现象。有些团队通过删除未覆盖代码、合并分支或调整工具配置来美化覆盖率数字,这种做法不仅没有提升测试质量,反而掩盖了真实的测试盲区。覆盖率应当服务于测试目标,而不是反过来被数字绑架。

8. 实践建议:如何制定合理的覆盖率目标

结合上述分析,给出以下实践建议:

  • 按安全等级分层设目标:安全关键模块采用 MC/DC,一般业务模块采用分支覆盖,工具类代码采用语句覆盖即可。
  • 关注未覆盖代码的原因:分析未覆盖代码是「测试用例不足」还是「代码本身不可达」,后者应通过代码审查确认。
  • 把覆盖率与需求追溯结合:覆盖率指标应服务于需求验证,而不是孤立地追求数字。
  • 定期审视覆盖率目标:随着代码演进,定期评估既有覆盖率目标是否仍然合理,避免僵化。

9. 总结

测试覆盖率不是越高越好,关键在于选择与项目风险相匹配的指标。语句覆盖是最基础的底线,分支覆盖是性价比最高的通用选择,MC/DC 则是安全关键系统的硬性要求。理解三种指标的差异,结合项目实际设定合理的覆盖率目标,才能让覆盖率真正成为提升测试质量的工具,而不是负担。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询