type
status
date
slug
summary
tags
category
icon
password
😀
文章前言:本文主要介绍白盒测试中的控制流测试。
 

一、概念

基于控制流(或基于路径)的测试:以程序图为基础(结点表示语句片断,边表示控制流),通过图论的一些知识完全从程序的结构来定义结构性的测试,而不考虑代码本身的内在关系。
控制流测试 (Control Flow Testing):是一种在考虑测试对象的控制流情况下导出测试用例的测试方法,并且借助于控制流图能评估测试的完整性(覆盖率)。
 

二、逻辑覆盖

notion image

1 语句覆盖

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

2 判定覆盖(分支覆盖)

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

3 条件覆盖

设计若干测试用例,使程序的每个判定中的每个条件的可能取值至少满足一次。
(所有的条件为T或F都走一次)
notion image
测试用例
覆盖条件
具体取值条件
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 路径覆盖

设计所有的测试用例,来覆盖程序中的所有可能的执行路径。
notion image
测试用例
覆盖组合
覆盖路径
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 程序图

程序图是一种有向图,图中的节点表示语句片断,边表示控制流。
notion image
有的时候,我们可以把几个节点合并成一个,合并的原则是:若在一个节点序列中没有分支,则我们可以把这个序列的节点都合并成一个节点。
notion image

2 前置概念

路径是一系列边,使得对于该序列中的所有相邻边对偶ei、ej来说,第一条边的终止节点是第二条边的初始节点。
环路是一个在同一个节点上开始和结束的(有向)路径。
半路径是一系列边,使得对于该序列中至少有一个相邻边对偶ei、ej来说,第一条边的初始节点是第二条边的初始节点,或第一条边的终止节点是第二条边的终止节点。
notion image
有向图中的两个结点ni和nj:
  • 0-连接,当且仅当ni和nj之间没有路径
  • 1-连接,当且仅当ni和nj之间有一条半路径,但没有路径
  • 2-连接,当且仅当ni和nj之间有一条路径
  • 3-连接,当且仅当ni和nj之间有一条路径,并且从nj到ni有一条路径
notion image

3 DD-路径

DD-路径是程序图中的一条链,使得:
  • 情况1:由一个结点组成,indeg=0;
  • 情况2:由一个结点组成,outdeg=0;
  • 情况3:由一个结点组成,indeg≥2 或 outdeg≥2;
  • 情况4:由一个结点组成,indeg=1 并且outdeg=1;
  • 情况5:长度≥1的最大链
notion image
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
notion image
  • 基本路径测试步骤
    • 导出程序的控制流图;
    • 计算控制流图的环路复杂度V(G);
    • 确定只包含独立路径的基本路径集(一组线性独立路径,个数为V(G));
    • 设计测试用例。
 

五、例题

例题1

分别以语句覆盖、判定覆盖、判定/条件覆盖方法设计测试用例,并写出每个测试用例的执行路径。
notion image
 

例题2

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

例题3

请分别选出用语句覆盖,条件覆盖,路径覆盖应用哪组测试用例(请写出设计过程)。
notion image
(1)x=0, y=3
(2)x=1,y=2
(3)x= -1,y=2
(4)x=3,y=1
notion image
 

例题4

用基路径测试测以下程序。
notion image
notion image
 
 
💡
有关问题,欢迎您在底部评论区留言,一起交流~
编译原理:文法和语言软件测试:基于决策表的测试
Loading...
Koreyoshi
Koreyoshi
一个无可救药的乐观主义者
Latest posts
软件工程: 软件设计基础
2025-3-6
软件工程:软件工程基础
2025-3-6
软件测试:基于决策表的测试
2025-3-6
软件测试:控制流测试
2025-3-4
软件测试:边界值测试
2025-3-4
软件测试:等价类测试
2025-3-4
Announcement
🎉写给自己的2025心愿🎉
保研
国奖
完善博客
学一门乐器
发表一篇论文
拍摄人生照片
去3个城市旅游
专业课知识视频
拍摄毕业季视频
----- 2025 ------
👏希望我们一起变好👏