You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

语句覆盖与调用覆盖: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:13:14