白盒測试
概念:依照程序内部的结构測试程序,通过測试来检測产品内部动作是否依照设计规格说明书的规定正常进行。检验程序中的每条通路是否都能按预定要求正确工作。
分类:白盒測试是基于覆盖的測试。尽可能覆盖程序的结构特性和逻辑路径。所以其详细方法有逻辑覆盖、循环覆盖、基本路径覆盖。逻辑覆盖又可进一步分为语句覆盖、判定(分支)覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖等。
白盒測试主要用于单元測试(我们须要了解程序源代码和结构,并且基于输入输出。适合单元模块)。以下重点介绍经常使用的几种白盒測试方法。
语句覆盖:
定义:仅仅要求覆盖到全部可运行语句(每一个可运行语句至少运行一次),不关注推断运算,确保可运行语句处没有错误。
样例:
依照白盒,我们仅仅需覆盖到全部可运行语句就可以。而为此我们仅仅需用測试用例(X=1。Y=4,Z=9)。这样三句话都会打印出来。
但假设编码时将X=1 AND Y>3错误写成X=1 OR Y>3。尽管我们的測试用例能够覆盖到全部可运行语句,并且证明可运行语句无误。但因此我们的password系统面临巨大风险。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条的原则)。
希望知道的朋友留下评论:)