一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。
包括的内容有:
1) 被测原代码
package main; import java.util.*; public class Demo { public static String triangle(int a,int b,int c){ String result; if( a>=1 &&a<=100&&b>=1&&b<=100&&c>=1&&c<=100){ if(a<b+c &&b<a+c&& c<a+b){ if(a==b || a==c||b==c){ if(a==b &&b==c&&a==c) result = "等边三角形"; else result = "等腰三角形"; }else if(a*a+b*b==c*c || b*b+c*c==a*a || a*a+c*c==b*b){ result = "直角三角形"; }else{ result = "一般三角形"; } }else{ result = "不构成三角形"; } }else{ result = "边的值不在范围内!"; } return result; } public static void main(String[] args) { System.out.println("设计三角形问题的程序"); Scanner sc=new Scanner(System.in); while(true) { try{ System.out.println("请输入三角形的三条边:"); int a=sc.nextInt(); int b=sc.nextInt(); int c=sc.nextInt(); System.out.println(triangle(a,b,c)); }catch(Exception e){ e.printStackTrace(); } } } }
2)依据覆盖技术,测试用例列表:
DD-路径(只压缩链路经)
程序图节点 |
DD-路径 |
1,2 |
A |
3 |
B |
4 |
C |
5 |
D |
6 |
E |
7 |
F |
8,9 |
G |
10 |
H |
11 |
I |
12,13,14 |
J |
15,16,17 |
K |
18,19,20 |
L |
21 |
M |
(I)语句覆盖:
A-B-C-D-E-F-M和A-B-C-D-E-G-M
和A-B-C-D-H-I-M和A-B-C-D-H-J-M
和A-B-C-K-M和A-B-L-M
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
a |
b |
c |
result |
||
1 |
3 |
3 |
3 |
A-B-C-D-E-F-M |
等边三角形 |
2 |
3 |
3 |
4 |
A-B-C-D-E-G-M |
等腰三角形 |
3 |
3 |
4 |
5 |
A-B-C-D-H-I-M |
直角三角形 |
4 |
3 |
4 |
6 |
A-B-C-D-H-J-M |
一般三角形 |
5 |
1 |
1 |
3 |
A-B-C-K-M |
不构成三角形 |
6 |
101 |
99 |
99 |
A-B-L-M |
边的值不在范围内! |
(II)分支覆盖(判断覆盖):
A-B-C-D-E-F-M和A-B-C-D-E-G-M
和A-B-C-D-H-I-M和A-B-C-D-H-J-M
和A-B-C-K-M和A-B-L-M
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
a |
b |
c |
result |
||
1 |
3 |
3 |
3 |
A-B-C-D-E-F-M |
等边三角形 |
2 |
3 |
3 |
4 |
A-B-C-D-E-G-M |
等腰三角形 |
3 |
3 |
4 |
5 |
A-B-C-D-H-I-M |
直角三角形 |
4 |
3 |
4 |
6 |
A-B-C-D-H-J-M |
一般三角形 |
5 |
1 |
1 |
3 |
A-B-C-K-M |
不构成三角形 |
6 |
101 |
99 |
99 |
A-B-L-M |
边的值不在范围内! |
(III)路径覆盖:
A-B-C-D-E-F-M和A-B-C-D-E-G-M
和A-B-C-D-H-I-M和A-B-C-D-H-J-M
和A-B-C-K-M和A-B-L-M
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
a |
b |
c |
result |
||
1 |
3 |
3 |
3 |
A-B-C-D-E-F-M |
等边三角形 |
2 |
3 |
3 |
4 |
A-B-C-D-E-G-M |
等腰三角形 |
3 |
3 |
4 |
5 |
A-B-C-D-H-I-M |
直角三角形 |
4 |
3 |
4 |
6 |
A-B-C-D-H-J-M |
一般三角形 |
5 |
1 |
1 |
3 |
A-B-C-K-M |
不构成三角形 |
6 |
101 |
99 |
99 |
A-B-L-M |
边的值不在范围内! |
(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 |
T |
F |
F |
F |
F |
F |
F |
B-C |
2 |
T |
T |
F |
F |
F |
F |
F |
B-L |
3 |
T |
T |
T |
F |
F |
F |
F |
B-L |
4 |
T |
T |
T |
T |
F |
F |
F |
B-L |
5 |
T |
T |
T |
T |
T |
F |
F |
B-L |
6 |
T |
T |
T |
T |
T |
T |
F |
B-L |
7 |
T |
T |
T |
T |
T |
T |
T |
B-C |
总共2^6总选择 |
编号 |
a<b+c |
b<a+c |
c<a+b |
a<b+c &&b<a+c&& c<a+b |
覆盖路径 |
1 |
T |
F |
F |
F |
C-K |
2 |
T |
T |
F |
F |
C-K |
3 |
T |
T |
T |
T |
C-D |
4 |
T |
F |
T |
F |
C-K |
5 |
F |
F |
F |
F |
C-K |
6 |
F |
T |
F |
F |
C-K |
7 |
F |
F |
T |
F |
C-K |
8 |
F |
T |
T |
F |
C-K |
编号 |
a==b |
a==c |
b==c |
a==b || a==c||b==c |
覆盖路径 |
1 |
T |
F |
F |
T |
D-E |
2 |
T |
T |
F |
T |
D-E |
3 |
T |
T |
T |
T |
D-E |
4 |
T |
F |
T |
T |
D-E |
5 |
F |
F |
F |
F |
D-H |
6 |
F |
T |
F |
T |
D-E |
7 |
F |
F |
T |
T |
D-E |
8 |
F |
T |
T |
T |
D-E |
编号 |
a==b |
b==c |
a==b &&b==c |
覆盖路径 |
1 |
F |
F |
F |
E-G |
2 |
F |
T |
F |
E-G |
3 |
T |
F |
F |
E-G |
4 |
T |
T |
T |
E-F |
编号 |
a*a+b*b==c*c |
b*b+c*c==a*a |
a*a+c*c==b*b |
a*a+b*b==c*c || b*b+c*c==a*a || a*a+c*c==b*b |
覆盖路径 |
1 |
T |
F |
F |
T |
H-I |
2 |
T |
T |
F |
T |
H-I |
3 |
T |
T |
T |
T |
H-I |
4 |
T |
F |
T |
T |
H-I |
5 |
F |
F |
F |
F |
H-J |
6 |
F |
T |
F |
T |
H-I |
7 |
F |
F |
T |
T |
H-I |
8 |
F |
T |
T |
T |
H-I |
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
||
a |
b |
c |
result |
||
1 |
3 |
3 |
3 |
A-B-C-D-E-F-M |
等边三角形 |
2 |
3 |
3 |
4 |
A-B-C-D-E-G-M |
等腰三角形 |
3 |
3 |
4 |
5 |
A-B-C-D-H-I-M |
直角三角形 |
4 |
3 |
4 |
6 |
A-B-C-D-H-J-M |
一般三角形 |
5 |
1 |
1 |
3 |
A-B-C-K-M |
不构成三角形 |
6 |
101 |
99 |
99 |
A-B-L-M |
边的值不在范围内! |
共2^17种 |
3)相应Junit测试脚本、执行结果
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
public class test1Test {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test
public final void testTriangle() {
//fail("Not yet implemented"); // TODO
assertEquals("等边三角形",test1.triangle(3,3,3));
assertEquals("等腰三角形",test1.triangle(3,3,4));
assertEquals("直角三角形",test1.triangle(3,4,5));
assertEquals("一般三角形",test1.triangle(3,4,6));
assertEquals("不构成三角形",test1.triangle(1,1,3));
assertEquals("边的值不在范围内!",test1.triangle(101,99,99));
}
}
4)给出测试参数化和打包测试的脚本,并生成执行结果
4、测试小结:
- 测试找到的缺陷清单
- 对源代码的修改建议:
- 测试总结与心得体会:
(1)条件覆盖中会随着一个判断语句中条件的增多呈指数上升,很难手工全测试完。(2)各种覆盖方式容易重合,造成测试冗余。