一. 逻辑覆盖测试
逻辑覆盖测试是以程序内部的逻辑结构为基础来设计测试用例的一种技术,根据覆盖的目标不同和覆盖源程序语句的详尽程度差异,可以分为语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖。
1. 语句覆盖
语句覆盖的基本思想是:设计若干测试用例,运行被测试程序,使得程序中每一条可执行语句至少执行一次,这里的“若干”指的是使用测试用例越少越好。
实例1:根据表3-1-1 程序p1源代码和图 3-1-2 程序p1程序流程图,设计可以满足语句覆盖的测试用例。
为了使表3-1-1中源代码中的每一条语句都执行一次,只需要输入下面的测试数据即可。
表3-2-1语句覆盖测试用例表
测试用例 | x | y | z | 覆盖语句 |
T1 | 8 | 3 | 7 | s1,s2,s3,s4,s5 |
运行表中的测试用例T1,程序p1中的语句s1到s6每条语句都被覆盖到,满足语句覆盖的标准。
2. 判定覆盖
语句覆盖可以保证程序中的每个语句都得到执行,但发现不了判定中逻辑运算的错误,即它并不是一种充分的检验方法。例如在实例1中的第一个判定((x>3)&&(z<10))中把“&&”错误的写成了“||”,这时仍使用该测试用例,则程序仍会按照流程图上的路径abd执行。可以说语句覆盖是最弱的逻辑覆盖准则。
判定覆盖的基本思想:设计若干测试用例,使得程序中的每一个判定至少获得一次"真"和一次"假",使得程序流程图中的每一个真假分支至少被执行一次,所以又称为分支覆盖(Branch Coverage)。
实例2:根据表3-1-1 程序p1源代码和图 3-1-2 程序p1程序流程图,设计可以满足判定覆盖的测试用例。
设计测试用例,可以使判定x>3 && z<10和x==4||y>5真值和假值都取一次,具体如下表所示。
表3-2-2判定覆盖测试用例表
测试用例 | x | y | z | 分支覆盖结果 | |
x>3&& z<10 | x==4||y>5 | ||||
T1 | 8 | 3 | 7 | Y | Y |
T2 | -2 | 2 | 12 | N | N |
表中测试用例T1使分支x>3 && z<10和x==4||y>5取值为真,测试用例T2使分支x>3 && z<10和x==4||y>5取值为假,用例T1,T2满足判定覆盖准则。
3. 条件覆盖
在实例2中的两个测试用例T1和T2不仅满足了判定覆盖,同时还做到语句覆盖。从这点看似乎判定覆盖比语句覆盖更强一些,但仍然无法确定判定内部条件的错误。例如把第二个判定中的条件y>5错误写为y<5,使用上述测试用例,照样能按原路径执行而不影响结果。因此,需要有更强的逻辑覆盖准则去检验判定内的条件。
条件覆盖的基本思想:设计若干测试用例,使得程序中的每一个判定中的每个条件至少获得一次"真"和一次"假"的值。
实例3:根据表3-1-1 程序p1源代码和图 3-1-2 程序p1程序流程图,设计可以满足判定覆盖的测试用例。
设计测试用例,使判定x>3 && z<10中的两个条件x>3与z<10和判定x==4||y>5中的两个条件x==4与y>5,各种可能的取值至少满足一次,如下表所示。
表 3-2-3条件覆盖测试用例表
测试用例 | x | y | z | 条件覆盖结果 | |||
T1(x>3) | T2(z<10) | T3(x==4) | T4(y>5) | ||||
T1 | 8 | 6 | 7 | Y | Y | Y | Y |
T2 | -2 | 2 | 12 | N | N | N | N |
说明 | x>3真假取值都满足 | z<10真假取值都满足 | x==4真假取值都满足 | y<10真假取值都满足
| |||
表中测试用例T1和T2使得四个条件的真值和假值都至少取一次,满足了条件覆盖准则。
4. 条件判定覆盖
实例3中T1和T2这一组测试用例同时达到了条件覆盖和判定覆盖,但是,并不是说满足条件覆盖就一定能满足判定覆盖。例如下面一组测试用例,虽然满足了条件覆盖,但并不满足判定覆盖的要求。
表 3-2-4条件覆盖测试用例表
测试用例 | x | y | z | 条件覆盖结果 | |||
T1(x>3) | T2(z<10) | T3(x==4) | T4(y>5) | ||||
T1 | 2 | 6 | 5 | N | Y | N | Y |
T2 | 8 | 5 | 15 | Y | N | Y | N |
条件判定覆盖的基本思想:设计若干测试用例,同时满足判定覆盖、条件覆盖两种覆盖准则的逻辑覆盖。
实例4:根据表3-1-1 程序p1源代码和图 3-1-2 程序p1程序流程图,设计可以满足条件判定覆盖的测试用例。
由于判定-条件覆盖是条件覆盖与判定覆盖的组合,因此测试用例取判定覆盖用例和条件覆盖的并集即可。设计测试用例使判定语句x>3 && z<10和x==4||y>5真值和假值全部覆盖到,条件x>3,z<10,x==4,y>5的真值和假值全部覆盖到,具体如下表所示。
表 3-2-5 判定-条件覆盖测试用例表
测试用例 | x | y | z | 判定覆盖结果 | 条件覆盖结果 | ||||
x>3&&z<10 | x==4||y>5 | T1(x>3) | T2(z<10) | T3(x==4) | T4(y>5) | ||||
T1 | 8 | 6 | 7 | Y | Y | Y | Y | Y | Y |
T2 | -2 | 2 | 12 | N | N | N | N | N | N |
说明 | 判定覆盖已满足 | 条件覆盖已满足 | |||||||
5. 条件组合覆盖
从表面上看,判定/条件覆盖测试了各个判定中的所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其它条件所掩盖。因此,判定/条件覆盖也不一定能够完全检查出逻辑表达式中的错误。例如:对于第一个判定(x>3)&&(z<10)来说,必须x>3和z<10这两个条件同时满足才能确定该判定为真。如果x>3为假,则编译器将不再检查z<10这个条件,那么即使这个条件有错也无法被发现。
条件组合覆盖的基本思想:设计若干测试用例,运行被测程序,使程序中的每个条件判定语句中条件取值的各种组合至少出现一次。条件组合只针对同一个判定语句内存在的多个条件情况,让这些条件的取值进行组合,不同的判断语句内的条件取值之间无须组合;对于单条件的判断语句,只需要满足自己的所有取值即可。
实例5:根据表3-1-1 程序p1源代码和图 3-1-2 程序p1程序流程图,设计可以满足条件组合覆盖的测试用例。
罗列所有可能的条件组合,确保每个条件组合至少被测试一次,具体如下表所示。
表 3-2-6条件组合测试用例表
测试用例 | x | y | z | 条件组合覆盖结果 | |||
T1(x>3) | T2(z<10) | T3(x==4) | T4(y>5) | ||||
T1 | 2 | 6 | 5 | N | Y | N | Y |
T2 | 8 | 5 | 15 | Y | N | Y | N |
T3 | 8 | 6 | 7 | Y | Y | Y | Y |
T4 | -2 | 2 | 12 | N | N | N | N |
说明 | 这2个条件进行组合 | 这2个条件进行组合 | |||||
6. 路径覆盖
条件组合覆盖的目的是要使设计的测试用例能覆盖每一个判定的所有可能的条件取值组合,但是有可能会漏掉执行路径。
路径覆盖的基本思想:设计若干测试用例,覆盖程序中所有可能的路径。
二. 基本路径测试
在实际软件系统中,即使是一个不太复杂的程序,其路径的组合都有可能是一个庞大的数字。因此,对程序中的所有路径进行测试需要巨大的资源。基本路径测试较好地解决了这一难题,基本路径测试是由Tom McCabe首先提出的。它是缩小规模的--种路径测试技术,能将路径的组合降到最低数量,并减少重复测试的次数,最终使路径测试真正得到实现。基本路径测试的步骤为:1、以详细设计或源程序为基础,导出程序流程图的拓扑结构——控制流图;2、计算控制流图G的环路复杂性V(G);3、确定只包含独立路径的基本路径集;4、设计测试用例,确保基本路径集合中每条路径的执行。

