素数判断程序测试范例.docx
《素数判断程序测试范例.docx》由会员分享,可在线阅读,更多相关《素数判断程序测试范例.docx(14页珍藏版)》请在冰豆网上搜索。
素数判断程序测试范例
问题描述:
键盘输入m和n(10相应代码:
#include
#include
usingnamespacestd;
intmain()
{
intm,n,i;
staticintk=0;
cout<<"输入m,m(其中10cin>>m>>n;
while(m<=10||m>=n||n>2000)
{
cout<<"输入数据有误,请再次输入:
"<cout<<"输入m,m(其中10cin>>m>>n;
}
for(i=m;i<=n;i++)
{
intx=(int)sqrt((double)i);
for(intj=2;j<=x;j++)
{
if(i%j==0)
{
break;
}
elseif(j==x)
{
cout<
k++;
if(k%2==0)
cout<}
else
continue;
}
}
cout<return0;
}
一.控制流测试
1、控制流图如下:
2、根据以上控制流图:
因为控制流的1-2-3-2部分为用户输入的m,n的重复赋值过程,与输入数据密切相关且每次取值不同,关系到控制流测试,所以将此独立出来:
以为节点“2”的复合谓词为或的关系,全为false时只有一种情况,而为true时有7种情况,对“2”的复合谓词(m<=10||m>=n||n>2000)为真假时其表1如下:
设A:
m<=10;B:
m>=n;C:
n>2000
情况
A
B
C
节点2
1
T
T
T
T
2
T
T
F
T
3
T
F
F
T
4
T
F
T
T
5
F
T
T
T
6
F
T
F
T
7
F
F
T
T
8
F
F
F
F
但是对于节点“2”的情况,并非所有可能都会取到,因为当A为真时,就不会执行B,依此,生成下表2:
情况
A
B
C
节点2
1
T
-
-
T
2
F
T
-
T
3
F
F
T
T
4
F
F
F
F
根据表2,得出此部分的取值及路径为:
M
N
路径
备注
8
3
1-2(T)-3-2---
A=T,B=T,C=F
12
3000
1-2(T)-3-2---
A=F,B=F,C=T
11
13
1-2(F)-4---
A=F,B=F,C=F
12
3
1-2(T)-3-2
Z=F,B=T.C=F
3、当节点“2”取F时,对整体取路径达到谓词覆盖标准有:
M
N
路径
11
13
1-2(F)-4-5(T)-6-7-8(T)-9(F)-10(F)-13-16-8(T)-9(F)-10(T)-12-14(F)-16-8(F)-17-5(T)-6-7-8(T)-9(T)-11-17-5(T)-6-7-8(T)-9(F)-10(F)-13-16-8(T)-9(F)-10(T)-12-14(T)-15-16-8(F)-17-5(F)-18-19
以上路径可以看出,对于单一谓词---节点5,8,9,10,14均取到T,F,加之节点2之前的取值,所有谓词均达到覆盖标准,所以此控制流测试达到谓词覆盖标准。
对于其他区间内的m,n,路径内循环次数增加,但内部循环路径相同。
二.数据流测试
1、数据流图:
2、根据数据流图,得出节点的def()和c-use()集合:
节点
Ded(i)
C-use(i)
1
{m,n,i,k}
{}
2
{}
{}
3
{m,n}
{}
4
{i}
{m}
5
{}
{}
6
{x}
{i}
7
{}
{}
8
{}
{}
9
{j}
{}
10
{}
{}
11
{}
{}
12
{i}
{i}
13
{}
{}
14
{}
{}
15
{k}
{k}
16
{}
{}
17
{}
{}
18
{}
{}
19
{j}
{j}
3、找出边的谓词和p-use集合
边(i,j)
Predicate(i,j)
p-use(i)
(1,2)
true
{}
(2,3)
{m<=10||m>=n||n>2000}
{m,n}
(3,2)
true
{}
(2,4)
~{m<=10||m>=n||n>2000}
{m,n}
(4,5)
true
{}
(5,6)
(i{i,n}
(5,7)
~(i{i,n}
(7,8)
true
{}
(6,9)
true
{}
(9,10)
true
{}
(10,11)
(j<=x)
{i,j}
(10,12)
~(j<=x)
{i.j}
(12,5)
true
{}
(11,14)
~(i%j==0)
{j,x}
(11,13)
(i%j==0)
{j,x}
(13,12)
true
{}
(14,16)
~(j==x)
{j,x}
(14,15)
(j==x)
{j,x}
(15,17)
true
{}
(16,19)
true
{}
(17,19)
~(k%2)==0
{k}
(17,18)
(k%2)==0
{k}
(19,10)
true
{}
4.根据代码,可知共有变量i,j,k,不列举其all-c-use和all-p-use.直接写出其all-uses,其循环次数不一定只有一次,因为循环时内部路径相同,都写出来路径太长太繁琐,所以以一次为基准,循环不定,可以是任意次。
对于变量i:
节点1,4,12有其定义,节点6,12有其c-use,边(5,6),(5,7),(11,13),(11,14)有其p-use,所以包含其all-p-use和其all-c-use的即为其all-uses:
1-2-4-5-6-9-10-12-5-7-8;
1-2-4-5-6-9-10-11-13-12-5-7-8;
1-2-4-5-6-9-10-11-14-15-17-19-10-12-5-7-8;
1-2-4-5-6-9-10-11-14-15-17-18-19-10-12-5-7-8;
1-2-4-5-6-9-10-11-14-15-17-16-19-10-12-5-7-8;
1-2-3-2-4-5-6-9-10-12-5-7-8;
1-2-3-2-4-5-6-9-10-11-13-12-5-7-8;
1-2-3-2-4-5-6-9-10-11-14-15-17-19-10-12-5-7-8;
1-2-3-2-4-5-6-9-10-11-14-15-17-18-19-10-12-5-7-8;
1-2-3-2-4-5-6-9-10-11-14-15-17-16-19-10-12-5-7-8;
对于变量j:
节点9,19有其定义,节点19有其c-use,边(10,11),(10,12),(11,13),(11,14)(14,16),(14,15)有其p-use,所以包含其all-p-use和其all-c-use的即为其all-uses:
1-2-4-5-6-9-10-11-14-16-19-10-12-5-7-8;
1-2-4-5-6-9-10-11-14-15-17-18-19-10-12-5-7-8;
1-2-4-5-6-9-10-00-14-15-17-19-10-12-5-7-8;
1-2-3-2-4-5-6-9-10-11-14-16-19-10-12-5-7-8;
1-2-3-2-4-5-6-9-10-11-14-15-17-18-19-10-12-5-7-8;
1-2-3-2-4-5-6-9-10-00-14-15-17-19-10-12-5-7-8;
对于变量k:
节点1,15有其定义,节点15有其c-use,边(17,18),(17,19)有其p-use,所以包含其all-p-use和其all-c-use的即为其all-uses:
1-2-4-5-6-9-10-11-14-15-17-18-19-10-12-5-7-8;
1-2-3-2-4-5-6-9-10-11-14-15-17-18-19-10-12-5-7-8;
综上:
综上,变量k,i,j均包含的路径,即最后确定的数据流路径只有两条:
其中的循环次数根据需要而定。
路径1:
1-2-4-5-6-9-10-11-14-15-17-18-19-10-12-5-7-8;
路径2:
1-2-3-2-4-5-6-9-10-11-14-15-17-18-19-10-12-5-7-8;
其对应的控制流路径为(其中的路径编号均为控制流图编号依此生成谓词解释):
1-2(F)-4-5(T)-6-7-8(T)-9(F)-10(T)-12-14(T)-15-16-8(F)-17-5(F)-18-19;
1-2(T)-3-2(F)-4-5(T)-6-7-8(T)-9(F)-10(T)-12-14(T)-15-16-8(F)-17-5(F)-18-19
5、路径谓词解释为(以路径1为例):
节点
节点描述
解释描述
1
初始化m,n,i,k=0;
2(F)
M<=10||m>=n||n>2000;?
104
i=m;
i=m;
5(T)
ii6
Intx=(int)sqrt(double(i))
Intx=(int)sqrt(double(m))
7
Intj=2;
J=2
8(T)
J<=x?
J<=(int)sqrt(double(m))
9(F)
I%j==0?
M%2!
=0
10(T)
J==x?
2==(int)sqrt(double(m))
12
Cout<
Cout<14(T)
k%2==0?
1%2!
=0
15
Cout<16
J++
J=3
8(F)
J<=x?
J>(int)sqrt(double(m))
17
I++
I=m+1
5(F)
II>=n
18
Cout<19
Return0;
6、推导出路径谓词表达式为:
1
102
i3
J<=(int)sqrt(double(m)).....true
4
M%2!
=0......false
5
2==(int)sqrt(double(m))......true
6
1%2!
=0.....true
7
J>(int)sqrt(double(m))......false
8
I>=n
根据路径谓词表达式,第6行可知,k%2不能恒等于0,而k又是根据输入的数据中素数的个数来累加起来的数据,只有当m----n之间有大于两个素数时才会有此条件,所以判定,目前路径不合理,应至少有两次循环才能使上述谓词表达式成立。
7、求解表达式得到测试输入数据:
对于路径1:
根据第6步的推理,可知m----n之间有大于两个素数必须成立,所以选择输入数据为:
M=11,n=13
M=11,n=1000;
M=20,n=40;
M=100,n=1800;
........
得到可测试数据较多,不一一列举,只要在范围内均可。
对于路径2:
根据推理,可知第一次输入,m,n的值不符合要求,1次或多次循环之后才能达到要求,达到要求后m,n之间有大于两个素数必须成立,所以选择输入数据为:
M=2,n=1(不成立)--------------------(接着输入)m=12,n=33
M=13,n=3000(不成立)--------------------(接着输入)m=50,n=66
M=8,n=15(不成立)--------------------(接着输入)m=66,n=99
.........
得到可测试数据较多,不一一列举,只要在范围内均可。
3.域测试
本题的输入为m,n,所以域主要是针对m,n的域,根据复合谓词m<=10||m>=n||n>2000,当次复合谓词取false时,得到路径的正确输入域,即:
101、依次,画出其大致域为:
(虚线,开放区域;实线,封闭区域)
N<=2000
M>10
m<=2000
N>10
M2、根据给出的域,看到和输入参数有关的边界线共有三条:
N<=2000;
M>10;
M3、考虑到以下几种错误:
①、封闭不等式边界:
A、边界移动导致域减少
B、边界移动导致域增加
C、边界倾斜
D、封闭错误
②、开放不等式边界:
A、边界移动导致域减少
B、边界移动导致域增加
C、边界倾斜
D、封闭错误
③、等式边界
考虑到以上错误,针对域的边界,按照ON-OFF-ON的次序依次选取3个点A,B,C如下:
边界
选取ON-OFF-ON点
N<=2000
A(11,2000);
B(10,2000);
C(2000,2000);
M>10
A(11,11);
B(1000,1001);
C(1999,1998)
MA(10,11);
B(11,12);
C(9,11)
4.对控制流测试和数据流测试的变异分析
1、数据流和测试流中的用例均能正确执行程序,没有测试失败案例。
2、对程序生成变异体如下表:
变异体序号
原语句
变异体
测试用例
是否被杀死
1
For(i=m,i<=n,i++)
For(i=m,i11,13
T(结果不同)
2
Intk=0;
Intk=1;
11,13
T(结果不同)
3
Intj=2;
Intj=1;
11,13
T(结果不同)
4
For(j=2;j<=x;j++)
For(j=2;j11,13
T(结果不同)
5
If(i%j==0)
If(i%j>=0)
11,13
T(结果不同)
6
Elseif(j==x)
Elseif(j>=x)
11,13
T(结果不同)
7
If(k%2==0)
If(k%3==0)
20,40
T(结果不同)
8
while(m<=10||m>=n||n>2000)
while(m<=10||m>n||n>2000)
11,11
T(结果不同)
9
while(m<=10||m>=n||n>2000)
while(m<10||m>=n||n>2000)
10,13
T(结果不同)
10
while(m<=10||m>=n||n>2000)
while(m<=10||m>=n||n>=2000)
10,2000
T(结果不同)
以上变异,根据控制流和数据流测试中的测试用例进行测试,均会发现与原结果不同,所以也就是说变异是不正确的,并且他被测试用例杀死。
3、计算测试用例的变异分数:
变异分数=100*(10/(10-0))=100
4、根据3中的变异分数,说明可以不再设计新的测试用例。