语句覆盖与调用覆盖:100%语句覆盖是否等价于函数内100%调用覆盖?
100%语句覆盖是否等价于100%调用覆盖?
答案是不一定,核心取决于你对“调用覆盖”的定义:
情况1:调用覆盖指覆盖所有调用语句
如果你的“调用覆盖”是指函数内部每一条调用其他函数的代码行都被执行至少一次,那么100%语句覆盖就等于100%调用覆盖。因为调用语句本身就是可执行语句,语句覆盖的要求就是所有可执行语句都被触发,自然包含了所有调用语句。
比如这段代码:
void demo(int flag) { printf("start\n"); if (flag) { func_a(); // 调用语句1 } else { func_b(); // 调用语句2 } }
要达到100%语句覆盖,必须测试flag=1和flag=0两个用例,此时两条调用语句都会被执行,调用覆盖也自然达到100%。
情况2:调用覆盖指覆盖所有被调用的目标函数
如果你的“调用覆盖”是指当前函数所调用的每一个目标函数都被实际触发至少一次,那100%语句覆盖就无法保证100%调用覆盖。典型场景是通过函数指针或者分支选择调用不同函数,但测试用例只触发了部分目标函数:
比如这段代码:
void func_x() {} void func_y() {} void test(int val) { void (*target)(void) = val > 0 ? func_x : func_y; target(); // 这是唯一的调用语句 }
如果测试用例只传val=1,那么所有语句都被执行了(变量赋值、函数调用),语句覆盖是100%,但func_y从未被调用过,此时调用覆盖(按目标函数统计)就没达到100%。
还有一种场景是循环内的条件调用:
void process_items(int items[], int count) { for (int i = 0; i < count; i++) { if (items[i] % 2 == 0) { handle_even(); } else { handle_odd(); } } }
如果测试用例只传全是偶数的items数组,那么循环体、判断语句、handle_even()调用都被执行了,语句覆盖是100%,但handle_odd()从未被触发,调用覆盖(按目标函数)就不达标。
内容的提问来源于stack exchange,提问作者Alex Arpenteur
相关产品推荐
相关产品推荐

