看到的 undertaker 的 coverage 模式(特别是 -C simple_decision / -C min_decision)其实来自软件测试理论中的两个经典概念:statement coverage(语句覆盖) 和 decision coverage(判定覆盖) 。这两个覆盖准则本质上定义了“一个测试配置集要覆盖多少种条件分支”。
定义:
每一条代码语句(在
#ifdef/#if展开的可能路径中)至少被某个配置执行一次。
在 undertaker 中:
#ifdef/#if/#endif 控制的代码块。例子:
#ifdef CONFIG_A
foo();
#endif
#ifdef CONFIG_B
bar();
#endif
语句覆盖要求生成的配置能覆盖:
CONFIG_A=y(覆盖 foo())CONFIG_B=y(覆盖 bar())即可。不管这两个宏的真假组合(00、01、10、11)哪个生效,只要每条语句都至少被编译过一次就算覆盖。
定义:
每个布尔判定表达式的真分支和假分支都至少被一个配置覆盖。
在 undertaker 中:
#if defined(CONFIG_A) && !defined(CONFIG_B)。这个表达式为假(block被排除)
都能出现至少一次。
例子:
#if defined(CONFIG_A) && !defined(CONFIG_B)
foo();
#endif
要实现 decision coverage:
CONFIG_A=y, CONFIG_B=n → 语句被包含;CONFIG_A=n 或 CONFIG_B=y → 语句被排除。这样就覆盖了判定表达式的两个可能结果。
| 模式 | 算法 | 含义 | 生成的配置数量 | 精度 |
|---|---|---|---|---|
-C simple |
语句覆盖 | 每个 #if代码块至少被启用一次 |
少 | 粗略 |
-C simple_decision |
判定覆盖 | 每个 #if条件的真/假分支都被覆盖 |
多 | 较高 |
-C min |
最小语句覆盖 | 生成尽可能少的配置覆盖所有代码块 | 比 simple 少 | 精确但慢 |
-C min_decision |
最小判定覆盖 | 保证每个判定的真/假都覆盖,同时配置数尽量少 | 最少 | 最精确、最慢 |
| 概念 | 类似单元测试中的含义 | undertaker 的生成目标 |
|---|---|---|
| statement coverage | 每条语句都被执行过一次 | 每个 #ifdef代码块至少出现一次 |
| decision coverage | 每个 if 条件的 True/False 都执行过 | 每个 #if表达式真/假都出现一次 |