type
status
date
slug
summary
tags
category
icon
password
文章前言:本文主要介绍白盒测试中的控制流测试。
一、概念
基于控制流(或基于路径)的测试:以程序图为基础(结点表示语句片断,边表示控制流),通过图论的一些知识完全从程序的结构来定义结构性的测试,而不考虑代码本身的内在关系。
控制流测试 (Control Flow Testing):是一种在考虑测试对象的控制流情况下导出测试用例的测试方法,并且借助于控制流图能评估测试的完整性(覆盖率)。
二、逻辑覆盖

1 语句覆盖
设计若干测试用例,运行被测程序,使程序中每个可执行语句至少执行一次。

只需设计一个测试用例:a=2,b=1,c=6,即达到了语句覆盖。
优点:可以很直观地从源代码得到测试用例,无须细分每条判定表达式。
缺点:语句覆盖是最弱的逻辑覆盖。对程序的逻辑覆盖很少,只关心判定表达式的值,而没有分别测试判定表达式中每个条件取不同值时的情况。
2 判定覆盖(分支覆盖)
设计若干测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假值均曾被满足。(所有的Y和N都走一次)

a=2,b=1 ,c=6可覆盖判断M的Y分支和判断Q的Y分支。
a=-2,b=-1 ,c=-3可覆盖判断M的N分支和判断Q的N分支。
这两组测试用例可覆盖所有判定的真假分支。
优点:判定覆盖具有比语句覆盖更强的测试能力。同样判定覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。
缺点:往往大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。判定覆盖仍是弱的逻辑覆盖。
3 条件覆盖
设计若干测试用例,使程序的每个判定中的每个条件的可能取值至少满足一次。
(所有的条件为T或F都走一次)

测试用例 | 覆盖条件 | 具体取值条件 |
a=2,b=-1,c=-2 | T1, F2, T3, F4 | a>0,b<=0,a>1,c<=1 |
a=-1,b=2,c=3 | F1, T2, F3, T4 | a<=0,b>0,a<=1,c>1 |
我们用条件覆盖设计的思想就是让测试用例能覆盖T1、T2、T3、T4、F1、F2、F3、F4。(数字表示条件,TF表示条件真假,如T1表示条件一a>0为真)
优点:增加了对条件判定情况的测试,增加了测试路径。
缺点:条件覆盖不一定包含判定覆盖。例如,我们刚才设计的用例就没有覆盖判断M的Y分支和判断Q的N分支。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。
4 判定-条件覆盖
设计足够的测试用例,使得:
- 判断条件中的所有条件可能取值至少执行一次。
- 所有判断的可能结果至少执行一次。
(同时满足判定覆盖和条件覆盖)
测试用例 | 覆盖条件 | 覆盖判断 |
a=2,b=1,c=6 | T1, T2,T3, T4 | M的Y分支和Q的Y分支 |
a=-1,b=-2,c=-3 | F1, F2, F3, F4 | M的N分支和Q的N分支 |
优点 :能同时满足判定、条件两种覆盖标准。
缺点 :判定/条件覆盖准则的缺点是未考虑条件的组合情况。
5 条件组合覆盖
设计足够的测试用例,使得所有可能的条件取值组合至少执行一次。
按照条件组合覆盖的基本思想,对于前面的例子,我们把每个判断中的所有条件进行组合,设计组合条件如表所示,而我们设计的测试用例就要包括所有的组合条件。
按照条件组合覆盖的基本思想,对于前面的例子,我们把每个判断中的所有条件进行组合,设计组合条件如表所示,而我们设计的测试用例就要包括所有的组合条件:
编号 | 覆盖条件取值 | 判定条件取值 | 具体条件取值 |
1 | T1,T2 | M取Y | a>0,b>0 |
2 | T1,F2 | M取N | a>0,b<=0 |
3 | F1,T2 | M取N | a<=0,b>0 |
4 | F1,F2 | M取N | a<= 0,b<=0 |
5 | T3,T4 | Q取Y | a>1,c>1 |
6 | T3,F4 | Q取Y | a>1,c<=1 |
7 | F3,T4 | Q取Y | a<=1,c>1 |
8 | F3,F4 | Q取N | a<=1,c<=1 |
测试用例:
测试用例 | 覆盖条件 | 覆盖判断 | 覆盖组合 |
a=2,b=1,c=6 | T1, T2,T3, T4 | M取Y分支,Q取Y分支 | 1,5 |
a=2,b= -1,c= -2 | T1, F2, T3, F4 | M取N分支,Q取Y分支 | 2,6 |
a=-1,b=2,c=3 | F1, T2, F3, T4 | M取N分支,Q取Y分支 | 3,7 |
a= -1,b= -2,c= -3 | F1, F2, F3, F4 | M取N分支,Q取N分支 | 4,8 |
优点:条件组合覆盖准则满足判定覆盖、条件覆盖和判定-条件覆盖准则。
缺点:线性地增加了测试用例的数量。
6 路径覆盖
设计所有的测试用例,来覆盖程序中的所有可能的执行路径。

测试用例 | 覆盖组合 | 覆盖路径 |
a=2,b=1,c=6 | 1,5 | 1-2-4 |
a=1,b=1,c=-3 | 1,8 | 1-2-5 |
a=-1,b=2,c=3 | 4,7 | 1-3-4 |
a=-1,b=-2,c=-3 | 4,8 | 1-3-5 |
优点:这种测试方法可以对程序进行彻底的测试,比前面五种的覆盖面都广。
缺点:需要设计大量、复杂的测试用例,使得工作量呈指数级增长,不见得把所有的条件组合都覆盖。
三、DD路径
1 程序图
程序图是一种有向图,图中的节点表示语句片断,边表示控制流。

有的时候,我们可以把几个节点合并成一个,合并的原则是:若在一个节点序列中没有分支,则我们可以把这个序列的节点都合并成一个节点。

2 前置概念
路径是一系列边,使得对于该序列中的所有相邻边对偶ei、ej来说,第一条边的终止节点是第二条边的初始节点。
环路是一个在同一个节点上开始和结束的(有向)路径。
半路径是一系列边,使得对于该序列中至少有一个相邻边对偶ei、ej来说,第一条边的初始节点是第二条边的初始节点,或第一条边的终止节点是第二条边的终止节点。

有向图中的两个结点ni和nj:
- 0-连接,当且仅当ni和nj之间没有路径
- 1-连接,当且仅当ni和nj之间有一条半路径,但没有路径
- 2-连接,当且仅当ni和nj之间有一条路径
- 3-连接,当且仅当ni和nj之间有一条路径,并且从nj到ni有一条路径

3 DD-路径
DD-路径是程序图中的一条链,使得:
- 情况1:由一个结点组成,indeg=0;
- 情况2:由一个结点组成,outdeg=0;
- 情况3:由一个结点组成,indeg≥2 或 outdeg≥2;
- 情况4:由一个结点组成,indeg=1 并且outdeg=1;
- 情况5:长度≥1的最大链

DD路径覆盖= 判定/分支覆盖。
如果每一条DD-路径都被遍历,则我们知道每个判断分支都被执行,其实就是遍历DD-路径图中每条边。对于if类的 语句,这意味着真、假分支都要覆盖。对于CASE语句,则每个子句都要覆盖。
很多质量机构都把DD-路径覆盖(C1指标)作为测试覆盖的最低可接受级别。
四、基路径测试
1 引入
向量空间的基是相互独立的一组向量,基“覆盖”整个向量空间,使得该空间中的任何其他向量都可以用基向量来表示。
因此,一组基向量在一定程度上可表示整个向量空间的本质:空间中的一切都可以用基表示,并且如果一个基元素被删除了,则这种覆盖特性也会丢失。
基对测试的潜在意义是:如果可以把程序看做是一种向量空间,则这种空间的基就是要测试的非常有意义的元素集合。如果基没有问题,则可以希望能够用基表达的一切都是没有问题的。
- 如果把覆盖的路径数压缩到一定限度内,例如程序中的循环体只执行零次和一次,就成为基路径测试。
- 通过分析程序控制流图的环路的复杂性,导出基本路径集合(独立路径),从而设计测试用例,保证这些路径至少通过一次。
2 相关概念
独立路径
- 独立路径必须包含一条在定义之前不曾用到的边。(每一条新的路径都包含了一条新边)
- 控制流图中所有独立路径的集合就构成了基本路径集。
程序环形复杂性
- 程序的环路复杂性即McCabe复杂性度量,又叫圈复杂度。
- 从程序环路复杂性可导出程序基本路径集合中的独立路径条数。
圈复杂度的计算
- V(G) = e – v + 2
- e:控制流图的边数
- v:控制流图的结点数
- V(G) = 判定结点数+1
- V(G) = 控制流图中有界或无界的封闭区域个数
- V(G) = 控制流图中有界的封闭区域个数+1

- 基本路径测试步骤
- 导出程序的控制流图;
- 计算控制流图的环路复杂度V(G);
- 确定只包含独立路径的基本路径集(一组线性独立路径,个数为V(G));
- 设计测试用例。
五、例题
例题1
分别以语句覆盖、判定覆盖、判定/条件覆盖方法设计测试用例,并写出每个测试用例的执行路径。

例题2
请画出以下程序的DD-路径图,并用路径翻转的方法找出所有基路径,并为每条可行的路径设计测试用例

例题3
请分别选出用语句覆盖,条件覆盖,路径覆盖应用哪组测试用例(请写出设计过程)。

(1)x=0, y=3
(2)x=1,y=2
(3)x= -1,y=2
(4)x=3,y=1

例题4
用基路径测试测以下程序。


有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://Koreyoshi1216.com/article/1aac7b13-c6a7-8044-9561-fa05fb3914aa
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!