type
status
date
slug
summary
tags
category
icon
password
文章前言:本文主要讲述结构性测试中的数据流测试。
一、引入
在单元测试中,数据仅仅在一个模块或者一个函数中流通。但是,数据流的通路往往涉及多个集成模块,甚至于整个软件,所以我们有必要进行数据流的测试,尽管它非常耗时。
- 数据流测试按照程序中的变量定义和使用的位置来选择程序的测试路径。
- 数据流测试关注变量接收值的点和使用这些值的点。
- 一种简单的数据流测试策略是要求覆盖每个定义-使用路径一次。
分类
根据对程序路径的分析精度分类:
- 流不敏感分析(flow insensitive):不考虑语句的先后顺序,按照程序语句的物理位置从上往下顺序分析每一语句,忽略程序中存在的分支
- 流敏感分析(flow sensitive):考虑程序语句可能的执行顺序,通常需要利用程序的控制流图(CFG)
- 路径敏感分析(path sensitive):不仅考虑语句的先后顺序,还对程序执行路径条件加以判断,以确定分析使用的语句序列是否对应着一条可实际运行的程序执行路径
根据分析程序路径的深度分类:
- 过程内分析(intraprocedure analysis):只针对程序中函数内的代码
- 过程间分析(inter-procedure analysis):考虑函数之间的数据流,即需要跟踪分析目标数据在函数之间的传递过程
- 上下文不敏感分析(context-insensitive):将每个调用或返回看做一个 “goto” 操作,忽略调用位置和函数参数取值等函数调用的相关信息
- 上下文敏感分析(context-sensitive):对不同调用位置调用的同一函数加以区分
二、相关概念

1 变量的定义结点
结点n∈程序图G(P)是变量v∈V的定义结点,记作DEF(v, n),当且仅当变量v的值由对应结点n的语句片段处定义。
- max=
2 变量的使用结点
结点n∈G(P)是变量v∈V的使用结点,记作USE(v, n),当且仅当变量v的值在对应结点n的语句片段处使用。
- =max
3 谓词使用与计算使用
使用结点USE(v, n)是一个谓词使用(记作P-use),当且仅当语句n是谓词语句;否则,USE(v, n)是计算使用(记作C-use)。
- 谓词使用(控制使用)
- while(max)
- if(max>3)
- 计算使用
- =max*3;
- print(max);
- return max;
4 定义-使用路径
关于变量v的定义-使用路径(记作du-path)是P中的所有路径集合PATHS(P)中的路径,使得对某个v∈V,存在定义和使用结点DEF(v, m)和USE(v, n),使得m和n是该路径的最初和最终结点。
- 变量的值是否能正确地从定义点传播到使用点,而不会被意外修改。
在这个例子中:
- 变量
x
在(D1)
处被定义。
- 变量
x
在(U1)
处被使用。
- 这条路径
(D1) → (U1)
是一个 DU Path,因为x
的值在这条路径上没有被重新定义过。
如果
x
在 U1
之前又被重新赋值,则原来的 DU Path
就会被破坏。5 关于变量V的定义清除路径
关于变量v的定义清除路径(definition-clear path,记作dc-path),是具有最初和最终结点DEF(v, m)和USE(v, n)的PATHS(P)中的路径,使得该路径中没有其他结点是v的定义结点。
- 一个 从
x
的某次赋值(定义)到某个使用(use)之间的路径,如果沿途x
没有被重新定义,那么这条路径就是 定义清除路径。
- 变量的生命周期内,不被意外修改,以确保数据的完整性。
在这个例子中:
x
在(D1)
处定义。
x
在(U1)
处使用,但从(D1)
到example()
结束的整个路径上,x
没有被重新赋值,因此是 DC Path。
6 区别与联系
比较项 | 定义使用路径(DU Path) | 定义清除路径(DC Path) |
关注点 | 变量的值是否能从定义点正确传播到使用点 | 变量在定义之后是否在整个生命周期内未被重新赋值 |
路径要求 | 变量从定义点到使用点之间不被重新定义 | 变量从定义点到作用域结束之间不被重新定义 |
测试目的 | 确保数据流正确 | 确保变量不会被意外修改 |
示例 | D1 → U1 (x 被定义后使用) | D1 → 结束 (x 被定义后未被修改直到作用域结束) |
联系:
- 所有 DC Path 也一定是 DU Path,但并非所有 DU Path 都是 DC Path。 例如,如果一个变量在使用后又被重新定义,则它可能形成多个 DU Path,但不构成 DC Path。
简单理解:
- DU Path 关注的是变量的值能否正确传播到使用点,防止数据流出错。
- DC Path 关注的是变量的值是否在整个生命周期内保持稳定,防止不必要的修改。
三、定义-使用路径测试(DU)
参考示例:白盒技术之数据流测试
1 定义-使用路径测试覆盖准则
上面介绍的程序分析的核心,是定义一组叫做Rapps-Weyuker数据流覆盖指标。
- 即Rapps和Weyuker所定义的一组基于数据流的测试路径覆盖指标。
- 结合程序图,找出所有变量的定义-使用路径,考察测试用例对这些路径的覆盖程度,就可以作为衡量测试效果的参考。
2 全定义覆盖准则
集合T满足程序P的全定义(all definition)准则,当且仅当对于所有变量v∈V,T包含从v的每个定义结点到v的一个使用的定义清除路径。
- 确保每个变量的定义至少被覆盖到一次,即从定义点出发的 DU 路径至少被测试一次。
- DU 路径:
(D1) → (U1)
- All-Defs 覆盖要求: 确保
x = 5;
这条定义至少有一个测试用例能到达y = x + 3;
。
3 全使用覆盖准则
集合T满足程序P的全使用(all use)准则,当且仅当对于所有变量v∈V,T包含从v的每个定义结点到v的所有使用的定义清除路径。
- 确保所有使用点(计算使用和控制使用)都被覆盖,并且路径上没有对变量的重新定义。
- DU 路径:
(D1) → (U1)
(D1) → (U2)
- All-Uses 覆盖要求: 确保所有的
U1
和U2
都被测试到。
4 全谓词使用/部分计算机使用覆盖准则
集合T满足程序P的全谓词使用(all predicate use)/部分计算使用(some calculation use)准则,当且仅当所有变量v∈V,T包含从v的每个定义结点到v的所有谓词使用的定义清除路径,并且如果v的一个定义没有谓词使用,则到至少一个计算使用有一条定义清除路径。
5 全计算使用/部分谓词使用覆盖准则
集合T满足程序P的全计算使用(all C-use)/部分谓词使用(some P-use)准则,当且仅当所有变量v∈V,T包含从v的每个定义结点到v的所有计算使用的定义清除路径,并且如果v的一个定义没有计算使用,则到至少一个谓词使用有一条定义清除路径。
6 全定义-使用路径覆盖准则
集合T满足程序P的全定义-使用路径(all definition-use-paths, all-du-paths)准则,当且仅当所有变量v∈V,T包含从v的每个定义结点到v的所有使用的定义清除路径,并且这些路径要么有一次环经过,要么没有环路。

7 总结分析

四、基于程序片的测试
1 定义
给定一个程序P和P中的一个变量集合V,变量集合V在语句n上的一个片,记做S(V,n),是P中对V中的变量值作出贡献的所有语句集合。
2 使用结点和定义结点
USE关系适合五种形式的使用:
- 谓词使用 用在谓词(判断)中。
- 计算使用 用在计算中。
- 输出使用 用于输出。
- 定位使用 用于定位(指针、下标)。
- 迭代使用 迭代(内部计数器、循环指示)。
标识两种定义节点:
- 输入定义 通过输入定义。
- 赋值定义 通过赋值定义。
五、例题
1 例题

- 定义-使用分析

- 定义-使用对

- 全定义测试:所有的定义组成的定义-使用对。

- 全计算使用测试:所有的计算使用组成的定义-使用对。

- 全谓词使用测试:所有的为此使用组成的定义-使用对。

- 全使用测试:定义-使用对

- 全定义-使用测试

2 练习
注意:
- 5-5不能计入定义使用路径。
- 因为循环5-4可记入定义使用路径。


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