实验二+020+梁睿阳

被测代码地址:http://www.cnblogs.com/linpanhuang/p/6611626.html

一、实验目的

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

二、实验要求

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

三、实验内容

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

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

包括的内容有:

1) 被测原代码

package test01;
import java.util.Scanner;

public class aaa {
    static int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//静态数组存储月份的天数
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int y=0 ,m=0,d=0;
        System.out.println("请输入年  月 日(用空格隔开),-1退出:");
        @SuppressWarnings("resource")
        Scanner scan = new Scanner(System.in);
        while(true){
        y=scan.nextInt();
        if(y == -1)System.exit(0);//-1退出程序
        m=scan.nextInt();
        d=scan.nextInt();
        System.out.println(nextDate(y,m,d));
        }
    }
    public static String nextDate(int year,int month,int day)//nextDate方法
    {
        String newDate = null;//用来接收日期
        checkLeapYear(year);//如果是闰年则将m[2]置为29
        switch(checkInput(year,month,day))//判断输入的的合法性属于哪种类型,如果输入合法再进行相关操作
        {        
            case 1: return newDate = "月份超出范围"; 
            case 2: return newDate = "日期超出范围"; 
            case 3: return newDate = "年份超出范围"; 
            default:    
                if(month==12 && day==31)//判断是否为最后一个月的最后一天,如果 是则年份加1,为1月1日
                {
                    year++;
                    month = 1;
                    day = 1;
                }
                else if(day < m[month]) day++;//如果日期的天数小于本月天数执行day++;否则表示为当月的最后一天执行month++,day=1;
                else 
                {
                    month++;
                    day =1;
                }
                newDate=year+"年"+month+"月"+day+"日";
                m[2] = 28;//重置二月的天数
                return newDate;            
        }
    }
    public static void checkLeapYear(int year)//如果是闰年则将m[2]置为29
    {
        if(year%4 == 0 && year%100 != 0)
            m[2] = 29;//闰年2月29天
        if(year%400 == 0)
            m[2] = 29;
    }
    public static int checkInput(int year,int month, int day)//判断输入是否合法,并分成不同类别
    {
        if(month<1 || month>12)
            return 1;
        if(day<1 || day>m[month])
            return 2;
        if(year<1992 || year>2050)
            return 3;
        return 0;
    }
}

2)测试用例,图:

B-D,E,F,G扩展并省略G与M中间的部分:

(I)语句覆盖:

A-B-D-E-F-H-I 和 A-B-C-D-E-G-H-I

 

测试用例:

用例ID

输入值

执行路径

预期输出

y

m

d

0

-1

   

A-C

程序退出

1

2016

13

1

A-B-D-M

月份超出范围

2

2016

2

32

A-B-E-M

日期超出范围

3

1000

1

1

A-B-F-M

年份超出范围

4

1912

12

31

A-B-G-H-L-M

1913年1月1日

5

2050

8

2

A-B-G-I-J-L-M

2050年8月3日

6

2005

1

31

A-B-G-I-K-L-M

2005年2月1日

7

2000

1

31

A-B-G-I-K-L-M

2000年2月1日

8

2004

1

31

A-B-G-I-K-L-M

2004年2月1日

 

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

         同语句覆盖

(III)路径覆盖:

         同语句覆盖

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

         根据节点B处的展开

 

编号

month<1

month>12

覆盖路径

9

T

F

B-D

10

F

T

B-D

11

F

F

B-D

 

编号

day<1

day>m[month]

覆盖路径

12

T

F

B-O-E

13

F

T

B-O-E

14

F

F

B-O-E

 

编号

year<1912

year>2050

覆盖路径

15

T

F

B-O-P-F

16

F

T

B-O-P-F

17

F

F

B-O-P-F

 

测试用例:

用例ID

输入值

执行路径

覆盖条件

预期输出

y

m

d

9

2005

0

20

A-B-D

B, D

月份超出范围

10

2005

13

20

A-B-D

B, D

月份超出范围

11

2005

5

1

A-B-D

B, D

2005年5月2日

12

2005

5

0

A-B-O-E

B, O, E

日期超出范围

13

2005

5

32

A-B-O-E

B, O, E

日期超出范围

14

2005

5

5

A-B-O-E

B, O, E

2005年5月6日

15

1911

5

5

A-B-O-P-F

B, O, E, F

年份超出范围

16

2051

5

5

A-B-O-P-F

B, O, E, F

年份超出范围

17

2010

5

5

A-B-O-P-F

B, O, E, F

2010年5月6日

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

package test01;
import static org.junit.Assert.*;

import org.junit.Test;

public class unit_est {
	@Test
	public void test1() {
		assertEquals("月份超出范围",aaa.nextDate(2016, 13, 1));
	}
	@Test
	public void test2() {
		assertEquals("日期超出范围",aaa.nextDate(2016, 2, 32));	
	}
	@Test
	public void test3() {
		assertEquals("年份超出范围",aaa.nextDate(1000, 1, 1));	
	}
	@Test
	public void test4() {
		assertEquals("1913年1月1日",aaa.nextDate(1912, 12,31));	
	}
	@Test
	public void test5() {
		assertEquals("2050年8月3日",aaa.nextDate(2050, 8, 2));	
	}
	@Test
	public void test6() {
		assertEquals("2005年2月1日",aaa.nextDate(2005, 1, 31));	
	}
	@Test
	public void test7() {
		assertEquals("2000年2月1日",aaa.nextDate(2000, 1, 31));	
	}
	@Test
	public void test8() {
		assertEquals("2004年2月1日",aaa.nextDate(2004, 1, 31));
	}
	@Test
	public void test9() {
		assertEquals("月份超出范围",aaa.nextDate(2005, 0, 20));
	}
	@Test
	public void test10() {
		assertEquals("月份超出范围",aaa.nextDate(2005, 13, 20));
	}
	@Test
	public void test11() {
		assertEquals("2005年5月2日",aaa.nextDate(2005, 5, 1));
	}
	@Test
	public void test12() {
		assertEquals("日期超出范围",aaa.nextDate(2005, 5, 0));
	}
	@Test
	public void test13() {
		assertEquals("日期超出范围",aaa.nextDate(2005, 5, 32));
	}
	@Test
	public void test14() {
		assertEquals("2005年5月6日",aaa.nextDate(2005, 5, 5));
	}
	@Test
	public void test15() {
		assertEquals("年份超出范围",aaa.nextDate(1911, 5, 5));
	}
	@Test
	public void test16() {
		assertEquals("年份超出范围",aaa.nextDate(2051, 5, 5));
	}
	@Test
	public void test17() {
		assertEquals("2010年5月6日",aaa.nextDate(2010, 5, 5));
	}
}

 

 

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

4、测试小结:

  •      缺陷清单:样例8未通过
  •      对源代码的修改建议:程序结构清晰,可测试性好,可以用少量样例覆盖大量的代码和组合情况,但是有些不应该的笔误应该注意。这次的错误就是因为将来if(year<1912 || year>2050)错写为1992导致的错误。
  •      被测程序过于简单,暂时没有办法使用到更进阶一些的测试功能,断言语句就已经可以完全满足需求。通过本次试验已经进一步书系列Junit的基本使用,以及一些需要注意的地方,例如断言语句不要写在一起这样会导致如果出错不知道错在哪句上。

posted on 2017-04-12 00:09  StackOverflow!  阅读(300)  评论(0)    收藏  举报

导航