-
1 电子教材
-
2 PPT
逻辑驱动覆盖测试是传统的白盒测试方法,主要是针对程序的内部逻辑结构设计测试用例的技术,它通过运行测试用例达到逻辑覆盖的目的。
包括以下6种类型的逻辑覆盖:
Ø 语句覆盖
Ø 判定覆盖
Ø 条件覆盖
Ø 判定一条件覆盖
Ø 条件组合覆盖
Ø 路径覆盖
接下来以下面的函数为例进行介绍:
void DoWork(int x,int y,int z)
{
int k=0, j =0;
if ((x>3) && (z<10) ) {
k=x*y-1;
j=sqrt(k) ;
}
if((x==4) || (y>S)) {
j=x*y+10;
}
j=j%3;
}
函数的流程图如图17-1所示。

图17-1 例子流程图
为了做简略说明,分别对各个判断的取真、取假分支编号为b、c、d、e。
提示:绘制流程图是软件测试中比较常用的方法,该流程图可以辅助分析和设计测试用例。
对于比较复杂的模块,采用绘制流程图的方法更加便于解决问题。
语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。
根据概念,为了对上面的函数进行语句覆盖,只要设计一个测试用例就可以覆盖3个执行语句块中的语句。
针对程序的判断语旬,可在入口处设计测试用例。
测试用例输入为:{x=4、y=5、z=5},
程序执行的路径是:abd。
如果程序只运行上面的测试用例,虽然可以执行模块中的所有语句,但并不能检查判断逻辑是否有问题。例如在第一个判断中错误地把&&写成了||,则上面的测试用例仍可以覆盖所有的执行语句。可以说语句覆盖率是最弱的逻辑覆盖准则。
判定覆盖(也称为分支覆盖),设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少各执行一次。
根据上面的定义,对于上面的程序,只要设计两个测试用例则可以满足条件覆盖的要求。
测试用例的输入为:{x=4、y=5、z=5}
{x=2、y=5、z=5}
上面的两个测试用例虽然能够满足条件覆盖的要求,但是也不能对判断条件进行检查。例如把第二个条件y>5错误地写成y<5,上面的测试用例同样满足了分支覆盖。
设计足够多的测试用例,运行所测程序,使程序中每个判断内的每个条件的各个可能取值至少执行一次。
为了清楚地设计测试用例,对例子中的所有条件取值加以标记。
例如:
对于第一个判断:条件x>3,取真值为T1,假值为-T1。
条件z<10,取真值为T2,假值为-T2。
对于第二个判断:条件x=4,取真值为T3,假值为-T3。
条件y>5,取真值为T4,假值为-T4。
则可以设计测试用例如表17-1所示。
表17-1 测试用例(1)
测试用例 | 通过路径 | 条件取值 | 覆盖分支 |
x=4、y=5、z=5 | abd | T1、T2、T3、-T4 | bd |
x=2、y=5、z=5 | ace | -T1、T2、-T3、-T4 | ce |
x=4、y=5、z=15 | acd | T1、-T2、T3、T4 | cd |
表17-1所示的测试用例不但覆盖了所有分支的真假两个分支,而且覆盖了判断中的所有条件的可能值。但是如果设计了表17-2的测试用例,则虽然满足了条件覆盖,但只覆盖了第一个条件的取假分支和第二个条件的取真分支,并不满足分支覆盖的要求。
表17-2 测试用例(2)
测试用例 | 通过路径 | 条件取值 | 覆盖分支 |
x=2、y=6、z=5 | acd | -T1、T2、-T3、T4 | cd |
x=4、y=5、z=5 | acd | T1、-T2、T3、-T4 | cd |
设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件所有可能取值至少执行一次,并且每个可能的判断结果也至少执行一次,换句话说,即要求各个判断的所有可能条件取值组合至少执行一次。
根据定义只需设计表17-3中的两个测试用例便可以覆盖8个条件值以及4个判断分支。
表17-3 测试用例(3)
测试用例 | 通过路径 | 条件取值 | 覆盖分支 |
x=4、y=6、z=5 | abd | T1、T2、T3、T4 | bd |
x=2、y=5、z=11 | ace | -T1、-T2、-T3、-T4 | ce |
判定条件覆盖从表面来看,它测试了所有条件的取值,但是实际上某些条件掩盖了另一些条件。
例如,对于条件表达式(x>3)&&(z<10)来说,必须两个条件都满足才能确定表达式为真。如果(x>3)为假,则一般不再判断是否z<10了。对于第二个表达式(x==4) || (y>5)来说,若x==4测试结果为真,就认为表达式的结果为真,这时不再检查(y>5)条件了。因此,采用分支条件覆盖,逻辑表达式中的条件结合错误不一定能够查出来。
设计足够多的测试用例,运行所测程序,使程序中每个判断的所有可能条件取值组合至少执行一次。
现在对例子中的各个判断条件取值组合加以标记如下:
x>3,z<10 记做T1 T2,第一个判断的取真分支。
x>3,z>=10 记做T1 -T2,第一个判断的取假分支。
<=3,z<0 记做-T1 T2,第一个判断的取假分支。
x<=3,z>=10 记做-T1 -T2,第一个判断的取假分支。
x=4,y>5 记做T3 T4,第二个判断的取真分支。
x=4,y<=5 记做T3 -T4,第二个判断的取真分支。
x!=4,y>5 记做-T3 T4,第二个判断的取真分支。
x!=4,y<=5 记做-T3 -T4,第二个判断的取真分支。
根据定义取4个测试用例,就可以覆盖上面8种条件取值的组合。测试用例如表17-4所示。
表17-4 测试用例(4)
测试用例 | 通过路径 | 覆盖条件 | 覆盖组合号 |
x=4、y=6、z=5 | abd | T1、T2、T3、T4 | 1和5 |
x=4、y=5、z=15 | acd | T1、-T2、T3、-T4 | 2和6 |
x=2、y=6、z=5 | acd | -T1、T2、-T3、T4 | 3和7 |
x=2、y=6、z=15 | ace | -T1、-T2、-T3、-T4 | 4和8 |
上面的测试用例覆盖了所有条件可能取值的组合,覆盖了所有判断的可取分支,但是却丢失了一条路径,而且需要设计较多的测试用例。
路径测试就是设计足够多的测试用例,覆盖被测试对象中的所有可能路径。
在表17-4所示的测试用例中再添加一个测试用例则可对程序进行全部的路径覆盖,如表17-5所示。
表17-5测试用例(5)
测试用例 | 通过路径 | 覆盖条件 |
x=4、y=6、z=5 | abd | T1、T2、T3、T4 |
x=4、y=5、z=15 | acd | T1、-T2、T3、-T4 |
x=2、y=6、z=15 | ace | -T1、-T2、-T3、-T4 |
x=5、y=6、z=5 | ace | -T1、-T2、-T3、-T4 |

