资源描述
白盒测试用例练习
1.为以下所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖,并画出相应的程序流程图。
void DoWork (int x,int y,int z)
{
int k=0,j=0;
if ( (x>3)&&(z<10) )
{ k=x*y-1;
j=sqrt(k); //语句块1
}
if ( (x==4)||(y>5) )
{
j=x*y+10;
} //语句块2
j=j%3; //语句块3
k=0
j=0
k=x*y-1
j=sqrt(k)
x>3
and
z<10
}
a
Y c
N
b
x=4
or
y>5
e
Y
j=x*y+10
N
d
j=j%3
由这个流程图可以看出,该程序模块有4条不同的路径:
P1:(a-c-e) P2:(a-c-d)
P3:(a-b-e) P4:(a-b-d)
将里面的判定条件和过程记录如下:
判定条件M={x>3 and z<10}
判定条件N={x=4 or y>5}
1、 语句覆盖
测试用例输入
输出
判定M的取值
判定N的取值
覆盖路径
x=4,z=5,y=8
k=31,j=0
T
T
P1(a-c-e)
2、判定覆盖
p1和p4可以作为测试用例,其中p1作为取真的路径,p4作为取反的路径。
测试用例输入
输出
判定M的取值
判定N的取值
覆盖路径
x=4,z=5,y=8
k=31,j=0
T
T
P1(a-c-e)
x=2,z=11,y=5
k=0,j=0
F
F
P4(a-b-d)
也可以让测试用例测试路径P2和P3。相应的两组输入数据如下:
测试用例输入
输出
判定M的取值
判定N的取值
覆盖路径
x=5,z=5,y=4
k=19,j=sqrt(19)%3
T
F
P2(a-c-d)
x=4,z=11,y=6
k=0,j=1
F
T
P3(a-b-e)
3、条件覆盖
对于M:x>3取真时T1,取假时F1;
z<10取真时T2,取假时F2;
对于N:x=4取真时T3,取假时F3;
y>5取真时T4,取假时F4。
条件:x>3,z<10,x=4,y>5
条件:x<=3,z>=10,x!=4,y<=5
根据条件覆盖的基本思路,和这8个条件取值,组合测试用例如表所示:
测试用例输入
输出
取值条件
具体取值条件
覆盖路径
x=4,z=5,y=8
k=31, j=0
T1,T2,T3,T4
x>3,z<10,x=4,y>5
P1(a-c-e)
x=3,z=11,y=5
k=0, j=0
F1,F2,F3,F4
x<=3,z>=10,x!=4,y<=5
P4(a-b-d)
4、判定/条件覆盖
测试用例输入
输出
取值条件
具体取值条件
覆盖路径
x=4,z=5,y=8
k=31, j=0
T1,T2,T3,T4
x>3,z<10,x=4,y>5
P1(a-c-e)
x=3,z=11,y=5
k=0, j=0
F1,F2,F3,F4
x<=3,z>=10,x!=4,y<=5
P4(a-b-d)
5、组合覆盖
条件组合
1)x>3,z<10 2)x>3,z>=10
3) x<=3,z<10 4)x<=3,z>=10
5)x=4,y>5 6)x=4,y<=5
7)x!=4,y>5 8)x!=4,y<=5
测试用例输入
输出
覆盖条件取值
覆盖条件组合
覆盖路径
x=4,z=5,y=6
k=23, j=1
T1,T2,T3,T4
1,5
P1(a-c-e)
x=4,z=10,y=5
k=0, j=0
T1,F2,T3,F4
2,6
P2(a-c-d)
x=3,z=5,y=6
k=14 j=1
F1,T2,F3,T4
3,7
P3(a-b-e)
z=3,z=10,y=5
k=0, j=2
F1,F2,F3,F4
4,8
P4(a-b-d)
6、路径覆盖
测试用例输入
输出
覆盖条件取值
覆盖条件组合
覆盖路径
x=4,z=5,y=8
k=31,j=0
T1,T2,T3,T4
1,5
P1(a-c-e)
x=5,z=5,y=4
k=19,j=sqrt(19)%3
T1,T2,F3,F4
1,8
P2(a-c-d)
x=4,z=11,y=6
k=0,j=1
T1,F2,T3,T4
2,5
P3(a-b-e)
x=2,z=11,y=5
k=0,j=0
F1,F2,F3,F4
4,8
P4(a-b-d)
题目二:三角形问题
在三角形计算中,要求输入三角型的三个边长:A、B 和C。当三边不可能构成三角形时提示错误,可构成三角形时计算三角形周长。若是等腰三角形打印“等腰三角形”,若是等边三角形,则提示“等边三角形”。画出程序流程图、控制流程图、计算圈复杂度V(g),找出基本测试路径。
一、核心程序代码
/** 判断三角形的类 */
public class TriangleTestMethod {
/** 判断三角形的种类。参数a, b, c分别为三角形的三边,
* 返回的参数值为0,表示非三角形;
* 为1,表示普通三角形;
* 为2,表示等腰三角形;
* 为3,表示等边三角形。
*/
public static int comfirm(int a, int b, int c) {
if((a + b > c) && (b + c > a) && (a + c > b)) { // 判断为三角形
if((a == b) && (b ==c)) // 判断为等边三角形
return 3;
if((a == b) || (b == c) || (a == c)) // 判断为等腰三角形
return 2;
else // 判断为普通三角形
return 1;
}
else { // 为非三角形
return 0;
}
}
}
二、程序流程图
三、测试用例
1.语句覆盖测试用例
输入
期望输出
覆盖对象
测试结果
Case1
a=1, b=2, c=3
0
① , ⑤
0
Case2
a=3, b=4, c=5
1
① , ②, ④, ⑥
②
1
Case3
a=3, b=3, c=4
2
① , ②, ④, ⑦
②
2
Case4
a=3, b=4, c=5
3
① , ②, ③
②
3
2.判定覆盖测试用例
输入
期望输出
覆盖对象
测试结果
Case11
a=1, b=2, c=3
0
② , ⑤
0
Case12
a=3, b=4, c=5
1
③ , ②, ④, ⑥
④
1
Case13
a=3, b=3, c=4
2
③ , ②, ④, ⑦
④
2
Case14
a=3, b=4, c=5
3
③ , ②, ③
④
3
3.条件覆盖测试用例
输入
期望输出
覆盖对象
测试结果
Case5
a=1, b=6, c=7
0
F1, T2, T3
0
Case6
a=7, b=1, c=6
0
T1, F2, T3
0
Case7
a=1, b=7, c=6
0
T1, T2, F3
0
Case8
a=3, b=3, c=4
2
T1, T2, T3, T4, F5, T6, F7, F8
2
Case9
a=3, b=4, c=3
2
T1, T2, T3, F4, F5, F6, F7, T8
2
Case10
a=4, b=3, c=3
2
T1, T2, T3, F4, T5, F6, T7, F8
2
4.条件-判定覆盖测试用例
输入
期望输出
覆盖对象
测试结果
Case15
a=1, b=6, c=7
0
F1, T2, T3
0
Case16
a=7, b=1, c=6
0
T1, F2, T3
0
Case17
a=1, b=7, c=6
0
T1, T2, F3
0
Case18
a=3, b=3, c=4
2
T1, T2, T3, T4, F5, T6, F7, F8
2
Case19
a=3, b=4, c=3
2
T1, T2, T3, F4, F5, F6, F7, T8
2
Case20
a=4, b=3, c=3
2
T1, T2, T3, F4, T5, F6, T7, F8
2
Case21
a=3, b=3, c=3
3
F1, T2, T3
(3 , ②, ③)
3
Case22
a=3, b=4, c=5
1
T1, F2, T3
(①, ②, ④, ⑥)
1
5.条件组合覆盖测试用例
输入
期望输出
覆盖对象
测试结果
Case23
a=1, b=6, c=7
0
F1, T2, T3
0
Case24
a=7, b=1, c=6
0
T1, F2, T3
0
Case25
a=1, b=7, c=6
0
T1, T2, F3
0
Case26
a=3, b=3, c=4
2
T1, T2, T3, T4, F5, T6, F7, F8
2
Case27
a=3, b=4, c=3
2
T1, T2, T3, F4, F5, F6, F7, T8
2
Case28
a=4, b=3, c=3
2
T1, T2, T3, F4, T5, F6, T7, F8
2
Case29
a=3, b=4, c=5
1
T1, T2, T3,
F4, F5,
F6, F7, F8
1
Case30
a=3, b=4, c=3
2
T1, T2, T3,
F4, F5,
F6, F7, T8
2
备注
其他条件组合,无法到达结束
四、程序控制流图
基本路径覆盖测试用例
输入
期望输出
覆盖对象
测试结果
Case31
a=1, b=6, c=7
0
A->D
0
Case32
a=7, b=6, c=1
0
A->B->D
0
Case33
a=1, b=7, c=6
0
A->B->C->D
0
Case34
a=3, b=3, c=3
3
A->B->C->E->G->H
3
Case35
a=3, b=3, c=4
2
A->B->C->E->G->I
2
Case36
a=4, b=3, c=3
2
A->B->C->E->F->H
2
Case37
a=3, b=4, c=3
2
A->B->C->E->F->J->H
2
Case38
a=3, b=4, c=5
1
A->B->C->E->F->J->K
1
题目三:计算生日是星期几
已知公元1年1月1日是星期一。编写一个程序,只要输入年月日,就能回答那天是星期几。应用逻辑覆盖方法和基路径测试方法为上面的问题设计测试用例
一.程序代码
#include<stdio.h>
int check(int year,int month,int day){
int pass=1;
int leap=0;
if( (year%4==0 && year%100!=0 )|| year%400==0 )
leap=1;
if(year<1 ||day<1) return 0;
switch(month)
{ case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(day>31)return 0;break;
case 4:case 6:case 9:case 11:if(day>30) return 0; break;
case 2: if(leap==1&&day>29) {return 0;}
if(leap==0&&day>28){return 0;}
break;
default:return 0;break;
}
return pass;
}
void fun(){
int year,month,day,sumday;
sumday=0;
printf("input year,month,day:\n");
scanf("%d%d%d",&year,&month,&day);
if(check(year,month,day)==0){printf("输入的日期无效");return;}
if(month==1||month==2)
{ month+=12;
year--;
}
sumday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
if(month==13||month==14)
{ month-=12; year++;}
switch(sumday)
{case 0:printf("%d-%d-%d is Monday\n",year,month,day);break;
case 1:printf("%d-%d-%d is Tuesday\n",year,month,day);break;
case 2:printf("%d-%d-%d is Wednesday\n",year,month,day);break;
case 3:printf("%d-%d-%d is Thurday\n",year,month,day);break;
case 4:printf("%d-%d-%d is Friday\n",year,month,day);break;
case 5:printf("%d-%d-%d is Saturday\n",year,month,day);break;
case 6:printf("%d-%d-%d is Sunday\n",year,month,day);break;
default:printf("date error");break;
}
}
main()
{ for(int i=0;i<14;i++)
fun();
}
二.画出程序的控制流图
1.程序流程图如下:
month==13||month==14
no
month==1||month==2
yes
month+=12;
year--;
计算星期数sumday=公式(year,month,day)
no
yes
Month-=12;
year++;
5
4
6
0 1 2 3 4 5 6 其他
sumday
输出语句1
输出语句2
输出语句3
输出语句4
输出语句5
输出语句6
输出语句7
输出语句0
结束
7
8
9
10
11
12
13
14
15
15
输入年月日year,month,day
2
3
end
Check(year,month,day)
0
1
Check( )函数
no
no
no
yes
yes
得到year,month,day
year<1 ||day<1
no
(year%4==0 && year%100!=0 )|| year%400==0
1 3 5 7 8 10 12 4 6 9 11 2 其他
month
return pass
pass=1; leap=0;
leap=1;
return 0
day>31
day>30
return 0
no
yes
return 0
yes
leap==1&&day>29
leap==0&&day>28
return 0
16
18
17
19
20
21
22
23
24
25
26
28
29
28
27
31
30
32
33
2.程序控制流图如下:
16
19
17
21
22
23
24
31
33
34
end
15
2
4
3
5
8
7
6
12
end
9
10
11
13
14
3.用基本路径的测试路径
编号
基本路径
编号
基本路径
1
⒃⒄⒆(21)(24)(31)(33)
11
(0)①
2
⒃⒆(34)
12
(0)②③④⑤⑥⑦⑧
3
⒃⒆(21)(34)
13
(0)②④⑤⑦⑨
4
⒃⒆(21)(22)(34)
14
(0)②④⑤⑦⑩
5
⒃⒆(21)(23)(34)
15
(0)②④⑤⑦(11)
6
⒃⒆(21)(24)(34)
16
(0)②④⑤⑦(12)
7
⒃⒆(21)(31)(34)
17
(0)②④⑤⑦(13)
8
⒃⒆(21)(22)(33)
18
(0)②④⑤⑦(14)
9
⒃⒆(21)(23)(33)
10
⒃⒆(21)(31)(33)
条件:
编号
条件
编号
编号
T1
month==1
T13
year%100!=0
T25
month==2
T2
month==2
T14
year%100!=0
T26
month==3
T3
month==13
T15
year%400==0
T27
month==4
T4
month==14
T16
year<1
T28
month==5
T5
sumday==0
T17
day<1
T29
month==6
T6
sumday==1
T18
month==1
T30
month==7
T7
sumday==2
T19
day>31
T31
month==8
T8
sumday==3
T20
day>30
T32
month==9
T9
sumday==4
T21
leap==1
T33
month==10
T10
sumday==5
T22
leap==0
T34
month==11
T11
sumday==6
T23
day>29
T35
month==12
T12
year%4==0
T24
day>28
4.测试用例
用例编号
输入的数据
预期的输出
实际的输出
执行的路径
覆盖的条件
1
2012 2 1
Wednesday
Wednesday
(0)②③④⑤⑥⑦⑧
T12,T13,T25,T21,T2,T4,T7
2
2012 3 1
Thurday
Thurday
(0)②④⑤⑦⑨
T12,T13,T26,T8
3
2012 4 6
Friday
Friday
(0)②④⑤⑦⑩
T12,T13,T27,T9
4
2012 5 5
Saturday
Saturday
(0)②④⑤⑦(11)
T12,T13,T28,T10
5
2012 6 3
Sunday
Sunday
(0)②④⑤⑦(12)
T12,T13,T29,T11
6
2012 7 30
Monday
Monday
(0)②④⑤⑦(13)
T12,T13,T30,T5
7
2000 8 15
Tuesday
Tuesday
(0)②④⑤⑦(14)
T12,T15,T31,T6
8
2012 9 31
错误提示
错误提示
(0)①
T12,T13,T20,T32
9
2013 2 8
Wednesday
Wednesday
⒃⒄⒆(21)(24)(31)(33)
T25,T22,T2,T4,T7
10
2013 0 12
错误提示
错误提示
⒃⒆(34)
T17
11
2013 1 26
Saturday
Saturday
⒃⒆(21)(34)
T18,T1,T3,T10
12
2013 10 33
错误提示
错误提示
⒃⒆(21)(22)(34)
T33,T19
13
2013 11 31
错误提示
错误提示
⒃⒆(21)(23)(34)
T34,T20
14
2012 2 30
错误提示
错误提示
⒃⒆(21)(24)(34)
T12,T13,T25,T21,T23
15
2013 2 29
错误提示
错误提示
⒃⒆(21)(31)(34)
T25,T24
16
2013 12 31
Saturday
Saturday
⒃⒆(21)(22)(33)
T35,T10
17
2013 6 30
Sunday
Sunday
⒃⒆(21)(23)(33)
T29,T11
18
2013 2 15
Friday
Friday
⒃⒆(21)(24)(31)(33)
T25,T22,T2,T4,T9
19
0 12 12
错误提示
错误提示
⒃⒆(34)
T16
题目四:选择排序
下面是选择排序的程序,其中datalist是数据表,它有两个数据成员:一是元素类型为Element的数组V,另一个是数组大小n。算法中用到两个操作,一是取某数组元素V[i]的关键码操作getKey ( ),一是交换两数组元素内容的操作Swap( )::
void SelectSort ( datalist & list ) {
/对表list.V[0]到list.V[n-1]进行排序, n是表当前长度。
for ( int i = 0; i < list.n-1; i++ ) {
int k = i; //在list.V[i].key到list.V[n-1].key中找具有最小关键码的对象
for ( int j = i+1; j < list.n; j++)
if ( list.V[j].getKey ( ) < list.V[k].getKey ( ) ) k = j;//当前具最小关键码的对象
if ( k != i ) Swap ( list.V[i], list.V[k] ); //交换
}
}
(1) 试计算此程序段的McCabe复杂性;
(2) 用基本路径覆盖法给出测试路径;
(3) 为各测试路径设计测试用例。
解答如下:
首先画出程序的流程图
开始
i = 0
i < list.n-1
j++
k = i
j < list.n
k = j
k != i
Swap ( list.V[i], list.V[k] )
list.V[j] < list.V[k]
i++
结束
j = i+1
Y
N
N
N
N
Y
Y
Y
程序流程图
(1)McCabe复杂性为:
V(G)=判定节点数+1=4+1=5
(2)用基本路径覆盖法给出测试路径:
1
2
3
4
5
6
7
8
9
10
11
12
程序图
0
从以上程序图中确定无关的基本路径:
Path1:0-1-2-12
Path2: 0-1-2-3-4-5-9-11
Path3: 0-1-2-3-4-5-9-10-11
Path4: 0-1-2-3-4-5-6-8
Path5: 0-1-2-3-4-5-6-7-8
(3)为各测试路径设计测试用例:
由于节点2和节点5判定条件是等价的,所以Path2和Path3不可直达。
A={1},n=1
路径:0-1-2-12
A={1,2},n=2
路径:0-1-2-3-4-5-6-8-5-9-11-2-12
A={2,1},n=2
路径:0-1-2-3-4-5-6-7-8-5-9-10-11-2-12
A={1,3,2 },n=3
路径:0-1-2-3-4-5-6-8-5-9-11-2-3-4-5-6-7-8-5-9-10-11-2-12
展开阅读全文