基本块覆盖 - 精确定义是什么?

时间:2012-01-14 10:28:02

标签: unit-testing testing code-coverage

假设我有这段C / C ++代码:

int c = 12; // Should I count this line as basic block?
if (a != 0 && b > 10) {
    c += (a + b);
} else {
    c += 1;
}
printf("%d", c); // Should I count this line as basic block?

测试用例a = 1, b = 12基本块覆盖是什么?

是75%还是50%?

我应该将第1行和最后一行计为基本块吗? 基本块的精确定义是什么?

另一个混乱点:

int c = 16;
d += c;

是一个基本块还是2个基本块?是否应将每一行计为基本块?

1 个答案:

答案 0 :(得分:6)

基本块包含所有具有以下属性的指令:如果其中一个被执行,那么同一基本块中的所有其他指令都是。将基本块的第一条指令命名为 leader ,我们得到以下基本块的定义:领导者之后的所有指令的集合,如果执行领导者则执行该指令。领导者是基本块的开始。

确定领导者在代码中找到所有跳转指令。每个跳跃目标和跳跃后的每个指令都是领导者。方法中的第一条指令也是领导者。

要查找基本块,只需完成从领导到下一个的所有说明。

你的第一个例子:

int c = 12; // Leader
if (a != 0 && b > 10) { // Jump
    c += (a + b); // Leader
} else {
    c += 1; // Leader
}
printf("%d", c); // Leader -- target of jump from the end of the true branch

您有有4个基本块:一个用于if,一个用于每个分支的printf之后的if,一个用于初始化c。如果a == 1 && b == 12只执行了三个基本块,则覆盖率为75%。

你的第二个例子没有跳转指令=>只有一个基本块。