课程名称
姓名
实验名称
实验目的
与要求
实验环境
实
验
内
容
湖北科技学院
软件测试实验报告
软件测试方法与技
术
班级
学号
实验日期
实验成绩
白盒测试实验
(1)掌握白盒测试技术,并能应用白盒测试技术设计测试用例
(2)能用 Junit 实施测试
主流 PC 机一套,需安装 windows 操作系统、Office、Eclipse 和 Junit
题目一:用逻辑覆盖测试方法测试以下程序段
void DoWork (int x,int y,int z){
1 int k=0, j=0;
2 if ( (x>3)&&(z<10) )
3 {
4 k=x*y-1;
5 j=sqrt(k);
6 }
7 if((x==4)||(y>5))
8 j=x*y+10;
9 j=j%3;
10 }
说明:程序段中每行开头的数字(1~10)是对每条语句的编号。
(1)画出程序的控制流图(用题中给出的语句编号表示)。
(2)分别以语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路
径覆盖方法设计测试用例,并写出每个测试用例的执行路径(用题中给出的语
句编号表示)。
题目二、折半查找
请按要求对下面的 java 代码进行测试。代码的功能是:用折半查找法在
1
元素呈升序排列的数组中查找值为 key 的元素。
public int binSearch ( int array[], int key ) {
int mid, low, high;
low = 0;
high = array.length-1;
while ( low <= high ) {
mid = (low high)/2;
if ( key = = array [mid] )
return mid;
else if ( key < array [mid] )
high = mid -1;
else
low = mid 1
}
return -1;
}
(1) 试计算此程序段的 McCabe 复杂性;
(2) 用基本路径覆盖法给出测试路径;
(3) 为各测试路径设计测试用例。
2
测
试
用
例
描
述
及
实
验
步
骤
(1)题目一
程序的流程图如下:
开始
x>3&&z<10
T
k=x*y-1
F
j=sqrt(k)
x==4||y>5
T
x*y+10
F
j=j%3
结束
程序的控制流图如下:
3
1
2
3
6
7
9
10
4
5
8
语句覆盖的测试用例:
语句覆盖是设计足够的测试用例使程序中的每一条可执行语句至少执行一
次。这题中,两个 if 语句的判定之后,只要确保使两个判定都为真,那么所
有的执行语句就都可以执行了,即可达到语句覆盖的要求。所以设计的测试用
例如下:x = 4 , y = 6 , z = 8 。
这组测试用例的执行路径是 1—2—3—4—5—6—7—8—9—10
判定覆盖的测试用例:
判定覆盖要求程序中每个判断的取真分支和取假分支至少经历一次。这题中,
有两个判定语句,至少需要设计两组测试用例,才能分别覆盖两个 if 语句的
真分支和假分支。所以设计的测试用例如下:
用例 1:x = 4 , y = 6 , z = 8 ,其执行路径是
1—2—3—4—5—6—7—8—9—10 ;
用例 2:x = 3 , y = 5 , z = 8 ,其执行路径是 1—2—3—6—7—9—10。
条件覆盖的测试用例
条件覆盖要求每个判断中每个条件的可能取值至少要满足一次。这道题目中的
条件有四个,分别如下: ① x > 3 ; ② z < 10 ;③ x = = 4 ;④ y > 5 ;
设计用例时要使每个条件分别取真和取假。设计的测试用例如下表。
4
测试用例
编号
1
2
测试数据
覆盖条件
执行路径
x=3,y=8,z=8
①假②真③假④真 1-2-3-6-7-8-9-10
x=4,y=5,z=13
①真②假③真④假 1-2-3-6-7-8-9-10
判定条件覆盖:
判定/条件覆盖要求判断中每个条件的所有可能至少出现一次,并且每个判断
本身的可能判定结果也至少出现一次。题目中的条件有四个,分别如下:
1
x > 3 ; ② z < 10 ;③ x = = 4 ;④ y > 5 ;
该程序中的分支有四个 。所以设计的测试用例如下表所示:
测试用例编
号
1
2
条件组合覆盖:
测试数据
覆盖条件
执行路径
x=4,y=8,z=8
x=3,y=5,z=13
①真②真③
真④真
①假②假③
假④假
1-2-3-4-5-6-7-8-9-10
1-2-3-6-7-9-10
条件组合覆盖要求每个判定的所有可能条件取值组合至少执行一次。这道题目
中共有四个条件分别如下:
1
x > 3 ; ② z < 10 ;③ x = = 4 ;④ y > 5 ;
设定 x > 3 为真时,记作 T1 ;为假时,即 x ≤ 3 , 记作 F1 ;
z < 10 为真时,记作 T2 ;为假时,即 z ≤ 10 , 记作 F2 ;
x = = 4 为真时,记作 T3 ;为假时,即 x ≠ 4 , 记作 F3 ;
y > 5 为真时,记作 T4 ; 为假时,即 y ≤ 5 , 记作 F4 。
条件组合如下表:
编号
具体条件取值
覆盖条件
判定取值
1
2
3
4
5
6
7
8
x > 3 , z < 10
x > 3 , z ≤ 10
x ≤ 3 ,z < 10
x ≤ 3 ,z ≤ 10
x = = 4 ,y > 5
x = = 4 ,y ≤ 5
x ≠ 4 , y > 5
x ≠ 4 , y ≤ 5
设计的测试用例如下:
T1,T2
T1,F2
F1,T2
F1,F2
T3,T4
T3,F4
F3,T4
F3,F4
第一个判定:取真分支
第一个判定:取假分支
第一个判定:取假分支
第一个判定:取假分支
第二个判定:取真分支
第二个判定:取真分支
第二个判定:取真分支
第二个判定:取假分支
测试用例
编号
测试数据
覆盖条件
执行路径
1
2
x = 4 , y = 8 , z
= 8
x = 4 , y = 3 , z
= 13
5
T1,T2,T3,T4
1-2-3-4-5-6-7-8-9-10
T1,F2,T3,F4
1-2-3-6-7-8-9-10
3
4
x = 2 , y = 8 , z
= 8
x = 2 , y = 3 , z
= 13
F1,T2,F3,T4
1-2-3-6-7-8-9-10
F1,F2,F3,F4
1-2-3-6-7-9-10
路径覆盖:
路径覆盖要求覆盖程序中所有可能的路径。这道题中可能的执行路径共有 4 条,
所以需要设计 4 个测试用例:
测试用例编
号
1
2
3
4
测试数据
执行路径
x = 4 , y = 8 , z = 8
1-2-3-4-5-6-7-8-9-10
x = 4 , y = 3 , z = 13
1-2-3-6-7-8-9-10
x = 6 , y = 2 , z = 8
1-2-3-4-5-6-7-9-10
x = 2 , y = 3 , z = 13
1-2-3-6-7-9-10
(2) 题目二
程序编号后如下:
public int binSearch ( int array[], int key ) {
1.int mid, low, high;
2.low = 0;
3.high = array.length-1;
4.while ( low <= high ) {
5.mid = (low high)/2;
6.if ( key = = array [mid] )
7.return mid;
8.else if ( key < array [mid] )
9.high = mid -1;
10.else
11.low = mid +1
12.}
13.return -1;
14.}
程序的流程图如下:
6
开始
Low=0
high=array.length-1
low<=high
T
F
mid=(high+low)/2
return -1
结束
Key==array[mi
d]
T
F
return mid
key
1
2
3
4
5
6
R2
9
12
R4
8
R3
10
11
13
14
7
R1
程序的环路复杂性即McCabe复杂性度量,简单的定义为控制流图的区域数。从
程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确保程序
中每个可执行语句至少执行一次所必需的最少测试用例数。
通常环路复杂性可用以下三种方法求得。
(1)通过控制流图的边数和节点数计算。设E为控制流图的边数,N为控制流
图的节点数,则定义环路复杂性为 V(G)= E – N + 2 ;
该图中共有16条边,14个节点,因此 E = 16 ,N = 14 ,
V(G)=E-N+2=16-14+2 = 4 ,程序的环路复杂性为4。
(2)通过控制流图中判定节点数计算。若设P为控制流图中的判定节点数,则
有V(G) = P + 1
该图中有3个判定节点,因此其环路复杂性为V(G)=P+1=3+1=4,所以该程序的
环路复杂性为4。
(3)将环路复杂性定义为控制流图中的区域数。该控制流图中有4个区域:R1、
R2、R3、R4,因此其环路复杂性为4。
通过程序的控制流图导出基本路径集,列出程序的独立路径。
8