白盒测试用例练习.docx
《白盒测试用例练习.docx》由会员分享,可在线阅读,更多相关《白盒测试用例练习.docx(24页珍藏版)》请在冰豆网上搜索。
白盒测试用例练习
白盒测试用例练习
白盒测试用例练习
1.为以下所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖,并画出相应的程序流程图。
voidDoWork(intx,inty,intz)
{
intk=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
}
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<102)x>3,z>=10
3)x<=3,z<104)x<=3,z>=10
5)x=4,y>56)x=4,y<=5
7)x!
=4,y>58)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=14j=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),找出基本测试路径。
一、核心程序代码
/**判断三角形的类*/
publicclassTriangleTestMethod{
/**判断三角形的种类。
参数a,b,c分别为三角形的三边,
*返回的参数值为0,表示非三角形;
*为1,表示普通三角形;
*为2,表示等腰三角形;
*为3,表示等边三角形。
*/
publicstaticintcomfirm(inta,intb,intc){
if((a+b>c)&&(b+c>a)&&(a+c>b)){//判断为三角形
if((a==b)&&(b==c))//判断为等边三角形
return3;
if((a==b)||(b==c)||(a==c))//判断为等腰三角形
return2;
else//判断为普通三角形
return1;
}
else{//为非三角形
return0;
}
}
}
二、程序流程图
三、测试用例
1.语句覆盖测试用例
输入
期望输出
覆盖对象
测试结果
Case1
a=1,b=2,c=3
0
1,⑤
0
Case2
a=3,b=4,c=5
1
1,②,④,⑥
2
1
Case3
a=3,b=3,c=4
2
1,②,④,⑦
2
2
Case4
a=3,b=4,c=5
3
1,②,③
2
3
2.判定覆盖测试用例
输入
期望输出
覆盖对象
测试结果
Case11
a=1,b=2,c=3
0
2,⑤
0
Case12
a=3,b=4,c=5
1
3,②,④,⑥
4
1
Case13
a=3,b=3,c=4
2
3,②,④,⑦
4
2
Case14
a=3,b=4,c=5
3
3,②,③
4
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
intcheck(intyear,intmonth,intday){
intpass=1;
intleap=0;
if((year%4==0&&year%100!
=0)||year%400==0)
leap=1;
if(year<1||day<1)return0;
switch(month)
{case1:
case3:
case5:
case7:
case8:
case10:
case12:
if(day>31)return0;break;
case4:
case6:
case9:
case11:
if(day>30)return0;break;
case2:
if(leap==1&&day>29){return0;}
if(leap==0&&day>28){return0;}
break;
default:
return0;break;
}
returnpass;
}
voidfun(){
intyear,month,day,sumday;
sumday=0;
printf("inputyear,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)
{case0:
printf("%d-%d-%disMonday\n",year,month,day);break;
case1:
printf("%d-%d-%disTuesday\n",year,month,day);break;
case2:
printf("%d-%d-%disWednesday\n",year,month,day);break;
case3:
printf("%d-%d-%disThurday\n",year,month,day);break;
case4:
printf("%d-%d-%disFriday\n",year,month,day);break;
case5:
printf("%d-%d-%disSaturday\n",year,month,day);break;
case6:
printf("%d-%d-%disSunday\n",year,month,day);break;
default:
printf("dateerror");break;
}
}
main()
{for(inti=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
0123456其他
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
135781012469112其他
month
returnpass
pass=1;leap=0;
leap=1;
return0
day>31
day>30
return0
no
yes
return0
yes
leap==1&&day>29
leap==0&&day>28
return0
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
201221
Wednesday
Wednesday
(0)②③④⑤⑥⑦⑧
T12,T13,T25,T21,T2,T4,T7
2
201231
Thurday
Thurday
(0)②④⑤⑦⑨
T12,T13,T26,T8
3
201246
Friday
Friday
(0)②④⑤⑦⑩
T12,T13,T27,T9
4
201255
Saturday
Saturday
(0)②④⑤⑦(11)
T12,T13,T28,T10
5
201263
Sunday
Sunday
(0)②④⑤⑦(12)
T12,T13,T29,T11
6
2012730
Monday
Monday
(0)②④⑤⑦(13)
T12,T13,T30,T5
7
2000815
Tuesday
Tuesday
(0)②④⑤⑦(14)
T12,T15,T31,T6
8
2012931
错误提示
错误提示
(0)①
T12,T13,T20,T32
9
201328
Wednesday
Wednesday
⒃⒄⒆(21)(24)(31)(33)
T25,T22,T2,T4,T7
10
2013012
错误提示
错误提示
⒃⒆(34)
T17
11
2013126
Saturday
Saturday
⒃⒆(21)(34)
T18,T1,T3,T10
12
20131033
错误提示
错误提示
⒃⒆(21)(22)(34)
T33,T19
13
20131131
错误提示
错误提示
⒃⒆(21)(23)(34)
T34,T20
14
2012230
错误提示
错误提示
⒃⒆(21)(24)(34)
T12,T13,T25,T21,T23
15
2013229
错误提示
错误提示
⒃⒆(21)(31)(34)
T25,T24
16
20131231
Saturday
Saturday
⒃⒆(21)(22)(33)
T35,T10
17
2013630
Sunday
Sunday
⒃⒆(21)(23)(33)
T29,T11
18
2013215
Friday
Friday
⒃⒆(21)(24)(31)(33)
T25,T22,T2,T4,T9
19
01212
错误提示
错误提示
⒃⒆(34)
T16
题目四:
选择排序
下面是选择排序的程序,其中datalist是数据表,它有两个数据成员:
一是元素类型为Element的数组V,另一个是数组大小n。
算法中用到两个操作,一是取某数组元素V[i]的关键码操作getKey(),一是交换两数组元素内容的操作Swap():
:
voidSelectSort(datalist&list){
/对表list.V[0]到list.V[n-1]进行排序,n是表当前长度。
for(inti=0;iintk=i;//在list.V[i].key到list.V[n-1].key中找具有最小关键码的对象
for(intj=i+1;jif(list.V[j].getKey()if(k!
=i)Swap(list.V[i],list.V[k]);//交换
}
}
(1)试计算此程序段的McCabe复杂性;
(2)用基本路径覆盖法给出测试路径;
(3)为各测试路径设计测试用例。
解答如下:
首先画出程序的流程图
开始
i=0
ij++
k=i
jk=j
k!
=i
Swap(list.V[i],list.V[k])
list.V[j]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
从以上程序图中确定无关的基本路径:
Pa