实验二-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) 测试小结:

第一部分:需对代码的划分结构进行修改,使得作图更为方便,同时也可使解题的思路更为清晰。对测试用例的选择有着很多的,还需进一步进行规划,找出具有代表性的用例进行测试。

 

第二部分,在测试中未找到出错的缺陷,在选取用例时希望能更具代表性。

 

 

posted on 2017-04-13 21:41  曾元鹏  阅读(273)  评论(0编辑  收藏  举报

导航