程序结构分析
参考文献:
软件测试第4章白盒测试一
- 控制流分析:
控制流图:由节点和线组成
控制流图和矩阵:
需要注意的是:在控制流图中,节点包括菱形表示的出口的多条流线相交的汇合点。
程序结构的基本要求:
a. 转向并不存在的标号;
b. 没有用的语句标号;
c. 从程序入口进入后无法达到的语句;
d. 不能达到停机语句的语句。
检查可达性:
- 数据流分析
如果程序中某一语句执行时能改变某程序变量V的值,则称V是被该语句定义的。如果一语句的执行引用了内存中变量V的值,则说该语句引用变量V。
可达性定义:
a. 语句i对变量V的定义,表示为 V i V_i Vi
b. 如果在控制流图中一条路径并未对变量V定义,那么该路径就是变量V的明确定义
c. 如果从节点i到节点j的入口(或出口),变量V有一条明确定义路径,定义 V i V_i Vi便说是达到了结点j的入口(或出口)。
相关定义:
s i s_i si: 表示达到i的入口的变量定义的集合。(达到其前趋出口的定义的集合,也就是前趋节点的出口的并集)
t i t_i ti: 表示达到i的出口的变量定义的集合。(去掉未定义的,加入新定义的)
p i p_i pi: 是节点i保存的所有定义的集合
c i c_i ci: 是节点i中生成的定义的集合
t i = ( s i ∩ p i ) ∪ c i t_i=(s_i∩p_i)∪c_i ti=(si∩pi)∪ci
s i = ⋃ j ∈ x i t j s_i=\bigcup\limits_{j∈x_i}t_j si=j∈xi⋃tj
s i = ⋃ j ∈ x i ( s j ∩ p j ) ∪ d i s_i=\bigcup\limits_{j∈x_i}(s_j∩p_j)∪d_i si=j∈xi⋃(sj∩pj)∪di
d i = ⋃ j ∈ x i c j d_i=\bigcup\limits_{j∈x_i}c_j di=j∈xi⋃cj
引用未定义变量:对每一结点i,我们依次考虑语句i引用的每一变量,如果对任何这样的变量V,并没有V的定义达到i,那么程序含有一个错误。
未曾使用的定义:对于每一变量定义 V i V_i Vi,我们依次考虑由 V i V_i Vi达到的每个程序结点j,如果没有引用变量V的相应语句,则程序中含有一个异常。 - 信息流分析
求M、N的商,Q为商,R为余数
图a给出每一语句执行时所用到其输入值的变量。其中,为什么语句4执行时用到了M和N,我的想法是,因为循环的判断语句(3)用到了M和N。
图b给出了其执行可能直接或间接影响输出变量终值的一些语句。其中,因为对Q的定义,并未影响到R的变化,所以R不受语句1、2的影响,但是Q的值受到R值影响。
图c表明了哪个输入值可能直接或间接影响输出变量。(有赋值语句存在都算吧)