结构化软件测试----白盒测试技术
一、什么是白盒测试呢?
白盒测试是指有选择地执行(或覆盖)程序中某些最有代表性路径的测试方法,所以也称为逻辑覆盖测试。
二、白盒测试有那几类呢?
(一)逻辑覆盖:语句覆盖;判定覆盖;条件覆盖; 判定/条件覆盖;条件组合覆盖
1.语句覆盖:选择足够的测试用例,使得程序中每个语句至少都能执行一次
2. 判定覆盖:执行足够的测试用例,使得程序中每个判定至少都获得一次“真”值和“假”值,即使得程序中的每一个分支至少都通过一次
3. 条件覆盖:执行足够的测试用例,使得判定中每个条件获得各种可能的结果
4. 判定/条件覆盖:执行足够的测试用例,同时满足判定覆盖和条件覆盖的要求
5.条件组合覆盖:执行足够的测试用例,使得每个判定中条件的各种可能组合都至少执行一次
下面通过一个经典例子说明这些逻辑覆盖:
Procedure Example(Var A, B, x :real)
begin
if(A>1)and(B=0)
then x:=x/A;
if(A=2)or(x>1)
then x:=x+l
end;
1.语句覆盖:选择足够的测试用例,使得程序中每个语句至少都能执行一次
选择输入数据为:A=2,B=0,x=3 (沿路径ace执行)
若程序误把if(A>1)and(B=0)中的and写成or,该测试不能发现错误,所以,一般认为“语句覆盖”是不充分的最低的一种覆盖标准。
2. 判定覆盖:执行足够的测试用例,使得程序中每个判定至少都获得一次“真”值和“假”值,即使得程序中的每一个分支至少都通过一次
选择输入数据:(1)A=3,B=0,x=l(沿路径acd执行)
(2)A=2,B=1,x=3(沿路径abe执行)
若程序误把if(A>1)and(B=0)中的and写成or,该测试能够发现错误,但是不满足判定覆盖,第一个判定永远只能取真。若上述(2)改成A=1,B=1,x=3,该测试不能发现错误。
3. 条件覆盖:执行足够的测试用例,使得判定中每个条件获得各种可能的结果
四个条件A>1,B=0,A=2,x>1
(1)A=2,B=0,x=4(沿路径ace执行)
(2)A=1,B=l,x=l(沿路径abd执行)
虽然同样只用两个测试用例,但它比判定覆盖中的两个测试用例更有效。一般来说,“条件覆盖”比“判定覆盖”强,但是,并不总是如此。
若选择另外一组测试数据:
(1)A=1,B=0,x=3(沿路径abe执行)
(2)A=2,B=l,x=l(沿路径abe执行)
满足条件覆盖,但不满足判定覆盖,也不满足语句覆盖
4. 判定/条件覆盖:执行足够的测试用例,同时满足判定覆盖和条件覆盖的要求
四个条件A>1,B=0,A=2,x>1
(1)A=2,B=0,x=4(沿路径ace执行)
(2)A=1,B=l,x=l (沿路径abd执行)
若程序误把if(A>1)and(B=0) 中的 and写成or,该测试不能发现错误。
若程序误把if(A=2) or x>1 中的x>1写成x<1,该测试也不能发现错误。
值得提出的是,尽管“判定/条件覆盖”看起来能使各种条件取到所有可能的值,但实际上并不一定能检查到这样的程度。
5.条件组合覆盖:执行足够的测试用例,使得每个判定中条件的各种可能组合都至少执行一次
八种组合结果
(1)A>1,B=0 (5)A=2,x>1
(2)A>1,B ≠ 0 (6)A=2,x ≤ 1
(3)A ≤ l,B=0 (7)A ≠ 2,x>1
(4)A ≤ 1,B ≠ 0 (8)A ≠ 2,x ≤ 1
四种测试用例来覆盖
(1)A=2,B=0,x=4 ((1)(5) ace)
(2)A=2,B=1,x=1 ((2)(6) abe)
(3)A=1,B=0,x=2 ((3)(7)abe)
(4)A=1,B=1,x=1 ((4)(8)abd) 但是呢,路径acd未覆盖!
所以以上的几种测试不能够彻底反映测试的准确性。
(二)路径覆盖
基本路径测试法是根据程序的控制流路径设计测试用例的一种最基本的白盒测试技术
考察测试路径的有用工具:程序控制流图(注意:程序控制流图与结构化概要详细设计时的流程图是不一样的哦)
任何过程设计描述方法(如PDL、流程图、N-S图、PAD图等)都可以映射到一个相应的程序控制流图描述,其映射要点为:
1. 一个或多个顺序语句可映射为程序图的一个节点,用带标识的圆表示。
2. 一个处理框序列和一个判别框可映射为程序图的一个节点。
3.程序控制流向可映射为程序控制流图的边(或称为连接),用方向箭头表示(类似于流程图中的方向箭头)。一条边必须终止于一个节点,即使该节点不代表任何语句。
4. 边和节点限定的范围称为区域(区域应包括图形外部的范围)。
举例:
注意:在选择或多分支结构中,分支的汇聚处应有一个汇聚节点。
一条边必须终止于一个节点。
图形外的区域也应记为一个区域。
注意:若判断中的逻辑表达式是复合条件,应分解为一系列只有单个条件的嵌套判断。(譬如:下面的程序对应的程序控制流图)
程序图的环形复杂度 :
环形复杂性是一种以图论为基础的,为程序逻辑复杂性提供定量测度的软件度量
环形复杂性能导出程序基本路径集合中的独立路径条数,是保证程序中每个可执行语句至少执行一次,每个条件的真假分支都能得到测试的数目上界。
三种方法
V(G)等于程序图G的区域数。
V(G)= E﹣N + 2,E是程序图G的边数,N是程序图G的节点数。
V(G)= P + l,P是程序图G中判定的节点数 (ps:小编当时也消化了好久,下面我们 通过例子来分析一下吧,注意呦:这里的E,N,P,是程序图上的)
V(G)等于程序图G的区域数。例:V(G) = 4
V(G)= E﹣N + 2。 例:V(G) = 11-9+2
V(G)= P + l 。 例:V(G) = 3+1。
那什么是独立路径呢
独立路径是指程序中至少引进一个新的处理语句集合,或一个新条件的任何一条路径。
从程序控制流图来看,一条独立路径至少要包含一条在已定义路径中不曾用到的边。
基本路径集:
路径1:1-11;
路径2:1-2-3-4-5-10-1-11;
路径3:1-2-3-6-8-9-10-1-11;
路径4:1-2-3-6-7-9-10-1-11;
看到这里有没有倍感清晰了呢,接下来来练练手吧
基本路径测试步骤:
确定环形复杂性度量V(G),即确定独立路径数目;
确定基本路径集合,即所有的独立路径;
为每条独立路径设计测试用例。
例题:输入学生成绩,最多输入50个值(以-1作为输入结束标志),计算其中有效的学生分数的个数、总分数和平均值。
1.画控制流图(可以和这个不同哦)
2.确定v(G)
1)V(G)= 6 (个区域)
2)V(G)=E–N+2=16–12+2=6
其中E为流图中的边数,N为结点数;
3)V(G)=P+1=5+1=6
其中P为谓词结点的个数。
3.确定基本路径集合
路径1:1-2-9-10-12
路径2:1-2-9-11-12
路径3:1-2-3-9-10-12
路径4:1-2-3-4-5-8-2…
路径5:1-2-3-4-5-6-8-2…
路径6:1-2-3-4-5-6-7-8-2…
4.为每条独立路径设计测试用例
1)路径1(1-2-9-10-12)的测试用例
score[k]=有效分数值,当k < i ; score[i]=–1, 2≤i≤50;
期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。
2)路径2(1-2-9-11-12)的测试用例
score[ 1 ]= – 1 ;
期望的结果:average = – 1 ,其他量保持初值。
3)路径3(1-2-3-9-10-12)的测试用例
输入50个分数,即n2=50;前面至少输入一个有效分数;
期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average。
4)路径4(1-2-3-4-5-8-2…)的测试用例
score[i] ≤ 0 且score[i] != -1。1≤i<50 ;
score[k]=有效分数。i<k<=50;
期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average
5)路径5的测试用例
score[i]>=100, 1≤i<50;
score[k]=有效分数。i<k<=50;
期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average
6)路径6(1-2-3-4-5-6-7-8-2…)的测试用例
score[i]=有效分数, 1≤i≤50;
期望结果:根据输入的有效分数算出正确的分数个数n1、总分sum和平均分average
(三)循环测试:简单循环;串接循环;嵌套循环;无结构循环
简单循环:
零次循环:从循环入口直接跳到循环出口。
一次循环:查找循环初始值方面的错误。
二次循环:检查在多次循环时才能暴露的错误。
m次循环:此时m<n,也是检查在多次循环时才能暴露的错误。
n(最大)次数循环、n+1(比最大次数多一)次的循环、n-1(比最大次数少一)次的循环。
嵌套循环:
从最内层循环开始,设置所有其他层的循环为最小值;
对最内层循环做简单循环的全部测试。测试时保持所有外层循环的循环变量为最小值。另外,对越界值和非法值做类似的测试。
逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套内层循环的循环变量取“典型”值。
反复进行,直到所有各层循环测试完毕。
对全部各层循环同时取最小循环次数,或者同时取最大循环次数。对于后一种测试,由于测试量太大,需人为指定最大循环次数
串接循环:
如果各个循环互相独立,则串接循环可以用与简单循环相同的方法进行测试。
如果有两个循环处于串接状态,而前一个循环的循环变量的值是后一个循环的初值。则这几个循环不是互相独立的,则需要使用测试嵌套循环的办法来处理
白盒测试基本总结完毕,我们下期再见(*^_^*)