白盒测试
概念:按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。
分类:白盒测试是基于覆盖的测试,尽可能覆盖程序的结构特性和逻辑路径,所以其具体方法有逻辑覆盖、循环覆盖、基本路径覆盖。逻辑覆盖又可进一步分为语句覆盖、判定(分支)覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖等。白盒测试主要用于单元测试(我们需要了解程序源码和结构,而且基于输入输出,适合单元模块)。下面重点介绍常用的几种白盒测试方法。
语句覆盖:
定义:只要求覆盖到所有可执行语句(每个可执行语句至少运行一次),不关注判断运算,确保可执行语句处没有错误。
例子:
按照白盒,我们只需覆盖到所有可执行语句即可,而为此我们只需用测试用例(X=1,Y=4,Z=9)。这样三句话都会打印出来。但如果编码时将X=1 AND Y>3错误写成X=1 OR Y>3,虽然我们的测试用例可以覆盖到所有可执行语句,而且证明可执行语句无误,但因此我们的密码系统面临巨大风险,Y只要大于3就能攻破第一道防线。而我们对此浑然不知。所以语句覆盖不能满足我们的需求(有人说它是最弱的逻辑覆盖准则)。
判定(分支)覆盖:
定义:每个判断的取真分支和取假分支至少经历一次。弥补语句覆盖对判断逻辑的不足。
例子:同上。
- (X=1,Y=4,Z=9)—— 通过路径T->T
- (X=0,Y=4,Z=0)—— 通过路径F->F
上面两个测试用例,将两个判断条件的真假值都遍历了,是执行判定覆盖的最少测试用例。这样当将X=1 AND Y>3误写成X=1 OR Y>3时,第二个测试用例就能发现错误。但如果选择的测试用例是(X=0,Y=0,Z=0)还是不能发现错误。试试下面的覆盖。
条件覆盖:
定义:使每个判断中每个条件的真假至少满足一次。
例子:同上。
第一个判断中有两个条件X=1和Y>3,第二个判断中有一个条件Z=9。
- (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真
- (X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假
也是两个测试用例即可。这种覆盖有两个问题:
- 任然不能解决那个OR问题
- 如果选择的测试用例是(X=1,Y=2,Z=9)和(X=0,Y=4,Z=0),虽然符合条件覆盖,但第一个判断只执行了假分支,这会遗漏逻辑错误。
判定——条件覆盖:
定义:是判定覆盖和条件覆盖的结合。保证每个判断中每个条件的真假至少满足一次,同时每个判断的取真分支和取假分支至少经历一次。
例子:同上。
- (X=1,Y=4,Z=9)
- (X=0,Y=0,Z=0)
这样既让每个判断的真假分支都取到,也让每个判断中每个条件的真假也都取到。但这同样解决不了OR问题——当AND误写为OR时,两个用例的执行路径不变,所以仅凭这两个用例是无法察觉错误的。
条件组合覆盖:
定义:对于每个判断,组合其中的条件的真假值(假如这个判断中由两个条件组成,那么应设计T1T2、T1F2、F1T2、F1F2这样的组合),并让每个判断的真假值都取到。
例子:同上。
- (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真——覆盖路径:T-T
- (X=1,Y=0,Z=0)—— X=1真,Y>3假,Z=9假——覆盖路径:F-F
- (X=0,Y=4,Z=9)—— X=1假,Y>3真,Z=9真——覆盖路径:F-T
- (X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假——覆盖路径:F-F
当OR问题出现时,上述第二、三个用例的路径就会发生改变,察觉到错误。这样便解决了OR问题,因为第一个判断中条件真假的组合中一真一假的组合是区分AND和OR的根本手段。虽然OR问题解决了,但我们发现有一条路径没有覆盖到——T-F。
路径覆盖:
定义:覆盖所有可能执行的路径。
例子:同上。
让我们在条件组合覆盖用例的基础上修改第二个用例。
- (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真——覆盖路径:T-T
- (X=1,Y=4,Z=0)—— X=1真,Y>3真,Z=9假——覆盖路径:T-F
- (X=0,Y=4,Z=9)—— X=1假,Y>3真,Z=9真——覆盖路径:F-T
- (X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假——覆盖路径:F-F
虽然路径都覆盖了,但路径覆盖没有覆盖所有的条件组合。
总结:
可见没有一种覆盖能完全覆盖所有的测试用例。因此,在实际的测试用例设计中,往往将多种覆盖进行组合,达到最高的覆盖率。像本例中,最终测试用例是在在条件组合覆盖的基础上补上路径覆盖所涉及的。
- (X=1,Y=4,Z=9)—— X=1真,Y>3真,Z=9真——覆盖路径:T-T
- (X=1,Y=0,Z=0)—— X=1真,Y>3假,Z=9假——覆盖路径:F-F
- (X=0,Y=4,Z=9)—— X=1假,Y>3真,Z=9真——覆盖路径:F-T
- (X=0,Y=0,Z=0)—— X=1假,Y>3假,Z=9假——覆盖路径:F-F
- (X=1,Y=4,Z=0)—— X=1真,Y>3真,Z=9假——覆盖路径:T-F
补:
基本路径测试法:
(1)程序流程图
上述例子的流程图为:
(2)计算程序环路复杂度。
- V(G) = 区域数目。区域是由边界和节点包围起来的形状所构成,计算区域时包括图的外部区域,将其作为一个区域。所以上图有3个区域,也就是有3条基本路径。
- V(G) = 边界数目-节点数目+2。这样V(G) = 6 - 5 + 2 = 3。
- V(G) = 判断节点数目 + 1。上图的判断节点是A和C,所以V(G) = 2 + 1 = 3——一般用它作为圈的复杂度,而圈复杂度是路径数的上限,下面就来看一看基本路径是哪些。
(3)确定基本路径。
上图所示的程序有3条基本路径,下面是一组基本路径:
- A-C-end
- A-B-C-end
- A-B-C-D-end
?基本路径是什么,3条基本路径是如何得出的(为什么有3条,选择这3条的原则)。希望知道的朋友留下评论:)
软件测试基本方法(二)之白盒测试,布布扣,bubuko.com