素数判断程序测试范例.docx

上传人:b****5 文档编号:7666866 上传时间:2023-01-25 格式:DOCX 页数:14 大小:108.91KB
下载 相关 举报
素数判断程序测试范例.docx_第1页
第1页 / 共14页
素数判断程序测试范例.docx_第2页
第2页 / 共14页
素数判断程序测试范例.docx_第3页
第3页 / 共14页
素数判断程序测试范例.docx_第4页
第4页 / 共14页
素数判断程序测试范例.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

素数判断程序测试范例.docx

《素数判断程序测试范例.docx》由会员分享,可在线阅读,更多相关《素数判断程序测试范例.docx(14页珍藏版)》请在冰豆网上搜索。

素数判断程序测试范例.docx

素数判断程序测试范例

问题描述:

键盘输入m和n(10

相应代码:

#include

#include

usingnamespacestd;

intmain()

{

intm,n,i;

staticintk=0;

cout<<"输入m,m(其中10

cin>>m>>n;

while(m<=10||m>=n||n>2000)

{

cout<<"输入数据有误,请再次输入:

"<

cout<<"输入m,m(其中10

cin>>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;?

10

4

i=m;

i=m;

5(T)

i

i

6

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)

I

I>=n

18

Cout<

19

Return0;

6、推导出路径谓词表达式为:

1

10

2

i

3

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时,得到路径的正确输入域,即:

10

1、依次,画出其大致域为:

(虚线,开放区域;实线,封闭区域)

N<=2000

M>10

m<=2000

N>10

M

2、根据给出的域,看到和输入参数有关的边界线共有三条:

N<=2000;

M>10;

M

3、考虑到以下几种错误:

①、封闭不等式边界:

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)

M

A(10,11);

B(11,12);

C(9,11)

 

4.对控制流测试和数据流测试的变异分析

1、数据流和测试流中的用例均能正确执行程序,没有测试失败案例。

2、对程序生成变异体如下表:

 

变异体序号

原语句

变异体

测试用例

是否被杀死

1

For(i=m,i<=n,i++)

For(i=m,i

11,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;j

11,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中的变异分数,说明可以不再设计新的测试用例。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1