问题:

请帮我针对下面小段程序用三种白盒测试方法设计测试用例:

int IsLeap(int year)

{

    if (year % 4 == 0)

    {

        if (year % 100 == 0)

        {

            if (year % 400 ==0)

            leap = 1;

            else

            leap = 0;

        }

        else

        leap = 1;

     }

    else

    leap = 0;

    return leap;

}

回答:

纯粹从白盒角度来设计用例,是方向性的错误,这是缺少实践的书本和专家的误导。这叫跟着代码走,费力不讨好。

程序中的错误,根据产生原因可分为两类:代码错误和代码缺失。代码缺失是程序员未考虑到某些输入,未编写对应代码形成的。白盒覆盖基于现有代码,无法发现这种错误。那么,白盒覆盖是否能发现前一种错误?未必!用例必须根据程序功能设定正确的预期输出,否则再高的白盒覆盖也没有意义。也是说,程序的设计功能是用例设计工作中绕不过去的,是一切的基础。既然如此,为什么要纯粹从白盒角度来设计用例?我认为,类似基路径法之类的纯白盒方法都是应该抛弃的,效率低下不说,既不能发现代码缺失错误,也容易造成忽略程序设计功能这个测试的根本依据。

白盒方法的价值在于衡量对既有代码的测试完整性,也可以根据白盒覆盖找出遗漏的用例,这些价值也是建立在用例是基于功能来设计、设定了必要的预期输出的基础上的。

所以,正确的方法应该是:首先根据功能来设计用例,并将数据集中起来,从“有哪些正常输入?有哪些边界输入?有哪些非法输入”三个角度检查完整性,这样可以有效发现代码缺失错误。然后,再统计白盒覆盖,根据未覆盖的逻辑单位,找出遗漏用例,实现高覆盖,新加的用例也要根据设计功能设定必要的预期输出。这样做,即避免了掉入“跟着代码走”的陷阱,白盒方法也不用起头做起,效率高得多。

下面我楼主提供的代码演示一下:

首先根据设计功能:计算某一年是否为润年,设计了几个用例:

这里输入只有一个参数,表格中容易检查,对于多个输入的代码来说,应该把数据进一步集中检查,除了检查每个参数或其他输入的取值,必要时还要检查这些值的组合:

接下来,再查看白盒覆盖率,代码中,红色带背景的语句未覆盖,[F]表示条件的取假值未覆盖,[T]表示取真值未覆盖,[M]表示MC/DC未覆盖;逻辑结构图中,红色的分支未覆盖,未覆盖路径用红色画出。

然后,选中未覆盖的语句,使用用例设计器,找出对应的遗漏用例,根据提示,year%4==0,这是不能破坏的,year%100!=0,这是我们要满足的,那么,把year的值改为1996(当然也可以是满足条件的其他值)OK了:

执行测试后,所有覆盖都已完成,包括:语句覆盖、分支覆盖、路径覆盖、条件覆盖、判定条件覆盖(C/DC)、修正判定条件覆盖(MC/DC)。

这比纯粹从白盒角度来设计用例效率高多了吧?重要的是,避免了“跟着代码走”陷阱。以上用的是Visual Unit 2.6,用别的工具,或者不用工具,道理也是一样的。