首页 > 代码库 > 实验二+001+陈定国

实验二+001+陈定国

一、实验目的

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

二、实验要求

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

三、实验内容

1) 被测原代码

import java.util.Scanner;
public class Triangle{
    public static void main(String[] args) {
        while(true){
        System.out.println("请输入三角形的三条边:");
        try {
        int a,b,c;
        Scanner input=new Scanner(System.in);
        a=input.nextInt();
        b=input.nextInt();
        c=input.nextInt();
        String str=triangle(a,b,c);
        System.out.println(str);
        } catch (Exception e) {
            // TODO: handle exception
          System.out.println("请确保输入的边为整数!");    
          }
        }
        }
        
        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)&&(a+c>b)&&(b+c>a)) {
                if (a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) {
                    if (a==b||a==c||b==c) {
                        result="该三角形为等腰直角三角形.";
                    } else {
                        result="该三角形为直角三角形.";
                    }
                } else if (a==b&&b==c&&a==c) {
                    result="该三角形为等边三角形.";
                } else if (a==b||a==c||b==c) {
                    result="该三角形为等腰三角形.";
                } else {
                    result="该三角形为一般三角形.";
                }
            } else {
                result="不能构成三角形.";
            }
        } else {
            result="不能构成三角形.";
        }
            return result;

    }
}

 

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

技术分享技术分享

                               程序图                                                                                                               DD-路径图

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

程序图节点

DD-路径

1

A

2

B

3

C

4

D

5

E

6

F

7

G

8

H

9

I

 

(I)语句覆盖:

    A-B-D-I

    A-B-C-F-I

    A-B-C-E-I

    A-B-C-E-G-I

    A-B-C-E-G-H-I

 

测试用例:

用例ID

输入值

执行路径

预期输出

A

B

X

X

1

101

101

101

A-B-D-I

边的值不在范围内

2

3

1

2

A-B-C-F-I

构成三角形

3

3

4

5

A-B-C-E-I

该三角形为直角三角形

4

6

6

6

A-B-C-E-G-I

该三角形为等边三角形

5

5

5

6

A-B-C-E-G-H-I

该三角形为等腰三角形

6

3

5

6

A-B-C-E-G-H-I

该三角形为一般三角形

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

    A-B-C-F-I

    A-B-C-E-G-H-I

测试用例:

用例ID

输入值

执行路径

预期输出

A

B

X

X

1

1

0

3

A-B-C-F-I

构成三角形

2

3

4

3

A-B-C-E-G-H-I

该三角形为等腰三角形

III)路径覆盖:

    A-B-D-I

    A-B-C-F-I

    A-B-C-E-I

    A-B-C-E-G-I

    A-B-C-E-G-H-I

用例ID

输入值

执行路径

预期输出

A

B

X

X

1

101

101

101

A-B-D-I

边的值不在范围内

2

3

1

2

A-B-C-F-I

构成三角形

3

3

4

5

A-B-C-E-I

该三角形为直角三角形

4

6

6

6

A-B-C-E-G-I

该三角形为等边三角形

5

5

5

6

A-B-C-E-G-H-I

该三角形为等腰三角形

6

3

5

6

A-B-C-E-G-H-I

该三角形为一般三角形

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

编号

(a>=1&&a<=100)&&(b>=1&&b<=100)&&(c>=1&&c<=100)

(a+b>c)&&(a+c>b)&&(b+c>a)

 

a*a+b*b==c*c||a*a+c*c==b*b

||b*b+c*c==a*a

 

a==b&&b==c&&a==c

 

a==b||a==c||b==c

 

覆盖路径

1

T

T

T

T

T

A-B-C-E-G-H-I

2

T

T

T

T

F

A-B-C-E-G-H-I

3

T

T

T

F

 

A-B-C-E-G-I

4

T

T

F

 

 

A-B-C-E-I

5

T

F

 

 

 

A-B-C-F-I

6

F

 

 

 

 

A-B-D-I

测试用例:

用例ID

输入值

执行路径

覆盖条件

预期输出

1

101

101

101

A-B-D-I

1,2

边的值不在范围内

2

1

1

2

A-B-C-F-I

1,2,3

构成三角形

3

3

4

5

A-B-C-E-I

1,2,35

该三角形为直角三角形

4

5

5

5

A-B-C-E-G-I

1,23,5,7

该三角形为等边三角形

5

3

5

3

A-B-C-E-G-H-I

1,2,3,5,7,8

该三角形为等腰三角形

6

3

5

7

A-B-C-E-G-H-I

1,2,3,5,7,8

该三角形为一般三角形

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

Junit测试脚本:

import static org.junit.Assert.assertEquals;

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

public class TrangleTest {
    private static Triangle trangle = new Triangle();

    @Before
    public void setUp() throws Exception {
        
    }

    @Test
    public void testTriangle01() {
        assertEquals("该三角形为直角三角形.", Triangle.triangle(3, 4, 5));//1
        
    }
    @Test
    public void testTriangle02() {
        assertEquals("该三角形为等边三角形.", Triangle.triangle(6, 6, 6));//2
    }
    @Test
    public void testTriangle03() {
        assertEquals("边的值不在范围内!",  Triangle.triangle(150, 150, 200));//3

    }
    @Test
    public void testTriangle04() {
        assertEquals("不能构成三角形.", Triangle.triangle(3, 1, 2));//4

    }
    @Test
    public void testTriangle05() {
        assertEquals("该三角形为一般三角形.",  Triangle.triangle(3, 5, 6));//5

    }
    @Test
    public void testTriangle06() {
        assertEquals("该三角形为等腰三角形.",  Triangle.triangle(5, 5, 6));//6

    }
    
}

测试结果:

技术分享

 

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

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

@RunWith(Suite.class)
@Suite.SuiteClasses({
    TrangleTest.class
})

public class Test {

    @Before
    public void setUp() throws Exception {
    }
}

测试结果:

技术分享

4、测试小结:

  •      测试找到的缺陷清单
  •      对源代码的修改建议
  •      测试总结与心得体会

测试用例都成功通过。

修改建议:应先判断等腰再判断等边三角形,这样逻辑更顺畅;应在代码关键处添加注释。

总结与心得:在我们平常的项目开发中,测试是显得越来越重要。我们很多的时候,必须得测试与开发同步,测试代码和工作代码应同步编译和更新。而junit可以大大减少代码量和文件量,为测试提供了很大的灵活性。所以不要认为压力大,就不写测试代码。相反编写测试代码会使压力逐渐减轻,因为通过编写测试代码地编写出有效率工作代码在编写测试用例时要充分覆盖各个路径,以确保每个判断条件都能被执行。

实验二+001+陈定国