【FAQ】白盒与黑盒测试
黑盒测试
不管你里面有什么东西,我输入东西进去程序里面,只看输出的结果是不是我想要的就行。
用于确保程序的输出符合预期,同时检测功能性错误(软件操作,数据结构处理,UI初始化/终止等问题)
白盒测试/透明盒测试
常用的典型代码覆盖标准通常分为下面六种:
语句覆盖
判定覆盖
条件覆盖
判定+条件覆盖
路径覆盖
多条件/组合覆盖
总例子
我们以下面这个例子来了解六种覆盖标准,以T为true,F为false,abcd为判断条件,a and b和c or d为判定过程:
if a and b
then act1
if c or d
then act2
语句覆盖
要求每个语句都要执行一次
从上面例子看,也就是要求act1和act2都要执行一次,那么由此我们可以推断出:
a和b必须为T,就能执行act1
c或者d有一个为T,就执行act2
因此我们可以这样写测试例子就能满足语句覆盖:
test:a=T,b=T,c=T
或者a=T,b=T,d=T
判定覆盖
每个判定过程的结果至少要真和假一次
从例子看,有两个判定过程,一个是a and b,另一个是c or d,因此可以抽象为下面的过程:
① a and b = T --> a=T b=T
② a and b = F --> a=F b=T (a和b有一个是F就行,这里我们以a为F)
③ c or d = T --> c=T或者d=T
④ c or d = F --> c=F d=F
接下来就可以写测试例子来满足判定覆盖了:
test1:a=T b=T c=T d=F -->满足过程①和③
test2:a=T b=F c=F d=F -->满足过程②和④
条件覆盖
每个条件至少要取一次真和假
从例子看,有四个条件,a,b,c,d,因此实现条件覆盖也就是:
a T F
b T F
c T F
d T F
⑤ ⑥
我们简单地理解一下目标,要把每个条件的真和假都取一次,那么我们把全条件为真作为目标⑤,全为假为目⑥
那么我们组合一下就行:
test1:a=T,b=T,c=T,d=T -->满足⑤
test2:a=F,b=F,c=F,d=F -->满足⑥
判定+条件覆盖
其实就是判断覆盖加条件覆盖,也就是要每个判定过程至少要取一次真和假,且每个条件都要取一次真和假
我们直接取上面的六个目标(①到⑥),例子可以这样写:
test1:a=T,b=T,c=T,d=T -->满足⑤,①,③
test2:a=F,b=F,c=F,d=F -->满足⑥,②,④
如此,只需要两个案例就实现了这个覆盖
路径覆盖
把程序流程都走一次,换个说法其实就是判定覆盖
我们为例子做一个流程图:
黑科技:删掉开始和结束相连的两条链路,那么图片就剩下五条链路了,一共四个节点(两个判断两个过程),代入公式:链路数-节点数+2=路径数,比如此处就是:5-4+2=3
看着图片,我们可以梳理出三条路:
路1:开始-->A and B--为T-->Act1---->C or D--为T-->Act2---->结束
路2:开始-->A and B--为F-->C or D--为T-->Act2---->结束
路3:开始-->A and B--为T-->Act1---->C or D--为F-->结束
简单分析:
路1是把全部方法执行了,每个判断过程都是T
路2是跳过了act1,只执行了act2
路3执行了act1,跳过了act2
也就是说我们把每一条连接线走完他就行了,所以例子可以这样写:
test1:A=T,B=T,C=T
test2:A=F,C=T
test3:A=T,B=T,C=F,D=F
如此,我们就实现了路径覆盖
多条件/组合覆盖
每个判定过程中的条件各种可能存在的组合都出现至少一次
我们以例子来说明,看a and b
这个判定过程,他有两个条件:a和b,这两个条件各自又有两种情况,分别是T和F,因此我们可以得出来这个判断过程的多条件组合覆盖是:
a b
T T
T F
F T
F F
同理,把c or d
也放进来,那就是:
a b | c d
T T | T T
T F | T F
F T | F T
F F | F F
那么整个程序的多条件组合覆盖的用例就可以这样写:
test1:a=T,b=T,c=T,d=T
test2:a=T,b=F,c=T,d=F
test3:a=F,b=T,c=F,d=T
test4:a=F,b=F,c=F,d=F
这样四个测试就实现了程序的多条件组合覆盖!