实验二+101+谢艳敏

一、实验目的

掌握基于覆盖理论与基本路径的基本白盒测试方法和实践

二、实验要求

运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。

三、实验内容

根据各位同学自己的被测程序,分别作出各类白盒测试技术的用例设计和相应的Junit脚本。

所有的覆盖的技术:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,基本路径测试方法。

包括的内容有:

1) 被测源代码:

 1 public class GetData {
 2 
 3     public static char triangle(int a, int b, int c) {
 4         if(a<=b+c ||b<=a+c || c<=a+b)
 5         {
 6             if ((a==b)&& (b==c)&&(c==a)) {
 7                 return '1';
 8             }else if ((a==b) || (b==c) || (a==c)) {
 9                 return '2';
10             }else if (a*a+b*b==c*c || b*b+c*c==a*a || a*a+c*c==b*b) {
11                 return '3';
12             }else {
13                 return '4';
14             }
15         }else 
16         {
17             return '5';
18         }
19     }    
20 }
21 
22 
23 import java.util.Scanner;
24 
25 public class Main {
26     static String equaltrianger = "等边三角形";
27     static String isotrianger = "等腰三角形";
28     static String comtrianger = "一般三角形";
29     static String rigtrianger = "直角三角形";
30     static String sidewrong = "边值不存在";
31     static String noconstruct = "不构成三角形";
32     
33     public static void main(String[] args) {
34         char resulet = ' ';
35         System.out.println(" 1 进行三角形判断操作");
36         System.out.println(" x 退出程序");
37             
38         while(true)
39         {
40             Scanner sc = new Scanner(System.in);    
41             String temp =sc.nextLine(); 
42             
43             switch (temp)
44             {
45                 case "1":{ 
46                     System.out.println("请输入三角形的三条边:");
47                     try {
48                         
49                         Scanner sca = new Scanner(System.in);
50                         int a = sca.nextInt();
51                         Scanner scb = new Scanner(System.in);
52                         int b = scb.nextInt();
53                         Scanner scc = new Scanner(System.in);
54                         int c = scc.nextInt();
55                         if (a<1 || a>100 || b<1 || b>100 || c<1 || c>100) {
56                             System.out.println("边值不存在!");
57                         }else {
58                             resulet =  GetData.triangle(a, b, c);
59                         if (resulet == '1') {
60                             System.out.println(equaltrianger);
61                         }else if (resulet == '2') {
62                             System.out.println(isotrianger);
63                         }else if (resulet == '3') {
64                             System.out.println(rigtrianger);
65                         }else if (resulet == '4') {
66                             System.out.println(comtrianger);
67                         }else {
68                             System.out.println(noconstruct);
69                             }
70                         }
71                         
72                         System.out.println(" 1 进行三角形判断操作");
73                         System.out.println(" x 退出程序");                            
74                         break;
75                         } catch (Exception e) {
76                             System.out.println("请输入正确的边值!");
77                             System.out.println(" 1 进行三角形判断操作");
78                             System.out.println(" x 退出程序");
79                             break;
80                         }    
81                     }
82                 
83             case "x": 
84                 System.exit(1);
85             default:
86                 System.out.println("请选择正确的操作!") ; 
87             }
88         }        
89     }
90 }

2)依据覆盖技术,测试用例列表:

DD-路径(只压缩链路经)

程序图节点

DD-路径

4

A

6

B

17

C

8

D

7

E

10

F

9

G

11

H

13

I

58

J

(I)语句覆盖:

A-C-J

A-B-E-J

A-B-D-G-J

A-B-D-F-I-J

A-B-D-F-H-J

测试用例:

用例ID

输入值

执行路径

预期输出

a

b

c

result

1

3

1

7

A-C-J

不构成三角形

2

3

3

3

A-B-E-J

等边三角形

3

3

1

3

A-B-D-G-J

等腰三角形

4

3

7

5

A-B-D-F-I-J

一般三角形

5

3

4

5

A-B-D-F-H-J

直角三角形

(II)分支覆盖(判断覆盖):

A-C-J

A-B-E-J

A-B-D-G-J

A-B-D-F-I-J

A-B-D-F-H-J

测试用例同语句覆盖测试用例

(III)路径覆盖:

A-C-J

A-B-E-J

A-B-D-G-J

A-B-D-F-I-J

A-B-D-F-H-J

测试用例同语句覆盖测试用例

(IV)条件覆盖:各个条件取真或假的可能至少执行一次

A-B-E-J

A-C-J

A-B-D-G-J

A-B-D-F-H-J

A-B-D-F-I-J

编号

a<=b+c

 

b<=a+c

 

c<=a+b

 

a<=b+c ||b<=a+c || c<=a+b

 

覆盖路径

1

F

F

F

F

A-C

2

F

F

T

T

A-B

3

F

T

F

T

    A-B

4

F

T

T

T

A-B

5

T

T

T

T

A-B

6

T

T

F

T

A-B

7

T

F

T

T

A-B

8

T

F

F

T

A-B

编号

a==b

 

b==c

 

c==a

 

(a==b)&& (b==c)&&(c==a)

 

覆盖路径

9

F

F

F

F

A-C

10

F

F

T

F

A-C

11

F

T

F

F

    A-C

12

F

T

T

F

A-B

13

T

T

T

T

A-B

14

T

T

F

F

A-C

15

T

F

T

F

A-C

16

T

F

F

F

A-C

编号

a==b

 

b==c

 

c==a

 

(a==b) || (b==c) || (a==c)

 

 

覆盖路径

17

F

F

F

F

D-F

18

F

F

T

T

D-G

19

F

T

F

T

    D-G

20

F

T

T

T

D-G

21

T

T

T

T

D-G

22

T

T

F

T

D-G

23

T

F

T

T

D-G

24

T

F

F

T

D-G

编号

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

 

覆盖路径

25

F

F

F

F

F-I

26

F

F

T

T

F-H

27

F

T

F

T

    F-H

28

F

T

T

T

F-H

29

T

T

T

T

F-H

30

T

T

F

T

    F-H

31

T

F

T

T

F-H

32

T

F

F

T

F-H

测试用例:

用例ID

输入值

执行路径

覆盖条件

预期输出

a

b

c

result

1

3

1

7

A-C-J

 

1,9-11,14-16

不构成三角形

2

3

3

3

A-B-E-J

 

2-8,12,13

等边三角形

3

3

1

3

A-B-D-G-J

 

2-8,12,13,18-24

等腰三角形

4

3

4

5

A-B-D-F-H-J

 

2-8,12,13,17,26-32

直角三角形

5

3

7

5

A-B-D-F-I-J

 

2-8,12,13,17,25

一般三角形

3)相应Junit测试脚本、执行结果

package triangle01;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class GetDataTest {

    @Before
    public void setUp() throws Exception {
    }

    public String change(char c) {
        switch (c) {
        case '1':
            return "等边三角形";

        case '2':
            return "等腰三角形";

        case '3':
            return "直角三角形";

        case '4':
            return "一般三角形";

        case '5':
            return "不构成三角形";

        default:
            break;

        }
        return null;
    }

    
    @Test
    public void test() {
        String s1 = change(GetData.triangle(3, 4, 5));
        assertEquals("直角三角形", s1);
        String s2 = change(GetData.triangle(3, 7, 5));
        assertEquals("一般三角形", s2);
        String s3 = change(GetData.triangle(3, 1, 7));
        assertEquals("不构成三角形", s3);
        String s4 = change(GetData.triangle(3, 3, 3));
         assertEquals("等边三角形", s4);
         String s5 = change(GetData.triangle(3, 1, 1));
        assertEquals("等腰三角形", s5);
    }

}

4)给出测试参数化和打包测试的脚本,并生成执行结果

参数化测试

package triangle01;


import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;




@RunWith(Parameterized.class)
public class GetDataParamTest {

    private int param1;
    private int param2;
    private int param3;
    private String result;
    
    GetData triangle = new GetData();
    //把被测代码所返回的字符类型转换为字符串类型
    public String change(char c) {
        switch (c) {
        case '1':
            return "等边三角形";

        case '2':
            return "等腰三角形";

        case '3':
            return "直角三角形";

        case '4':
            return "一般三角形";

        case '5':
            return "不构成三角形";

        default:
            break;

        }
        return null;
    }
    
    @Parameters
    public static Collection data(){
        return Arrays.asList(new Object[][]{
            {3, 1, 7,"不构成三角形"},
            {3, 3, 3,"等边三角形"},
            {3, 1, 3,"等腰三角形"},
            {3, 4, 5,"直角三角形"},
            {3, 7, 5,"一般三角形"}
            
        });
    }
    
    public GetDataParamTest(int param1,int param2,int param3,String result){
        this.param1 = param1;
        this.param2 = param2;
        this.param3 = param3;
        this.result = result;
    }
    
    @Test
    public void testParam(){
        String rs = change(triangle.triangle(param1, param2, param3));
        assertEquals(rs,result);
    }

}

打包测试

package triangle01;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;


@RunWith(Suite.class)
@Suite.SuiteClasses(
        {
            GetDataTest.class,
            GetDataParamTest.class,
        
        })

public class AllTriangleTest {


}

4、测试小结:

  1、测试找到的缺陷清单:测试代码对“不构成三角形”的判断有错误。

  2、修改建议:建议修改对“不构成三角形”的判断。

    3、总结: 通过本次实验,我加深了对白盒测试的理解。学会了画控制流图,加深了对白盒测试的基本路径测试方法的理解,能够进一步设计出测试用例。同时,我还学会了Junit脚本的使用方法,包括测试参数化和打包测试。参数化测试,简化了测试,只写一个测试函数,把若干种情况作为参数传递进去,一次性地完成测试。打包测试,将所有需要运行的测试类集中起来,一次性地运行完毕,大大地方便了我们的测试工作。

原文地址:https://www.cnblogs.com/xwhisper/p/6704207.html