白盒测试的测试方法有:
代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。
白盒测试法的覆盖标准有:
逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。
六种覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖
发现错误的能力呈由弱至强的变化。语句覆盖每条语句至少执行一次。判定覆盖每个判定的每个分支至少执行一次。条件覆盖每个判定的每个条件应取到各种可能的值。判定/条件覆盖同时满足判定覆盖条件覆盖。条件组合覆盖每个判定中各条件的每一种组合至少出现一次。路径覆盖使程序中每一条可能的路径至少执行一次。
"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。
第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。
第二,穷举路径测试不可能查出程序中因遗漏路径而出错。
第三,穷举路径测试可能发现不了一些与数据相关的错误。
.基本路径测试法是:
在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。
在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。
包括以下4个步骤和一个工具方法:
程序的控制流图:描述程序控制流的一种图示方法。
程序圈复杂度:McCabe复杂性度量。从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。
导出测试用例:根据圈复杂度和程序结构设计用例数据输入和预期结果。
准备测试用例:确保基本路径集中的每一条路径的执行。
基本路径测试法的步骤:
第一步:画出控制流图 流程图用来描述程序控制结构。
第二步:计算圈复杂度
圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。独立路径必须包含一条在定义之前不曾用到的边。
有以下三种方法计算圈复杂度:
流图中区域的数量对应于环型的复杂性; 给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量; 给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。
第三步:导出测试用例
根据上面的计算方法,可得出四个独立的路径。(一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。V(G)值正好等于该程序的独立路径的条数。) 路径1:4-14 路径2:4-6-7-14 路径3:4-6-8-10-13-4-14 路径4:4-6-8-11-13-4-14 根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径。
{x=3, y=3}可以执行到语句块1和语句块4,所走的路径:a-b-e-f
{x=-3, y=0}可以执行到语句块2、语句块3和语句块4,所走的路径:a-c-d-f
这样,通过两个测试用例即达到了语句覆盖的标准,当然,测试用例(测试用例组)并不是唯一的。
3、测试的充分性:
假设第一个判断语句if(x>0 && y>0)中的“&&”被程序员错误地写成了“||”,即if(x>0 || y>0),使用上面设计出来的一组测试用例来进行测试,仍然可以达到100%的语句覆盖,所以语句覆盖无法发现上述的逻辑错误。
在六种逻辑覆盖标准中,语句覆盖标准是最弱的。
二、判断覆盖(分支覆盖)
1、概念:
设计足够多的测试用例,使得被测试程序中的每个判断的“真”、“假”分支至少被执行一次。在本例中共有两个判断if(x>0 && y>0)(记为P1)和if(magic < 0)(记为P2)。
2、测试用例:
数据 |
P1 |
P2 |
路径 |
{x=3, y=3} |
T |
F |
a-b-e-f |
{x=-3, y=0} |
F |
T |
a-c-d-f |
两个判断的取真、假分支都已经被执行过,所以满足了判断覆盖的标准。
3、测试的充分性:
假设第一个判断语句if(x>0 && y>0)中的“&&”被程序员错误地写成了“||”,即if(x>0 || y>0),使用上面设计出来的一组测试用例来进行测试,仍然可以达到100%的判定覆盖,所以判定覆盖也无法发现上述的逻辑错误。
跟语句覆盖相比:由于可执行语句要不就在判定的真分支,要不就在假分支上,所以,只要满足了判定覆盖标准就一定满足语句覆盖标准,反之则不然。因此,判定覆盖比语句覆盖更强。
三、条件覆盖
1、概念:
设计足够多的测试用例,使得被测试程序中的每个判断语句中的每个逻辑条件的可能值至少被满足一次。
也可以描述成:
设计足够多的测试用例,使得被测试程序中的每个逻辑条件的可能值至少被满足一次。
在本例中有两个判断if(x>0 && y>0)(记为P1)和if(magic < 0)(记为P2),共计三个条件x>0(记为C1)、y>0(记为C2)和magic<0(记为C3)。
2、测试用例:
数据 |
C1 |
C2 |
C3 |
P1 |
P2 |
路径 |
{x=3, y=3} |
T |
T |
T |
T |
F |
a-b-e-f |
{x=-3, y=0} |
F |
F |
F |
F |
T |
a-c-d-f |
三个条件的各种可能取值都满足了一次,因此,达到了100%条件覆盖的标准。
3、测试的充分性:
上面的测试用例同时也到达了100%判定覆盖的标准,但并不能保证达到100%条件覆盖标准的测试用例(组)都能到达100%的判定覆盖标准,看下面的例子:
数据 |
C1 |
C2 |
C3 |
P1 |
P2 |
路径 |
{x=3, y=0} |
T |
F |
T |
F |
F |
a-c-e-f |
{x=-3, y=5} |
F |
T |
F |
F |
F |
a-c-e-f |
既然条件覆盖标准不能100%达到判定覆盖的标准,也就不一定能够达到100%的语句覆盖标准了。
四、判定-条件覆盖(分支-条件覆盖)
1、概念:
设计足够多的测试用例,使得被测试程序中的每个判断本身的判定结果(真假)至少满足一次,同时,每个逻辑条件的可能值也至少被满足一次。即同时满足100%判定覆盖和100%条件覆盖的标准。
2、测试用例:
数据 |
C1 |
C2 |
C3 |
P1 |
P2 |
路径 |
{x=3, y=3} |
T |
T |
T |
T |
F |
a-b-e-f |
{x=-3, y=0} |
F |
F |
F |
F |
T |
a-c-d-f |
所有条件的可能取值都满足了一次,而且所有的判断本身的判定结果也都满足了一次。
3、测试的充分性:
达到100%判定-条件覆盖标准一定能够达到100%条件覆盖、100%判定覆盖和100%语句覆盖。
五、条件组合覆盖
1、概念:
设计足够多的测试用例,使得被测试程序中的每个判断的所有可能条件取值的组合至少被满足一次。
注意:
a、条件组合只针对同一个判断语句内存在多个条件的情况,让这些条件的取值进行笛卡尔乘积组合。
b、不同的判断语句内的条件取值之间无需组合。
c、对于单条件的判断语句,只需要满足自己的所有取值即可。
2、测试用例:
数据 |
C1 |
C2 |
C3 |
P1 |
P2 |
路径 |
{x=-3, y=0} |
F |
F |
F |
F |
F |
a-c-e-f |
{x=-3, y=2} |
F |
T |
F |
F |
F |
a-c-e-f |
{x=-3, y=0} |
T |
F |
F |
F |
F |
a-c-e-f |
{x=3, y=3} |
T |
T |
T |
T |
T |
a-b-d-f |
C1和C2处于同一判断语句中,它们的所有取值的组合都被满足了一次。
3、测试的充分性:
100%满足条件组合标准一定满足100%条件覆盖标准和100%判定覆盖标准。
但上面的例子中,只走了两条路径a-c-e-f和a-b-d-f,而本例的程序存在三条路径(a-b-d-f/a-c-d-f/a-c-e-f),还有一条路径是a-b-e-f,是不可能覆盖的路径。
六、路径覆盖
1、概念:
设计足够多的测试用例,使得被测试程序中的每条路径至少被覆盖一次。
2、测试用例:
数据 |
C1 |
C2 |
C3 |
P1 |
P2 |
路径 |
{x=3, y=5} |
T |
T |
T |
T |
T |
a-b-d-f |
{x=0, y=2} |
F |
T |
T |
F |
T |
a-c-d-f |
这条路径不可能 |
|
|
|
|
|
a-b-e-f |
{x=-8, y=3} |
F |
T |
F |
F |
F |
a-c-e-f |
所有可能的路径都满足过一次。
3、测试的充分性:
由上表可见,100%满足路径覆盖,但并不一定能100%满足条件覆盖(C2只取到了真),但一定能100%满足判定覆盖标准(因为路径就是从判断的某条分支走的)
六种逻辑覆盖的强弱关系:
在外面很多的教程都认为这六种逻辑覆盖从弱到强的排列顺序是:
语句覆盖->判定覆盖->条件覆盖->判定-条件覆盖->条件组合覆盖->路径覆盖
但经过上面的分析,它们之间的关系实际上可以用下图表示:
而路径覆盖很难在该图表示出来。