当前位置:文档之家› 素数判断程序测试范例

素数判断程序测试范例

问题描述:键盘输入m和n(10<m<n<=2000),求出m--n之间的所有素数,且按每行2个数的形式输出。

相应代码:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int m,n,i;
static int k=0;
cout<<"输入m,m(其中10<m<n<=2000)"<<endl;
cin>>m>>n;
while(m<=10||m>=n||n>2000)
{
cout<<"输入数据有误,请再次输入:"<<endl;
cout<<"输入m,m(其中10<m<n<=2000)"<<endl;
cin>>m>>n;
}
for(i=m;i<=n;i++)
{
int x=(int)sqrt((double)i);
for(int j=2;j<=x;j++)
{
if(i%j==0)
{
break;
}
else if(j==x)
{
cout<<i<<"";
k++;
if(k%2==0)
cout<<endl;
}
else
continue;
}
}
cout<<endl;
return 0;
}
一.控制流测试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
但是对于节点“2”的情况,并非所有可能都会取到,因为当A为真时,就不会执行B,依此,生成下表2:
根据表2,得出此部分的取值及路径为:
3、当节点“2”取F时,对整体取路径达到谓词覆盖标准有:
以上路径可以看出,对于单一谓词---节点5,8,9,10,14均取到T,F,加之节点2之前的取值,所有谓词均达到覆盖标准,所以此控制流测试达到谓词覆盖标准。

对于其他区间内的m,n,路径内循环次数增加,但内部循环路径相同。

二.数据流测试
2、根据数据流图,得出节点的def()和c-use()集合:
3、找出边的谓词和p-use集合
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为例):
6、推导出路径谓词表达式为:
根据路径谓词表达式,第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
.........
得到可测试数据较多,不一一列举,只要在范围内均可。

三.域测试
本题的输入为m,n,所以域主要是针对m,n的域,根据复合谓词m<=10||m>=n||n>2000,当次复合谓词取false时,得到路径的正确输入域,即:10<m<n<=2000;
1、依次,画出其大致域为:(虚线,开放区域;实线,封闭区域)
2、根据给出的域,看到和输入参数有关的边界线共有三条:
N<=2000;
M>10;
M<n;
3、考虑到以下几种错误:
①、封闭不等式边界:
A、边界移动导致域减少
B、边界移动导致域增加
C、边界倾斜
D、封闭错误
②、开放不等式边界:
A、边界移动导致域减少
B、边界移动导致域增加
C、边界倾斜
D、封闭错误
③、等式边界
考虑到以上错误,针对域的边界,按照ON-OFF-ON的次序依次选取3个点A,B,C如下:
四.对控制流测试和数据流测试的变异分析
1、数据流和测试流中的用例均能正确执行程序,没有测试失败案例。

2、对程序生成变异体如下表:
以上变异,根据控制流和数据流测试中的测试用例进行测试,均会发现与原结果不同,所以也就是说变异是不正确的,并且他被测试用例杀死。

3、计算测试用例的变异分数:
变异分数=100*(10/(10-0))=100
4、根据3中的变异分数,说明可以不再设计新的测试用例。

相关主题