实验二+161+张丽霞
一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
(1)被测源代码:
1 public static String triangle(int a, int b, int c){ 2 String result; 3 if (a >= 1 && a <= 100 && b >= 1 && b <= 100 && c >= 1 && c <= 100){ 4 if (a<(b + c) && b < (a + c) && c < (a + b)){ 5 if (a == b && b == c) { 6 result = "等边三角形"; 7 } 8 else if (a == b || a == c || b == c){ 9 result = "等腰三角形"; 10 } 11 else if (a * a == (b * b + c * c) || b * b == (a * a + c * c) || c * c ==( a * a + b * b)){ 12 result = "直角三角形"; 13 } 14 else{ 15 result = "一般三角形"; 16 } 17 } 18 else{ 19 result = "不构成三角形"; 20 } 21 } 22 else{ 23 result = "边的值不在范围内"; 24 } 25 return result; 26 }
程序图:
DD路径图:
DD-路径(只压缩链路经)
程序图节点 |
DD-路径 |
2 |
A |
3 |
B |
4 |
C |
5 |
D |
6,7 |
E |
8 |
F |
9,10 |
G |
11 |
H |
12,13 |
I |
14,15,16 |
J |
17 |
K |
18,19,20 |
L |
21 |
M |
22,23,24 |
N |
25 |
O |
26 |
P |
(2)测试用例:
(I)语句覆盖:
ABNOP、ABCDEKMOP、ABCDFGKMOP
ABCDFHIKMOP、ABCDFHJKMOP、ABCLMOP
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
a |
b |
c |
result |
||
1 |
101 |
99 |
98 |
A-B-N-O-P |
边的值不在范围内 |
2 |
6 |
6 |
6 |
A-B-C-D-E-K-M-O-P |
等边三角形 |
3 |
6 |
6 |
8 |
A-B-C-D-F-G-K-M-O-P |
等腰三角形 |
4 |
3 |
4 |
5 |
A-B-C-D-F-H-I-K-M-O-P |
直角三角形 |
5 |
3 |
5 |
6 |
A-B-C-D-F-H-J-K-M-O-P |
一般三角形 |
6 |
11 |
2 |
3 |
A-B-C-L-M-O-P |
不构成三角形 |
(II)分支覆盖(判断覆盖):
ABNOP、ABCDEKMOP、ABCDFGKMOP
ABCDFHIKMOP、ABCDFHJKMOP、ABCLMOP
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
a |
b |
c |
result |
||
1 |
0 |
2 |
5 |
A-B-N-O-P |
边的值不在范围内 |
2 |
5 |
5 |
5 |
A-B-C-D-E-K-M-O-P |
等边三角形 |
3 |
4 |
4 |
3 |
A-B-C-D-F-G-K-M-O-P |
等腰三角形 |
4 |
6 |
8 |
10 |
A-B-C-D-F-H-I-K-M-O-P |
直角三角形 |
5 |
9 |
7 |
6 |
A-B-C-D-F-H-J-K-M-O-P |
一般三角形 |
6 |
1 |
1 |
2 |
A-B-C-L-M-O-P |
不构成三角形 |
(III)路径覆盖:
ABNOP、ABCDEKMOP、ABCDFGKMOP
ABCDFHIKMOP、ABCDFHJKMOP、ABCLMOP
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
a |
b |
c |
result |
||
1 |
101 |
101 |
101 |
A-B-N-O-P |
边的值不在范围内 |
2 |
7 |
7 |
7 |
A-B-C-D-E-K-M-O-P |
等边三角形 |
3 |
8 |
8 |
9 |
A-B-C-D-F-G-K-M-O-P |
等腰三角形 |
4 |
3 |
4 |
5 |
A-B-C-D-F-H-I-K-M-O-P |
直角三角形 |
5 |
4 |
5 |
6 |
A-B-C-D-F-H-J-K-M-O-P |
一般三角形 |
6 |
2 |
1 |
3 |
A-B-C-L-M-O-P |
不构成三角形 |
(IV)条件覆盖:各个条件取真或假的可能至少执行一次
编号 |
a>=1 |
a<=100 |
b>=1 |
b<=100 |
c>=1 |
c<=100
|
a>=1 &&a<=100&&b>=1 &&b<=100&&c>=1&&c<=100 |
覆盖路径 |
1 |
F |
F |
F |
F |
F |
F |
F |
B-N |
2 |
T |
F |
F |
F |
F |
F |
F |
B-N |
3 |
T |
T |
F |
F |
F |
F |
F |
B-N |
4 |
T |
T |
T |
F |
F |
F |
F |
B-N |
5 |
T |
T |
T |
T |
F |
F |
F |
B-N |
6 |
T |
T |
T |
T |
T |
F |
F |
B-N |
7 |
T |
T |
T |
T |
T |
T |
F |
B-N |
8 |
T |
T |
T |
T |
T |
T |
T |
B-C |
编号 |
a<(b+c) |
b<(a+c) |
c<(a+b) |
a<(b+c) &&b<(a+c)&& c<(a+b) |
覆盖路径 |
1 |
F |
F |
F |
F |
C-L-M |
2 |
T |
F |
F |
F |
C-L-M |
3 |
T |
T |
F |
F |
C-L-M |
4 |
T |
T |
T |
T |
C-D |
5 |
F |
F |
T |
F |
C-L-M |
6 |
F |
T |
T |
F |
C-L-M |
7 |
T |
F |
T |
F |
C-L-M |
8 |
F |
T |
F |
F |
C-L-M |
编号 |
a==b |
b==c |
a==b &&b==c |
覆盖路径 |
1 |
T |
T |
T |
D-E-K |
2 |
T |
F |
F |
D-F |
3 |
F |
T |
F |
D-F |
4 |
F |
F |
F |
D-F |
编号 |
a==b |
a==c |
b==c |
a==b || a==c || b==c |
覆盖路径 |
1 |
T |
F |
F |
T |
F-G-K |
2 |
F |
T |
F |
T |
F-G-K |
3 |
F |
F |
T |
T |
F-G-K |
4 |
F |
F |
F |
F |
F-H |
编号 |
a*a==b*b+c*c |
b*b==a*a+c*c |
c*c==a*a+b*b |
a*a==b*b+c*c || b*b==a*a +c*c|| c*c==a*a+b*b |
覆盖路径 |
1 |
T |
F |
F |
T |
H-I-K |
2 |
F |
T |
F |
T |
H-I-K |
3 |
F |
F |
T |
T |
H-I-K |
4 |
F |
F |
F |
F |
H-J-K |
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
a |
b |
c |
result |
||
1 |
101 |
100 |
99 |
A-B-N-O-P |
边的值不在范围内 |
2 |
9 |
9 |
9 |
A-B-C-D-E-K-M-O-P |
等边三角形 |
3 |
9 |
9 |
10 |
A-B-C-D-F-G-K-M-O-P |
等腰三角形 |
4 |
3 |
4 |
5 |
A-B-C-D-F-H-I-K-M-O-P |
直角三角形 |
5 |
6 |
4 |
7 |
A-B-C-D-F-H-J-K-M-O-P |
一般三角形 |
6 |
1 |
21 |
20 |
A-B-C-L-M-O-P |
不构成三角形 |
(3)相应Junit测试脚本:
1 package softtest; 2 3 import static org.junit.Assert.*; 4 import org.junit.Before; 5 import org.junit.Test; 6 7 public class JudgeTriangleTest { 8 9 @Before 10 public void setUp() throws Exception { 11 12 } 13 14 @Test 15 public void testJudge() { 16 String[] str1={"2","3","4"}; 17 String[] str2={"1","2","3","4"}; 18 String[] str3={"1","2","%"}; 19 assertTrue("true",JudgeTriangle.Judge(str1)); 20 assertFalse("false",JudgeTriangle.Judge(str2)); 21 assertFalse("false",JudgeTriangle.Judge(str3)); 22 //fail("Not yet implemented"); 23 } 24 25 @Test 26 public void testTriangle() { 27 assertEquals(JudgeTriangle.triangle(92, 101,99),"边的值不在范围内"); 28 assertEquals(JudgeTriangle.triangle(0, 1,2),"边的值不在范围内"); 29 assertEquals(JudgeTriangle.triangle(99,98,102),"边的值不在范围内"); 30 assertEquals(JudgeTriangle.triangle(6, 6, 6),"等边三角形"); 31 32 assertEquals(JudgeTriangle.triangle(3, 3, 5),"等腰三角形"); 33 assertEquals(JudgeTriangle.triangle(3, 5, 5),"等腰三角形"); 34 assertEquals(JudgeTriangle.triangle(6, 5, 6),"等腰三角形"); 35 36 assertEquals(JudgeTriangle.triangle(3, 4, 5),"直角三角形"); 37 assertEquals(JudgeTriangle.triangle(10, 6, 8),"直角三角形"); 38 assertEquals(JudgeTriangle.triangle(12, 20, 16),"直角三角形"); 39 40 assertEquals(JudgeTriangle.triangle(2, 4, 5),"一般三角形"); 41 assertEquals(JudgeTriangle.triangle(1, 1, 2),"不构成三角形"); 42 43 //fail("Not yet implemented"); 44 } 45 }
(4)测试小结:
(1)对源代码的修改建议:
I)程序是一直处于循环状态,建议增加退出循环的功能,而不是要我关闭程序才退出;
II)在java中可以采用try catch来判断输入的是否是整数类型和提示异常;
III)建议给输入的三条边排序,这样会减少很多判断条件。
(2)测试找到的缺陷清单:无。
(3)总结与心得体会:
I)当判断条件越来越多时,条件覆盖就很难完全测完;
II)在画完流程图,观察后发现满足语句覆盖的测试用例就可以满足路径覆盖、判定覆盖、组合覆盖等。所以在测试过程中,有可能会出现多种覆盖方式的测试路径一样。
III)在写程序时,一直只想着程序可以编译成功,正确运行就可以了,而很多小细节都不会去考虑到。有时候判断条件有很多时,自己运行正常了就觉得程序写好,而在测试时,如在做条覆盖时,测试人员要对每一个判断条件进行真与假的执行一遍设计测试用例,就要考虑很多的情况。