C/C++单元测试工具Visual Unit 4在线帮助


白盒覆盖

    白盒覆盖从白盒角度衡量测试效果,即通过统计测试对代码逻辑单位及其组合的执行状况来衡量测试完整性,已执行的逻辑单位统计为已覆盖。

    代码的逻辑单位主要有:语句,条件、判定、分支、路径。示例:
    int WhiteBox(int A, int B, int X)
    {
        /*判定1*/
        if( A>1/*条件1*/ && B==0/*条件2*/ )
        {
            /*分支1*/
            /*语句1*/
            X = X/A;
            /*语句2*/
            A+1;
        }
        /*分支2:省略的else分支,这是一个空分支*/

        return X; /*语句3*/
    }

    判定是指对跳转的判断,由if、else if、for、while、switch等关键字及一个或多个条件构成,除switch是多值判定外,其他判定的计算结果有真和假两个值。分支是指可能的跳转路线,分支与判定意义基本相同,但也有所区别:判定是指该走哪条路,是判定语句本身的计算结果,分支是指具体走的路,是判定语句后的可能执行也可能不执行的代码。判定和分支在数量上也可能不同,一个ifelse判定,两个判定值,形成了两个分支,两者相同;而ifelse ifelse则是两个判定、四个判定值,但只形成了三个分支。在测试覆盖的统计上,判定和分支可以互相代替,如果分支全部覆盖,则判定也会全部覆盖,反之亦然。

    一个判定,可能含有一个或多个条件。条件的计算结果有真和假,通常意义上的条件覆盖,是指条件计算结果的覆盖,即条件值覆盖。

    循环结构比较复杂。循环条件也是判定语句,但由于循环次数可能无限大,基于实用考量,循环只考虑进入循环和不进入循环两种情况,即视为循环体“至少执行一次”和“从不执行”两个分支,“从不执行”分支也是一个空分支。dowhile循环的“从不执行”分支是不可达的。

    路径的本质是从函数入口到出口的代码组合,由于判定形成了跳转,不同输入下可能执行不同的代码组合,有多少种可能的代码组合,就有多少条路径。

    白盒覆盖就是统计测试对代码逻辑单位及其组合的覆盖率,可分为两大类:语句及组合、条件及组合。语句覆盖、分支覆盖、路径覆盖属于前者,条件覆盖、条件组合覆盖、判定覆盖、判定条件覆盖(C/DC)、修正判定条件覆盖(MC/DC)属于后者。

    除MC/DC和路径覆盖外,其他覆盖率的计算公式很简单:
    覆盖率 = 已覆盖逻辑单位数 / 全部逻辑单位数 * 100%,如:
    语句覆盖率 = 已覆盖语句数 / 全部语句数 * 100%;
    C/DC = (已覆盖判定数 + 已覆盖条件数) / (全部判定数 + 全部条件数) * 100%,这里的判定数和条件数是指条件和判定计算结果,即判定值和条件值。
    MC/DC和路径比较复杂,后面两节进一步介绍。