实验二-160-曾元鹏
被测代码链接:http://www.cnblogs.com/WuYeqian/p/6618858.html
一、实验目的
掌握覆盖测试的基本方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
(1)设计某程序的路径覆盖测试用例,如路径覆盖、条件覆盖、分支覆盖、循环覆盖等
伪代码程序如下:
9 public static String triangle(int a,int b,int c){
10 if(a<1 || a>100 ||b<1 || b>100|| c<1|| c>100){
11 return t1;
12 }
13 else if(a>=b+c ||b>=a+c||c>=a+b){
14 return t2;
15 }
16 else if(a==b &&b==c &&c==a){
17 return t3;
18 }
19 else if(a==b ||b==c ||c==a){
20 return t4;
21 }
22 else if(a*a+b*b==c*c ||b*b+c*c==a*a ||c*c+a*a==b*b){
23 return t5;
24 }
25 else {
26 return t6;
27 }
28 }
DD-路径(只压缩链路经)
程序图节点 |
DD-路径 |
9 |
A |
10 |
B |
11.12.13 |
C |
14 |
D |
15.16.17 |
E |
18 |
F |
19.20 |
G |
21 |
H |
22.23 |
I |
24 |
J |
25.26 |
K |
27.28.29 |
L |
30 |
M |
(I)语句覆盖:
A-B-D-F-H-J-L-M 和A-B-D-F-H-J-K-M
A-B-D-F-H-I-M 和 A-B-D-F-G-M
A-B-D-E-M 和 A-B-C-M
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
实际输出 |
||
a |
b |
c |
X |
Y |
||
1 |
5 |
7 |
8 |
A-B-D-F-H-J-L-M |
一般三角形 |
一般三角形 |
2 |
3 |
5 |
4 |
A-B-D-F-H-J-K-M |
直角三角形 |
直角三角形 |
3 |
5 |
6 |
6 |
A-B-D-F-H-I-M |
等腰三角形 |
等腰三角形 |
4 |
30 |
30 |
30 |
A-B-D-F-G-M |
等边三角形 |
等边三角形 |
5 |
5 |
5 |
15 |
A-B-D-E-M |
不构成三角形 |
不构成三角形 |
6 |
120 |
55 |
30 |
A-B-C-M |
边值不在范围 |
边值不在范围 |
(II)分支覆盖(判断覆盖):
A-B-C-M(1.左)
A-B-D-E-M(1.右,2.左)
A-B-D-E-G-M(1.右,2.右,3左)
A-B-D-F-H-I-M(1.右,2.右,3右,4左)
A-B-D-F-H-J-K-M(1.右,2.右,3右,4右,5左)
A-B-D-F-H-J-L-M(1.右,2.右,3右,4右,5右)
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
实际输出 |
||
A |
B |
C |
X |
Y |
||
1 |
20 |
30 |
110 |
A-B-C-M |
边值不在范围 |
边值不在范围 |
2 |
10 |
22 |
10 |
A-B-D-E-M |
不构成三角形 |
不构成三角形 |
3 |
70 |
70 |
70 |
A-B-D-E-G-M |
等边三角形 |
等边三角形 |
4 |
30 |
50 |
30 |
A-B-D-F-H-I-M |
等腰三角形 |
等腰三角形 |
5 |
5 |
12 |
13 |
A-B-D-F-H-J-K-M |
直角三角形 |
直角三角形 |
6 |
50 |
60 |
55 |
A-B-D-F-H-J-L-M |
一般三角形 |
一般三角形 |
(III)路径覆盖:
A-B-C-M(1.左)
A-B-D-E-M(1.右,2.左)
A-B-D-E-G-M(1.右,2.右,3左)
A-B-D-F-H-I-M(1.右,2.右,3右,4左)
A-B-D-F-H-J-K-M(1.右,2.右,3右,4右,5左)
A-B-D-F-H-J-L-M(1.右,2.右,3右,4右,5右)
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
实际输出 |
||
A |
B |
C |
X |
Y |
||
1 |
22 |
33 |
130 |
A-B-C-M |
边值不在范围 |
边值不在范围 |
2 |
30 |
22 |
60 |
A-B-D-E-M |
不构成三角形 |
不构成三角形 |
3 |
5 |
5 |
5 |
A-B-D-E-G-M |
等边三角形 |
等边三角形 |
4 |
25 |
40 |
25 |
A-B-D-F-H-I-M |
等腰三角形 |
等腰三角形 |
5 |
12 |
5 |
13 |
A-B-D-F-H-J-K-M |
直角三角形 |
直角三角形 |
6 |
6 |
3 |
5 |
A-B-D-F-H-J-L-M |
一般三角形 |
一般三角形 |
(IV)条件覆盖:各个条件取真或假的可能至少执行一次((F/T表示真假都一样))
第一个条件:
编号 |
a<1 |
a>100 |
b<1 |
b>100 |
c<1 |
c>100 |
覆盖路径 |
1 |
T |
F/T |
F/T |
F/T |
F/T |
F/T |
A-B-C-M |
2 |
F/T |
T |
F/T |
F/T |
F/T |
F/T |
A-B-C-M |
3 |
F/T |
F/T |
T |
F/T |
F/T |
F/T |
A-B-C-M |
4 |
F/T |
F/T |
F/T |
T |
F/T |
F/T |
A-B-C-M |
5 |
F/T |
F/T |
F/T |
F/T |
T |
F/T |
A-B-C-M |
6 |
F/T |
F/T |
F/T |
F/T |
F/T |
T |
A-B-C-M |
7 |
F |
F |
F |
F |
F |
F |
A-B-D |
第二个条件:
编号 |
a>=b+c |
b>=a+c |
c>=a+b |
覆盖路径 |
1 |
T |
F/T |
F/T |
A-B-D-E-M |
2 |
F/T |
T |
F/T |
A-B-D-E-M |
3 |
F/T |
F/T |
T |
A-B-D-E-M |
4 |
F |
F |
F |
A-B-D-F |
第三个条件:
编号 |
a==b |
b==c |
c==a |
覆盖路径 |
1 |
T |
T |
T |
A-B-D-F-G-M |
2 |
F |
T/F |
F/T |
A-B-D-F-H |
3 |
F/T |
F |
F/T |
A-B-D-E-M |
4 |
F/T |
F/T |
F |
A-B-D-F |
第四个条件:
编号 |
a==b |
b==c |
c==a |
覆盖路径 |
1 |
T |
T/F |
F |
A-B-D-F-H-I-M |
2 |
T |
F |
F/T |
A-B-D-F-H-I-M |
3 |
F/T |
T |
F |
A-B-D-F-H-I-M |
4 |
F |
T |
F/T |
A-B-D-F-H-I-M |
|
F/T |
F |
T |
A-B-D-F-H-I-M |
|
F |
F/T |
T |
A-B-D-F-H-I-M |
|
F |
F |
F |
A-B-D-F-H-J |
第五个条件:
编号 |
a*a+b*b==c*c |
b*b+c*c==a*a |
c*c+a*a==b*b |
覆盖路径 |
1 |
T |
F/T |
F/T |
A-B-D-F-H-J-K-M |
2 |
F/T |
T |
F/T |
A-B-D-F-H-J-K-M |
3 |
F/T |
F/T |
T |
A-B-D-F-H-J-K-M |
4 |
F |
F |
F |
A-B-D-F-H-J-L-M |
测试用例:
用例ID |
输入值 |
执行路径 |
预期输出 |
实际输出 |
||
A |
B |
C |
X |
Y |
||
1 |
22 |
33 |
130 |
A-B-C-M |
边值不在范围 |
边值不在范围 |
2 |
30 |
22 |
60 |
A-B-D-E-M |
不构成三角形 |
不构成三角形 |
3 |
5 |
5 |
5 |
A-B-D-F-G-M |
等边三角形 |
等边三角形 |
4 |
25 |
40 |
25 |
A-B-D-F-H-I-M |
等腰三角形 |
等腰三角形 |
5 |
12 |
5 |
13 |
A-B-D-F-H-J-K-M |
直角三角形 |
直角三角形 |
6 |
6 |
3 |
5 |
A-B-D-F-H-J-L-M |
一般三角形 |
一般三角形 |
(2)根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。
所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法
1) 被测原代码
public class Client { public static void main(String[] args) throws Exception { new Menu(); } } public class IsInteger { public static boolean IsNum(String str) { if(str==null) { return false; } else{ try{ @SuppressWarnings("unused") int num=Integer.valueOf(str);//把字符串强制转换为数字 return true;//是数字,返回true }catch (Exception e) { return false; } } } } public class Menu { private static Scanner in = new Scanner(System.in); public Menu() throws Exception { while(true){ this.show(); } } @SuppressWarnings("resource") public void show() throws Exception{ System.out.println("======三角形种类====="); System.out.println("[1] 进行三角形类型判断"); System.out.println("[e] 退出。"); while (in.hasNext()) { String i = in.nextLine(); switch(i){ case "1":{ int i_a,i_b,i_c; System.out.println("请输入三角形的三条边:"); do { Scanner scana=new Scanner(System.in); String a=scana.next(); Scanner scanb=new Scanner(System.in); String b=scanb.next(); Scanner scanc=new Scanner(System.in); String c=scanc.next(); if(IsInteger.IsNum(a)&&IsInteger.IsNum(b)&&IsInteger.IsNum(c)) { i_a = Integer.parseInt(a); i_b = Integer.parseInt(b); i_c = Integer.parseInt(c); System.out.println(Sort.triangle(i_a, i_b, i_c)); break; } else{ System.out.println("输入不是整数!请重请输入三角形的三条边:"); } } while (true); System.out.println("==========请继续选择==========="); System.out.println("[1] 进行三角形类型判断"); System.out.println("[e] 退出。"); break ; } case "e":{ System.exit(1) ; // 系统退出 break ; } default:{ System.out.println("请选择正确的操作!") ; } } } } } public class Sort { static String t1="边的值不在范围内"; static String t2="不构成三角形"; static String t3="等边三角形"; static String t4="等腰三角形"; static String t5="直角三角形"; static String t6="一般三角形"; public static String triangle(int a,int b,int c){ if(a<1 || a>100 ||b<1 || b>100|| c<1|| c>100) { return t1; } else if(a>=b+c ||b>=a+c||c>=a+b) { return t2; } else if(a==b &&b==c &&c==a){ return t3; } else if(a==b ||b==c ||c==a){ return t4; } else if(a*a+b*b==c*c ||b*b+c*c==a*a ||c*c+a*a==b*b){ return t5; } else { return t6; } } }
2)依据覆盖技术的测试用例:
public class test01 { @Before public void setUp() throws Exception { } @Test public void testTriangle() { assertEquals("一般三角形", otherTest.Sort.triangle(20, 30, 15)); assertEquals("直角三角形", otherTest.Sort.triangle(3, 4, 5)); assertEquals("等边三角形", otherTest.Sort.triangle(20, 20, 20)); assertEquals("等腰三角形", otherTest.Sort.triangle(30, 30, 15)); assertEquals("边的值不在范围内", otherTest.Sort.triangle(120, 30, 15)); assertEquals("不构成三角形", otherTest.Sort.triangle(50, 20, 10)); } // 语句覆盖 @Test public void statementTest() { assertEquals("边的值不在范围内", otherTest.Sort.triangle(120, 30, 15)); assertEquals("不构成三角形", otherTest.Sort.triangle(10, 20, 10)); assertEquals("等边三角形", otherTest.Sort.triangle(3, 3, 3)); assertEquals("等腰三角形", otherTest.Sort.triangle(5, 5, 7)); assertEquals("直角三角形", otherTest.Sort.triangle(3, 4, 5)); assertEquals("一般三角形", otherTest.Sort.triangle(60, 50, 55)); } // 判定覆盖 @Test public void judgeTest1() { assertEquals("边的值不在范围内", otherTest.Sort.triangle(120, 30, 15)); } @Test public void judgeTest2() { assertEquals("不构成三角形", otherTest.Sort.triangle(10, 20, 10)); } @Test public void judgeTest3() { assertEquals("等边三角形", otherTest.Sort.triangle(3, 3, 3)); } @Test public void judgeTest4() { assertEquals("等腰三角形", otherTest.Sort.triangle(5, 5, 7)); } @Test public void judgeTest5() { assertEquals("直角三角形", otherTest.Sort.triangle(3, 4, 5)); } @Test public void judgeTest6() { assertEquals("一般三角形", otherTest.Sort.triangle(60, 50, 55)); } //条件覆盖 @Test public void conditionTest1() { assertEquals("边的值不在范围内",otherTest.Sort.triangle(101, 50, 55)); } @Test public void conditionTest2() { assertEquals("不构成三角形", otherTest.Sort.triangle(20, 30, 80)); } @Test public void conditionTest3() { assertEquals("等边三角形",otherTest.Sort.triangle(55, 55, 55)); } @Test public void conditionTest4() { assertEquals("等腰三角形",otherTest.Sort.triangle(55, 50, 55)); } @Test public void conditionTest5() { assertEquals("直角三角形",otherTest.Sort.triangle(6, 10,8)); } @Test public void conditionTest6() { assertEquals("一般三角形",otherTest.Sort.triangle(20,10, 15)); } public void conditionTest7() { assertEquals("边的值不在范围内",otherTest.Sort.triangle(10, 120, 55)); } public void conditionTest8() { assertEquals("边的值不在范围内",otherTest.Sort.triangle(10, 50, 130)); } public void conditionTest9() { assertEquals("等腰三角形",otherTest.Sort.triangle(11, 11,10)); } //路径覆盖 @Test public void pathTest1() { assertEquals("边的值不在范围内",otherTest.Sort.triangle(0, 0, 150)); } @Test public void pathTest2() { assertEquals("不构成三角形", otherTest.Sort.triangle(20, 30, 80)); } @Test public void pathTest3() { assertEquals("等边三角形",otherTest.Sort.triangle(55, 55, 55)); } @Test public void pathTest4() { assertEquals("等腰三角形",otherTest.Sort.triangle(55, 50, 55)); } @Test public void pathTest5() { assertEquals("直角三角形",otherTest.Sort.triangle(6, 10,8)); } @Test public void pathTest6() { assertEquals("一般三角形",otherTest.Sort.triangle(20,10, 15)); } }
4) 测试小结:
第一部分:需对代码的划分结构进行修改,使得作图更为方便,同时也可使解题的思路更为清晰。对测试用例的选择有着很多的,还需进一步进行规划,找出具有代表性的用例进行测试。
第二部分,在测试中未找到出错的缺陷,在选取用例时希望能更具代表性。