基本概念

白盒测试(white-box testing,又称逻辑驱动测试,结构测试)是把测试对象看作一个打开的盒子。利用白盒测试法进行动态测试时,需要测试软件产品的内部结果和处理过程,不需要测试软件产品的功能。

方法分类

测试方法分类说明
逻辑覆盖语句覆盖每条语句至少执行一次
判定覆盖每个判定的每个分支至少执行一次
条件覆盖每个判定的每个条件应取到各种可能的值
判定/条件覆盖同时满足判定覆盖和条件覆盖
条件组合覆盖每个判定中各条件的每一种组合至少出现一次
路径覆盖程序中每一条可能的路径至少执行一次
循环覆盖简单循环
串接循环
嵌套循环
复杂循环
基本路径测试-根据程序流程图简化得控制流图,设计基本路径

设计方法

示例代码

下面我将以这段代码为例(咱们先不管这个举例是否特别合适,能达到目的即可),带领大家一起体验白盒测试的各种方法。如果对java不太了解的童鞋,可以简单的理解为一个条件判断语句:如果满足条件A,c=x/y,否则满足条件B,c=c+1,最后条件都不满足的话,c=y+c。

建议:如果想使得测试思路更加清晰的话,可以自己在脑海里画一个二维坐标,x对应横轴,y对应纵轴。

1
2
3
4
5
6
7
8
9
10
11
12
public static float test(float x, float y) {

float c = 0;
if (x > 0 && y > 0) {
c = x / y;
}
if (x > 1 || y < 5) {
c = c + 1;
}
c = y + c;
return c;
}

语句覆盖

语句覆盖法的基本思想是设计若干测试用例,执行被测程序,使得每个可执行语句至少被执行一次。

  • 如果是顺序结构,就让程序从头执行到尾
  • 如果有分支,条件和循环,利用如下方法,执行足够的测试覆盖全部语句

    设计用例

这里写图片描述

设计一条用例即可达到语句覆盖

x = 2, y = 3

为什么? 因为整个方法体内,代码全部都被覆盖到了。想想是不是?

优缺点

优点

可以直观的从源代码得到测试用例,无需细分每条判定表达式。

缺点

由于这种测试方法仅仅针对程序逻辑中显式存在的语句,但对于隐藏条件是无法测试到的。比如在多分支的逻辑运算中无法全面的考虑。语句覆盖是最弱的逻辑覆盖。

判定覆盖

判定覆盖的基本思想是设计若干测试用例,运行被测程序,使得程序每个判断的取真分支和取假分支至少执行一次,即判断真假值均被满足。

一个判定往往代表程序的一个分支,所以判定覆盖也称为分支覆盖

设计用例

这里写图片描述

根据定义,我们将条件M的yes分支和no分支,条件N的yes分支和no分支覆盖到即可达到覆盖所有判定的真假分支。

用例覆盖点
x=2,y=4覆盖M-yes,N-yes
x=0,y=7覆盖M-no,N-no

优缺点

优点

判定覆盖具有与语句覆盖更强的测试能力。同样判定覆盖具有和语句覆盖一样的简单性,无需细分每个判定就可以得到测试用例。

缺点

往往大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。

条件覆盖

这里写图片描述
条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。
比如:x > 0 && y > 0
需要设计用例覆盖到 x>0为真/假 和 y>0为真/假的情况。

设计用例

判定条件条件取值简称
Mx>0TRUET1
FALSEF1
y>0TRUET2
FALSEF2
Nx>1TRUET3
FALSEF3
y< 5TRUET4
FALSEF4
我们现在需要做的是,用例覆盖到T1,T2,T3,T4,F1,F2,F3,F4
测试用例具体条件覆盖条件
x=2,y=-2x>0,y<=0,x>1,y<5T1,F2,T3,T4
x=-1,y=6x<=0,y>0,x<=1,y>=5F1,T2,F3,F4

优缺点

优点

显然条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。

缺点

要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。

判定-条件覆盖

它是判定覆盖条件覆盖的交集,需要设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。

设计用例

这里写图片描述

设计的用例满足:

  • 覆盖T1-T4 ,F1-F4
  • 覆盖M为真/假,N为真/假
测试用例具体取值条件取值条件判定条件执行路径
x=1,y=5x>0,y>0,x<=1,y>=5T1,T2,F3,F4M=T,N=F1-2-5
x=0,y=0x<=0,y<=0,x<=1,y<5F1,F2,F3,T4M=F,N=T1-3-4
x=2,y=-2x>0,y<=0,x>1,y<5T1,F2,T3,T4M=F,N=T1-3-4

优缺点

优点

判定/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。

缺点

判定/条件覆盖准则的缺点是未考虑条件的组合情况。

条件组合覆盖

要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。

设计用例

按照条件组合覆盖的基本思想,对于前面的例子,我们把每个判断中的所有条件进行组合,设计组合条件如表所示,而我们设计的测试用例就要包括所有的组合条件

组合编号覆盖条件取值判定条件取值判定-条件组合
1T1,T2M=Tx>0,y>0,M为真
2T1,F2M=Fx>0,y<=0.M为假
3F1,T2M=Fx<=0,y>0.M为假
4F1,F2M=Fx<=0,y<=0.M为假
5T3,T4N=Tx>1,y<5. N为真
6T3,F4N=Tx>1,y>=5,N为真
7F3,T4N=Tx<=1,y<5, N为真
8F3,F4N=Fx<=1,y>=5, N为假
测试用例覆盖条件覆盖判断覆盖组合覆盖路径
x=2,y=4T1,T2,T3,T4M=T,N=T1,51-2-4
x=1,y=0T1,F2,F3,T4M=F,N=T2,71-3-4
x=0,y=6F1,T2,F3,F4M=F,N=F3,81-3-5
x=-1,y=-1F1,F2,F3,T4M=F,N=T4,71-3-4
x=4,y=5T1,T2,T3,F4M=F,N=T1,61-2-4

可以看出实际上 1-2-5是未被覆盖到的。下一个方法会提到。

优缺点

优点

多重条件覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。更改的判定/条件覆盖要求设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身的所有可能结果也至少出现一次。并且每个条件都显示能单独影响判定结果。

缺点

线性地增加了测试用例的数量。

路径覆盖

设计所有的测试用例,用来覆盖程序中的所有可能的执行路径。

设计用例

请结合上一种方法进行分析:

测试用例覆盖条件覆盖判断覆盖组合覆盖路径
x=2,y=4T1,T2,T3,T4M=T,N=T1,51-2-4
x=1,y=0T1,F2,F3,T4M=F,N=T2,71-3-4
x=0,y=6F1,T2,F3,F4M=F,N=F3,81-3-5
x=-1,y=-1F1,F2,F3,T4M=F,N=T4,71-3-4
x=4,y=5T1,T2,T3,F4M=F,N=T1,61-2-4
x=0.5,y=3T1,T2,F3,F4M=T,N=F1,81-2-5

优缺点

优点

可以对程序进行彻底的测试,比前面五种的覆盖面都广

缺点

需要设计大量,复杂的测试用例,使得工作量呈指数级增长,不见得把所有的条件组合都覆盖。