linux-startup

看到的 undertakercoverage 模式(特别是 -C simple_decision / -C min_decision)其实来自软件测试理论中的两个经典概念:statement coverage(语句覆盖)decision coverage(判定覆盖) 。这两个覆盖准则本质上定义了“一个测试配置集要覆盖多少种条件分支”。


🧩 一、Statement Coverage(语句覆盖)

定义:

每一条代码语句(在 #ifdef/#if 展开的可能路径中)至少被某个配置执行一次。

在 undertaker 中:

例子:

#ifdef CONFIG_A
  foo();
#endif
#ifdef CONFIG_B
  bar();
#endif

语句覆盖要求生成的配置能覆盖:

即可。不管这两个宏的真假组合(00、01、10、11)哪个生效,只要每条语句都至少被编译过一次就算覆盖。


🧮 二、Decision Coverage(判定覆盖)

定义:

每个布尔判定表达式的真分支和假分支都至少被一个配置覆盖。

在 undertaker 中:

例子:

#if defined(CONFIG_A) && !defined(CONFIG_B)
  foo();
#endif

要实现 decision coverage:

这样就覆盖了判定表达式的两个可能结果。


⚙️ 三、在 undertaker 中的区别

模式 算法 含义 生成的配置数量 精度
-C simple 语句覆盖 每个 #if代码块至少被启用一次 粗略
-C simple_decision 判定覆盖 每个 #if条件的真/假分支都被覆盖 较高
-C min 最小语句覆盖 生成尽可能少的配置覆盖所有代码块 比 simple 少 精确但慢
-C min_decision 最小判定覆盖 保证每个判定的真/假都覆盖,同时配置数尽量少 最少 最精确、最慢

🧠 四、总结类比(帮你快速记)

概念 类似单元测试中的含义 undertaker 的生成目标
statement coverage 每条语句都被执行过一次 每个 #ifdef代码块至少出现一次
decision coverage 每个 if 条件的 True/False 都执行过 每个 #if表达式真/假都出现一次