[软件测试][白盒测试][二][学习笔记]
推荐的步骤是先使用黑盒测试方法来设计测试用例,然后视情况需要使用白盒测试方法来设计补充的测试用例
1.白盒测试的方法
- 语句覆盖
- 判定覆盖
- 条件覆盖
- 判定/条件覆盖
- 多重条件覆盖
2.白盒测试的概念
白盒测试又称逻辑驱动的测试,允许我们检查程序的内部结构。这种测试策略对程序的逻辑结构进行检查,从中获取测试数据。关注的是测试用例执行的程度或覆盖程序逻辑结构(源代码)的程度,完全的白盒测试是将程序中每条路径都执行到,然而对一个带有循环的程序来说,完全的路径测试不切合实际。
2.1.逻辑覆盖测试
如果完全从路径测试中跳出来看,有价值的目标就是将程序每条语句至少执行一次。这恰是合理的白盒测试中较弱的准则。如下图1所示:
等价的Java代码如下:
public void foo(int a,int b,int x){
if(A>1&&B==0){
X=X/A;
}
if(A==2||X>1){
X=X+1;
}
}
通过编写单个的测试用例遍历程序路径ace,可以执行每一条语句。也就是说,通过在a处设置A=2,B=0,X=3。但是,这个准则相当不足。也许第一个判断应是OR,而不是AND。如果这样,这个错误就会发现不到。另外,可能第二个判断应写成"X>0",这个错误也不会被发现。语句覆盖这条准则有很大的不足,以至于它没什么用处。
判定覆盖(分支覆盖)
判定覆盖或分支覆盖是强一些的逻辑覆盖逻辑。该准则要求必须编写足够的测试用例,使得每一个判断都至少有一个为真和为假的输出结果。也就是每条分支路径都必须至少遍历一次。分支或判定语句的例子包括switch、do-while和if-else语句。
判定覆盖通常可以满足语句覆盖。由于每条语句要么从分支语句开始,要么从程序入口点开始的某条子路径上,如果每条分支路径都被执行到了,那么每条语句也应该被执行到了。但仍至少三种例外情况:
- 程序中不存在判断
- 程序或子程序/方法有多重入口点。只有从程序的特定入口点进入时,某条特定的语句才能执行到
- 在ON单元(ON-unit)里的语句。遍历每条分支路径并不一定能确保所有的ON单元都能执行到。
判定覆盖要求每个判断都必须有"是"或"否"的结果,并且每个入口点(包括ON单元)都至少被执行一次。
当程序包含多重选择的判断时,判定/分支覆盖准则的定义就必须有所改变。典型的例子包含select(case)语句的Java程序。判定/分支覆盖准则将所有判断的每个可能结果都至少执行一次,以及将程序或子程序的每个入口点都至少执行一次。
以上图1为例,两个涵盖了路径ace和abd,或涵盖了路径acd和abe的测试用例就可以满足判定覆盖的要求。如果选择后一种情况,两个测试用例的输入是A=3,B=0,X=3和A=2,B=1,X=1。
判定覆盖是一种比语句覆盖更强的准则,但仍不足。以上图为例,仅有50%可能性遍历到那条X未发生变化的路径(abd)。如果第二个判断存在错误(把X>1写成X<1),那么前面的两个测试用例都找不出错误。
条件覆盖
比判定覆盖强一些的准则是条件覆盖。在条件覆盖情况下,要编写足够的测试用例以确保将一个判断中的每个条件的所有可能的结果至少执行一次。因为如同判定覆盖情况,并不总是能让每条语句都执行到,因此作为对这条准则的补充就是对程序或子程序,包括ON单元的每一个入口都至少调用一次。
比如,分支语句DO K=0 to 50 WHILE(J+K<QUEST)
包含两种情况:K是否小于或等于50?以及J+K是否小于QUEST?需要针对K<=50,K>50(达到循环最后一次迭代)以及J+K<QUEST,J+K>=QUEST的情况设计测试用例。
图1有四个条件:A>1,B=0,A=2,X>1。需要足够的测试用例,使得在点a处出现A>1,A<=1,B=0,B<>0的情况,在b处出现A=2,A<>2,X>1及X<=1的情况。
但是,如果测试用例为A=1,B=0,X=3
或A=2,B=1,X=1
涵盖了全部的条件结果,却仅覆盖了四个判断结果中的两个(这两个用例都涵盖到了路径abe,而不会执行第一个判断结果为真的路径,以及第二个判断结果为假的路径)。为了解决这种局面需要判定/条件覆盖准则。
判定/条件覆盖
这种准则要求设计出充足的测试用例,将一个判断中的每个条件的所有可能的结果至少至少执行一次,将每个判断的所有可能的结果至少执行一次,将每个入口点都至少执行一次。
判定/条件覆盖准则的一个缺点是尽管看上去所有条件的所有结果似乎都执行到了,但由于有些特定的条件会屏蔽掉其他条件,常常不能全都执行到。下面图2是编译器将图1的程序编译生成机器码的过程。
源程序中的多重条件判断被分解成单个的判断和分支,因为大多数机器都没有执行多重条件判断的单独指令。更为完全的测试覆盖似乎是将每个基本判断的全部可能的结果都执行到,而前两个判定覆盖用例都不能做到。原因是"AND"和"OR"表达式中某些条件的结果可能会屏蔽掉或阻碍其他条件的判断。比如,如果"AND"表达式有个条件为"F"那么不用计算该表达式后续条件。如果"OR"表达式有个条件为"T"也不用计算后续。
因此,条件覆盖或判定/条件覆盖准则不一定会发现逻辑表达式中的错误。
多重条件覆盖
该准则能解决部分这个问题,要求编写足够的测试用例,将每个判定中的所有可能的条件结果的组合,以及所有的入口点都至少执行一次。以图1为例,测试用例必须覆盖以下8个组合:
- A>1,B=0
- A>1,B<>0
- A<=1,B=0
- A<=1,B<>0
- A=2,X>1
- A=2,X<=1
- A<>2,X>1
- A<>2,X<=1
5-8组合表示第二个if语句的值。用4个测试用例就可以覆盖它们。
- A=2,B=0,X=4 覆盖1,5
- A=2,B=1,X=1 覆盖2,6
- A=1,B=0,X=2 覆盖3,7
- A=1,B=1,X=1 覆盖4,8
图1程序有4条不同的路径,需要4个测试用例,但这种情况纯属巧合。事实上,这4个用例也没有覆盖到每条路径,acd遗漏。
总的来说,对于包含每个判断只存在一种条件的程序,最简单的测试准则就是设计出足够数量的测试用例,实现:(1)将每个判断的所有结果都至少执行一次;(2)将所有的程序入口都至少调用一次,以确保全部的语句都至少执行一次。对于包含多重条件判断的程序,最简单的测试准则是设计出足够的测试用例,将每个判断可能的所有条件结果组合,以及所有入口点都至少执行一次。
- 点赞
- 收藏
- 关注作者
评论(0)