2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 白盒测试-覆盖测试(六种覆盖方法)

白盒测试-覆盖测试(六种覆盖方法)

时间:2021-08-22 02:57:41

相关推荐

白盒测试-覆盖测试(六种覆盖方法)

白盒测试-覆盖测试(六种覆盖方法)

测试覆盖率

测试覆盖率:用于确定测试所执行到的覆盖项的百分比。其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、分支、条件等。测试覆盖率可以表示出测试的充分性,在测试分析报告中可以作为量化指标的依据,测试覆盖率越高效果越好。单覆盖率不是目标,只是一种手段。

测试覆盖率包括功能点覆盖率和结构覆盖率。

功能点覆盖率大致用于表示软件已经实现的功能与软件需要实现的功能之间的比例关系。

结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、路径覆盖率等。

逻辑覆盖法

根据覆盖目标的不同,逻辑覆盖又可以分为语句覆盖、判定覆盖、条件覆盖、判定\条件覆盖、组合覆盖和路径覆盖。语句覆盖:选择足够多的测试用例,使得程序中的每个可执行语句至少执行一次。判定覆盖:通过执行足够的测试用例,使得程序中的每个判定至少都获得一次“真”值和“假”值,也就是使程序中的每个取“真”分支和取“假”分支至少均经历一次,也称为“分支覆盖”。条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的可能取值(真/假)都至少满足一次。判定/条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的所有情况(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。----满足判定/条件覆盖的测试用例一定同事满足判定覆盖和条件覆盖。组合覆盖:通过执行足够的测试用例,使得程序中每个判定的所有可能的条件取值组合都至少出现一次。----满足组合覆盖的测试用例一定满足判定覆盖、条件覆盖和判定/条件覆盖。路径覆盖:设计足够多的测试用例,要求覆盖程序中所有可能的路径。

例题:

针对以下代码设计测试用例分别进行语句覆盖、判定覆盖、条件覆盖、判定\条件覆盖、组合覆盖和路径覆盖。

void DoWork(int x, int y, int z) {int k = 0,j = 0;if((x > 3) && (z < 10)) {k = x * y - 1;j = (int) Math.sqrt(k);}if((x == 4) || (y > 5)) {j = x * y + 10;}j = j%3;}

语句覆盖:

要求对DoWork函数进行语句覆盖,只需要设计一个测试用例就可以覆盖程序中所有可执行语句。例如测试用例:x = 4 , y = 5 , z = 5,程序执行的路径为abd

分析:语句覆盖可以保证程序中每个语句都得到执行,但是不能够发现判定中录屏及运算的错误,即它并不是一种充分的检验方法。例如在第一个判定((x>3)&&(z<10))中把&&错误的写成了||,这是该测试用例仍能够使得程序按照路径abd执行,所以语句覆盖是最弱的逻辑覆盖准则。

判定覆盖

要求对DoWork函数进行判断覆盖,需要设计两个测试用例。

测试用例1:x = 4 , y = 5 , z = 5,程序执行的路径为abd;

测试用例2:x = 2 , y = 5 , z = 5,程序执行的路径为ace;

分析:可以看出,这两个测试用例不仅满足了判定覆盖,同时更满足了语句覆盖。虽然确实判定覆盖比语句覆盖更强一些,但是依然无法确定判断条件内部的错误。如果把第二个判定条件的y>5错写成y<5,则以上测试用例依然能够执行不影响结果,因此判定覆盖测试依然不能保证判断条件完全正确。以上的每一种判定只有两种可能的情况,而也有可能出现多出口判断的情况,比如case语句,则一个判定可以有多种可能的结果,而判定覆盖就是就是使得每一个判定获得每一种可能的结果至少一次。

条件覆盖

对于Dowork函数各个判定的各个条件取值加以标记:

x>3 真值为T1,假值为-T1 ; z<10 真值为T2,假值为-T2

x==4 真值为T3,假值为-T3 ; y>5 真值为T4,假值为-T4

要求对DoWork函数进行条件覆盖,即要使上述四个条件可能产生的8种情况至少满足一次,设计以下两条用例:

测试用例1:x = 4 , y = 5 , z = 5,执行路径abd,覆盖条件T1、T2、T3、T4,覆盖分支bd

测试用例2:x = 2 , y = 5 , z = 15,执行路径ace,覆盖条件-T1、-T2、-T3、-T4,覆盖分支ce

分析:在实际程序代码中,一个判定中通常都包含若干条件。条件覆盖的目的是设计若干测试用例,在执行被测程序后,要使每个判定中每个条件的可能值至少满足一次。上面这组测试用例不仅覆盖了4个条件的所有8种情况,而且将两个判定的分支都覆盖到了,所以也达到了判定覆盖。说明:以上测试用例同时满足了判定、条件覆盖,但并不是条件覆盖都能满足判定覆盖。比如以下测试用例:

测试用例3:x = 2 , y = 6 , z = 5 , 执行路径:acd,覆盖条件:-T1、T2、-T3、T4,覆盖分支cd

测试用例4:x = 4 , y = 5 , z = 15,执行路径acd,覆盖条件T1、-T2、T3、-T4,覆盖分支:cd

判定/条件覆盖

依然为DoWork函数哥哥判定哥哥条件取值加以标记;

要求对DoWork函数进行判定/条件覆盖,即要使得测试用例能够覆盖上述四个条件可能产生的8种情况以及4个判定分支,设计测试用例如下:

测试用例1:x = 4 , y = 5 , z = 5,执行路径abd,覆盖条件T1、T2、T3、T4,覆盖分支bd

测试用例2:x = 2 , y = 5 , z = 15,执行路径ace,覆盖条件-T1、-T2、-T3、-T4,覆盖分支ce

分析:看起来判定/条件覆盖测试了每个判定每个条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其他调暗劲所掩盖。所以判定/条件覆盖也不一定能够完全检查出逻辑表达式的错误。例如:第一个判定中使用的是短路与&&,必须要x>3和z<10两个条件都为真,这个判定才能为真,但是如果x>3不成立,系统不会再检查z<10这个条件的真假,那么即使当这个条件设计错误了也不会被发现;同样的,第二个判定中使用的短路或||,表示只要x==4为真,那这个判定的结果就是真,而不会检查y>5这个条件的真假,那么也不会发现这个条件中是否存在错误。

组合覆盖

依然为DoWork函数哥哥判定哥哥条件取值加以标记;

要对DoWork函数进行组合覆盖,即要使设计的测试用例能覆盖每一个判定的所有可能的条件取值组合。设计测试用例如下:

测试用例1:

x = 4 , y = 6 , z = 5,执行路径abd,覆盖条件T1、T2、T3、T4,判定一和判定二都为真;

测试用例2:

x = 4 , y = 5 , z = 15,执行路径acd,覆盖条件T1、-T2、T3、-T4,判定一为假,判定二为真;

测试用例3:

x = 2 , y = 6 , z = 5,执行路径acd,覆盖条件-T1、-T2、-T3、T4,判定一为假,判定二为真;

测试用例4:

x = 2 , y = 5 , z = 15,执行路径ace,覆盖条件-T1、-T2、-T3、-T4,判定一和判定二都为假。

分析:上面的测试用例覆盖了所有的八种条件取值的组合,也覆盖了所有判定的真假分支,但是仍然没有覆盖到abe路径。

路径覆盖

要对DoWork函数进行路径覆盖,即使设计的测试用例能覆盖被测程序中所有可能的的路径。设计测试用例如下:

测试用例1: x = 4 , y = 6 , z = 5,执行路径abd,覆盖条件T1、T2、T3、T4,

测试用例2: x = 4 , y = 5 , z = 15,执行路径acd,覆盖条件T1、-T2、T3、-T4,

测试用例3: x = 2 , y = 5 , z = 15,执行路径ace,覆盖条件-T1、-T2、-T3、-T4,

测试用例4:x = 5 , y = 5 ,z = 5 ,执行路径abe,覆盖条件T1、T2、-T3、-T4。

分析:可以看出,满足路径覆盖不一定能够满足组合覆盖。说明,对于较简单的小程序,实现路径覆盖是可能做到的。但是如果程序中出现较多的判断和较多的循环,可能的路径数目将会急剧增长,要在测试中覆盖所有的路径是无法实现的。为了解决这个难题,只有把覆盖路径数量压缩到一定的限度内,比如程序中的循环体只执行一次。

在实际测试中,即使对于路径数很有限的程序已经做到路径覆盖,仍然不能保证被测试程序的正确性,还需要采用其他测试方法来进行补充。

测试覆盖准则

逻辑覆盖的出发点是合理的、完善的。所谓“覆盖,就是想要做到全面而无遗漏,但逻辑覆盖并不能真正做到无遗漏。

例如:

if(x>3&&z<10) 若不小心写成了if(x>=3&&z<10),按照前面设计的测试用例(x取2或4),逻辑覆盖对这样的问题是无能为力的,而原因就在于:错误区域仅仅在x=3这个点上,即仅当x的值取3时,测试才能发现错误。面对这类情况,我们应该发现的是,测试工作要有中带你,要多针对容易发生问题的地方设计测试用例。而这里就用到了测试覆盖中需要遵循的两条准则:ESTCA准则、LCSAJ准则。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。