测试的艺术 3 白盒测试

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据流分析—定义/使用测试
定义5:定义清除路径
➢定义清除路径(记做dc-path):是具 有最初和最终节点DEF(v,m)和 USE(v,n)的PATHS(P)中的路 径,使得该路径中没有其他节点是v的 定义节点。
数据流分析—定义/使用测试
变量的定义和使用 1 a=5; 2 While(C1) { 3 if (C2){ 4 b=a*a 5 a=a-1; 6} 7 print(a); 8 Print(b);}
(1) 计算此程序段的
圈复杂度;
for( j = i + 1; j < n; j++ ) { if ( a[j] < a[k] ) k = j;
} if ( i != k ) {
(2) 用基本路径法给
出测试路径;
(3) 为各测试路径设
计测试用例。
t = a[k];
a[k] = a[i];
a[i] = t;
数据流分析—定义/使用测试
G(P):程序图 构造方式同前,语句片段代表节点,边 代表节点序列 单入口,单出口,且不允许从某个节点 到其自身的边 P:程序 V:一组程序变量
数据流分析—定义/使用测试
Program Graph to DD-Path Graph
first
4
5
6
7
8
9
10
11
12
13
数据流分析
程序数据流视角:程序是一个程序元 素对数据访问的过程 数据流关系:数据“定义——使用” 对 使用程序图来描述数据定义-使用对 出发点:对数据的不正确处理
数据流测试
数据流测试
数据流测试按照程序中的变量定义和使用 的位置来选择程序的测试路径 数据流测试关注变量接收值的点和使用这 些值的点 一种简单的数据流测试策略是要求覆盖每 个定义-使用路径一次 数据流测试用做路径测试的“真实性检查”
DD-Path Name first A B C D E F H I J K L M N G O last
Case # 1 5 3 4 4 3 3 3 4 3 4 4 3 3 4 3 2
Program Graph to DD-Path Graph
4
5
6
7
8
9
10
11
12
13
14
21
15
16
20 22 23
AB+BC+CB+BC+CG+AB+BE+EF+FG-AB-BC-CG
= A、B、C、B、E、F、G
如何寻找McCabe路径? 图的搜索与遍历算法!
深度优先算法 广度优先算法
A
B
D
E
C
F
G
例:
1
123 4 5 6 7
1 010 0 0 0 0 2
2 001 0 0 0 1
3
7
3
000 1
1
0
0
4 000 0 0 1 0
定义2:使用节点
➢节点n∈G(P)是变量v ∈V的使用节点, 记做USE(v,n),当且仅当变量v的值在 对应节点n的语句片断处使用。
➢使用节点语句:
输出语句 赋值语句 条件语句 循环控制语句 过程调用
例子
变量的定义和使用 例1: a=b; DEF(1)={a}, USES(1)={b}. 例2: a=a+b; DEF(1)={a}, USES(1)={a, b}
}
案例:选择排序
public void select_sort ( int a[ ] ) { int i, j, k, t, n = a.length; for ( i = 0; i<n-1; i++ ) { k = i; for( j = i + 1; j < n; j++ ) { if ( a[j] < a[k] ) k = j; } if ( i != k ) { t = a[k]; a[k] = a[i]; a[i] = t;
1.导出程序的控制流图; 2.计算控制流图的环路复杂度V(G); 3.确定只包含独立路径的基本路径集; 4.设计测试用例;
课堂练习:
请用基本路 径法测试右 边的程序代 码。
public void f (int RecordNum, int Type ){ int x = 0; int y = 8; while ( RecordNum > 0) { if( Type = = 0) x = y + 2; else { if( Type = = 1 ) x = y + 5; else x = y + 10; } RecordNum - }
白盒测试
白盒测试 白盒测试(White Box Testing )
白盒测试又叫结构测试,逻辑驱动测试或基于程序本身的测 试。
白盒测试
源程序
分析
测试用例
覆盖情况分析
被测程序 执行路径
白盒测试主要方法
白盒测试方法: 控制流测试
逻辑覆盖 路径测试
数据流测试 基于程序片的测试
逻辑覆盖
路径覆盖
条件组合覆盖 判定/条件覆盖
判定覆盖
条件覆盖
语句覆盖
路径测试
程序环路复杂性 基路径测试 循环测试
1 控制流图
控制流图是退化的程序流程图,图 中每个处理都退化成一个结点,流 线变成连接不同结点的有向弧。 控制流图将程序流程图中结构化构 件改用一般有向图的形式表示。
控制流图
在控制流图中用圆“○”表示节点, 一个圆代表一条或多条语句。 控制流图中的基本元素:
4
5
5 000 0 0 1 0
6 010 0 0 0 0 6
7 000 0 0 0 0
基本复杂度讨论
McCabe在圈复杂度上的工作,在一定意义上,对程 序设计的改进要大于对测试的改进。
对于结构化程序设计的程序,可以将if-then-else 构造压缩为一个节点。
而对于非结构化程序,必然增加McCabe圈的数 量。
D
P4:A,D,E,F,G;
E
P5:A,D,F,G。
C
F
任何路径都可以看作是上述5条路径的组合形成G 的。
例:A、B、C、B、E、F、G是P2+P3-P1
其中,加法是一条路径后接一条路径;乘法是路径的重 复,而减法则只有数学上去除边的含义,而缺少实际意义。
=A,B,C,B,C,G+ A,B,E,F,G- A,B,C,G ;
一般的,一个单元模块的最大复杂度V(G)<10。
3.基本路径测试
如果把覆盖的路径数压缩到一定限 度内,例如程序中的循环体只执行 零次和一次,就成为基本路径测试。
基本路径测试法
通过分析程序控制流图的环路的复 杂性,导出基本路径集合,从而设 计测试用例,保证这些路径至少通 过一次。
基本路径测试法
基本路径测试步骤:
McCabe圈数V(G)计算方法: V(G)=e-n+2p e:边数; n:节点数 p:连接区域数 对于右图: V(G)=7+2=5
A
B
D
E
C
F
G
为避免混乱,不再说明强连接有向图的计算公式。
5条独立的路径是:
P1:A,B,C,G;
P2:A,B,C,B,C,G;
A
P3:A,B,E,F,G;
B
要求:
(1) 计算此程序段的
圈复杂度;
(2) 用基本路径法给
出测试路径;
(3) 为各测试路径设
计测试用例。
4. 循环测试
问题引入
➢带有循环的路径覆盖的困难性 ➢简化循环的假设
不进入循环 只进入一次循环
循环测试
循环可以划分为
➢简单循环 ➢串接循环 ➢嵌套循环 ➢非结构循环
循环结构
简简简简
数据流分析—定义/使用测试
数据流分析—定义/使用测试
B
2. 程序环路复杂性
程序的环路复杂性即McCabe复杂性 度量,简单的定义为控制流图的区 域数。 程序环路复杂性又叫圈复杂度。
圈复杂度
圈复杂度:是一种为程序逻辑复杂性提 供定量测度的软件度量,将该度量用于 计算程序的基本的独立路径数目。 独立路径必须包含一条在定义之前不曾 用到的边。(每一条新的路径都包含了 一条新边)
17
18
19
first
A
B
C
D
E
F
H
G
I
J
N O last
K
L
M
5.2 测试覆盖指标
覆盖准则表示了一组测试用例覆盖程序执行路径的 程度。
指标
C0 C1 C1p C2
Cd Cmcc Cik Cstart C
覆盖描述 所有语句(语句覆盖) 所有DD-路径(分支覆盖) 所有判断的每种分支(条件判断) C1覆盖+循环覆盖 C1覆盖+DD-路径的所有依赖对偶 多条件覆盖 包含最多K次循环的所有程序路径(通常K=2) 路径具有“统计重要性”的部分 所有可能的执行路径
定义3:谓词使用、计算使用
➢使用节点USE(v,n)是一个谓词使用 (记做P-use),当且仅当语句n是谓词 语句;否则,USE(v,n)是计算使用 (记做C-use)
➢对应于谓词使用的节点,其外度≥2
➢对应于计算使用的节点,其外度≤1
数据流分析—定义/使用测试
定义4:定义-使用路径
➢定义-使用路径(记做du-path):是 PATHS(P)中的路径,使得对某个v ∈V,存在定义和使用节点DEF(v,m) 和USE(v,n),使得m和n是该路径的 最初和最终节点。
} return a[k]; }
假如n等于3,请用循环测试方法进行测试。
案例:选择排序
public void select_sort ( int a[ ] ) { int i, j, k, t, n = a.length; for ( i = 0; i<n-1; i++ ) { k = i;
要求:
简简简简
简简简简 简简简简简
简单循环测试
需设计五种测试:
零次循环; 一次循环; 两次通过循环; m次通过循环,m<循环最大次数; n-1,n,n+1次通过循环。
其中n是允许通过循环的最大次数。
嵌套循环测试
嵌套循环可按照下面的方法进行测试:
➢从最内层循环开始,将所有其它层的循环设 置为最小值;
} }}
5 数据流测试
数据流测试 数据流定义和使用测试
5.1 DD-路径和DD-路径图(续)
DD-Path graph 是一张带有标签的有向图, 图中的节点表示程序图的DD路径,而边 表示路径的控制流。
对于给定的程序,可以构造多种不同的程 序图,所有这些程序图,都可以简化为唯 一的DD-路径图。
➢对最内层循环使用简单循环的全部测试。 ➢由内向外构造下一个循环的测试。测试时保
持所有外层循环的循环变量取最小值,并使 其它嵌套内层循环的循环变量取“典型”值; ➢反复进行,直到测试所有的循环。
串接循环
两个或多个简单的循环串接在一起,称为串 接循环。 如果两个或多个循环毫不相干,则应作为独 立的简单循环测试。 如果两个循环串接起来,而第一个循环是第 二个循环的初始值,则这两个循环并不是独 立的。如果循环不独立,则推荐使用嵌套循 环的方法进行测试。
对100行以内的程序生成DD路径是可行的, 如果超过这个规模,一般需要有分析工具 的支持。
DD-Path Formation - Example
4
5
6
7
8
9
10
11
12
13
14
21
15
16
20 22 23
17
18
19
Triangle Program Graph
Program Graph Nodes 4 5-8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
非结构循环
不能测试,尽量重新设计给结构化 的程序结构后再进行测试。
案例:求一组数中的最大值
int max ( int a[ ], int n ) {
int i = 0, j, k; k = i; for ( j = i +1, j < n ; j++ ) {
if ( a[j] > a[k] ) k = j;
14
21
15
16
20 22 23
17
18
19
A
B
C
D
E
F
H
G
I
J
N O last
K
L
M
定义/使用测试
定义1:定义节点
➢节点n∈G(P)是变量v ∈V的定义节 点,记做DEF(v,n),当且仅当变 量的值由对应节点n的语句片断处定义。
➢定义节点语句:
输入语句 赋值语句 循环语句和过程调用 如果执行这些语句,变量的值往往会发生变化
例:
A R5 1 2
B
R2 4
3
R1
D
5
6
E R3 7
R4 8
C
F
9 10
G
圈复杂度(续)
程序图的圈复杂度计算方法(三种):
➢V(G)=e – n + 2p;
e:边数,n:节点数,p:连接区域数 当p=1时,V(G)= e – n + 2;
➢V(G)=P+1;P是图G 中判定节点的数量 ➢程序图中区域的数量对应于环路的复杂性;
➢节点 ➢边
基本控制流图
IF选择结构
While循环结构
顺序结构
Until循环结构
Case多分支结构
复合逻辑下的控制流图
a or b
x++
x--
a
x++
b
x++
x--
(a)
(b)
(c)
问题引入
路径覆盖的困难
A
➢含5个分支,循环次数≤20,从
A到B的可能路径:
=51 +5 2+..+519+5 20 ≈10 14
相关文档
最新文档