逻辑覆盖测试法是常用的一类白盒测试方法,其以程序内部逻辑结构为基础,通过对程序逻辑结构的遍历来实现程序测试的覆盖。逻辑覆盖测试法要求测试人员对程序的逻辑结构有清晰的了解。
逻辑覆盖测试法是一系列测试过程的总称,是使测试过程逐渐进行越来越完整的通路测试。
        从覆盖源程序语句的详尽程度,可以将其分为语句覆盖、判定覆盖、条件覆盖、判断/条件覆盖、条件组合覆盖和路径覆盖等。接下来将通过下面程序的逻辑覆盖测试用例一一介绍这些覆盖准则,该程序的流程图如图 所示,其中,a、b、c、d、e是控制流上的若干程序点。

main()
int a, b;
float x;
scanf(" & d,& d,& f",&a,&b,&x);
if((a>1)and(b=0))
x = x/a;
if((a = 2)or(x>1))
X = x+ 1
prinf("x= & f",x);
}

                                        

一、语句覆盖

        语句覆盖的含义:选择足够多的测试数据,使被测程序中每条语句都被遍历执行到语句覆盖需要涉及若干个测试用侧,然后运行被测程序,使程序中每个可执行语句至少执行一次。针对案例,若程序按照ace执行,则所有的语句都可以得到执行。
        因此,可以选择语句覆盖测试用例如下:


                                                                a=2,b=0,x=3


        这时,程序按照路径ace执行,程序段中的语句均得到执行,从面得到了语句覆盖。如果a=2,b=1,x=3作为用例,则程序只会按照路径abe执行,便无法达到全语句覆盖。
        语句覆盖虽然使得程序中的每个语句都得到了执行,但其并不能全面地检验每一条语句。另外这种覆盖测试并不充分,无法发现程序中某些逻辑运算和逻辑条件的错误。
        本例中第一个逻辑运算符写成了“or”,第二个逻辑运算符写成了“and”,即便使用测试用例a=2,b=0,x=3,程序仍将按照路径ace执行,虽然测试达到了语句覆盖,但是并没有发现程序中的错误
        由此可见,语句覆盖的方法似乎能够比较全面地检验每一条语句,但是语句盖对程序执行逻辑的鉴别能力很低,这是其最严重的缺陷。换言之,仅仅采用语句测试覆盖全部语句,很可能完全没验证到这个流程图的左侧分支。因此一般认为语句覆盖是很弱的逻覆盖

二、判定覆盖

        判定覆盖的含义是:使得程序中的每个判定语句的取值都被遍历到。对于真假双值的判定来说,应通过设计测试用例使判定语句至少获得过取“真"值和取“假"值各一次;对于多值判定来说,例如switch-case结构,设计测试用例就要保证所有的case和default 分支均要取到
        针对以上的案例,通过路径ace和abd或通过路径acd和abe 均可达到判定覆盖标准。其中一种选择的测试用例如表所示。

        两组测试用例不仅满足了判定覆盖,而且还达到了语句覆盖,判定覆盖比语句覆盖的作用更强一些。但是,上例若把x>1错写成x<1,则使用第一组测试用例仍然会按照路径abe执行,也不影响结果。       
        因此,判定覆盖仍然无法确定判断内部条件的错误,无法测试程序中存在的一些缺陷。也就是说,由于程序中的不同分支都是基于判定语句的取值来划分的,判定测试与分支测试是密切相关的当达到判定测试100%覆盖时,所选用的测试用例同样也会达到分支测试覆盖100%,而达到分支测试100%覆盖时,所选用的测试用例同样也达到判定测试覆盖100%,因此二者经常被混为一谈。

三、条件判定

        条件覆盖需要设计若干测试用例,针对前文案例中的第一个判定a>1为真,记为ta>1为假,记为一t1;b=0为真,记为t2;b=0为假,记为一t2。第二个判定:a=2为真记为 t3;a=2为假,记为-t3;x>1为真,记为 t4;x>1为假,记为一t4。此时可选择的测试


        第一组测试用例判定覆盖,也有条件覆盖;第二组测试用例为条件覆盖,但没有判定覆盖。可以注意到,当分支覆盖率达到100%时,所有的语句也必然会全部被覆盖到,因为每个语句都是位于某个条件分支上的。无论是入口主分支还是下面的判定分支由此看来,条件覆盖比语句覆盖的作用要更强一些。

四、判断/条件覆盖

        判断/条件覆盖的含义:是设计足够的测试用例,使得每个判定语句的取值,以及每个判定条件的取值都能被覆盖到。也即,判断/条件覆盖要求设计足够多的测试用例,使判定中每个条件的所有可能(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)至少出现一次。


两组测试用例覆盖了每个条件的真假和每个判定的真假分支,达到了判定/条件覆盖。这种分支条件测试同样存在强度不够的缺陷,代码中的逻辑错误仍可能无法被发现。因此还需要寻找更强的逻辑覆盖标准。

五、条件组合覆盖

        条件组合覆盖要求设计足够的测试用例,使得每个判定语句中的所有判定条件的各种可能组合都至少出现一次。显然,满足分支条件组合测试100%覆盖的用例集,其语句测试、条件测试、判定测试、判定/条件测试的覆盖率也一定是100%。针对本案例的条件组合有如下几种。
        (1)a>1,b=0 记为 tl,t2。
        (2)a>1,b≠0记为 t1,-t2。
        (3)a<1,b=0记为-tl,t2。
        (4)a<1,b≠0记为-tl,-t2.
        (5)a=2,x>1记为 t3,t4。
        (6)a=2,x<1记为 t3,-t4。
        (7)a≠2,x>1记为-t3,t4。
        (8)a≠2,x<1记为-t3,-t4。

六、路径覆盖

        路径覆盖需要涉及足够多的测试用例,要求覆盖程序中所有可能的路径。针对本案例共有4条路径,分别为:路径1(ace),路径2(abd),路径3(abe),路径4(acd),选择的测试用例

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐