一、实验目的

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

二、实验要求

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

三、实验内容

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

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

包括的内容有:

1) 被测原代码

import java.util.Scanner;
public class Date {
    public static void main(String[] args){
        
        System.out.print("请输入日期");
        Scanner input = new Scanner(System.in);
        
        int year = input.nextInt();
        int month = input.nextInt();
        int day = input.nextInt();
        
        GetDate(year,month,day);
        input.close();
    }
     
    public static void GetDate(int year, int month, int day){
         
         if (!(year >= 1912 && year <= 2050)){  //判断年份
             System.out.println("年份超出范围!");
             return;
         }
             
         if (month > 12 || month < 1){//判断月份             
             System.out.println("月份超出范围!");
             return;
         }
                 
         if (day > 31 || day < 1){//判断日期                 
             System.out.println("日期超出范围!");
             return;
         }
         if (month == 4 && day == 31 ){            
             System.out.println("日期超出范围!");
             return;
         }
         if (month == 6 && day == 31){//判断日期            
             System.out.println("日期超出范围!");
             return;
         }
         if (month == 9 && day == 31){//判断日期            
             System.out.println("日期超出范围!");
             return;
         }
         if (month == 11 && day == 31){//判断日期            
             System.out.println("日期超出范围!");
             return;
            }
    
         switch (month){//计算第二天日期            
         case 1:
         case 3:
         case 5:
         case 7:
         case 8:
         case 10:
             if (day == 31){                
                 month++;
                 day = 1;                 
             }
             else day++;
             break;
         case 2:            
             if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){//计算闰年的日期                    
                 if (day > 29){                        
                     System.out.println("日期超出范围!");
                     return;
                 }
                 if (day == 29){                        
                     month = 3;
                     day = 1;
                 }
                 else day++;
             }
             else{                    
                 if (day > 28){                        
                     System.out.println("日期超出范围!");
                     return;
                 }
                 if (day == 28){                        
                     month = 3;
                     day = 1;
                 }
                 else day++;
             }
             break;
         case 4:
         case 6:
         case 9:
         case 11:
             if (day == 30){                
                 month++;
                 day = 1;                
             }
             else day++;                
             break;
         case 12:
             if (day == 31){                
                 year++;
                 month = 1;
                 day = 1;
             }
             else day++;
             break;                   
         }    
         System.out.println(year+"年"+month+"月"+day+"日");
    }
}

            

                 程序图                                            DD路径图

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

    (1)语句覆盖:ABb,ABCc,ABCDd,ABCDEe,ABCDEFf,ABCDEFGg,ABCDEFGHh,ABCDEFGHIJKa,ABCDEFGHIJLa,ABCDEFGHINOo,ABCDEFGHINOPQa,

     ABCDEFGHINOPRa,ABCDEFGHIWXa,ABCDEFGHIWYa,ABCDEFGHIZZ1a,ABCDEFGHIZZ2a,ABCDEFGHINSs,ABCDEFGHINSTUa,ABCDEFGHINSTVa

         测试用例:

用例ID 输入 执行路径 预期输出
year month day
1 1890 1 1 ABb 年份超出范围
2 2001 0 3 ABCc 月份超出范围
3 1987 3 0 ABCDd 日期超出范围
4 1988 4 31 ABCDEe 日期超出范围
5 1998 6 31 ABCDEFf 日期超出范围
6 1997 9 31 ABCDEFGg 日期超出范围
7 2014 11 31 ABCDEFGHh 日期超出范围
8 1967 3 31 ABCDEFGHIJKa 1967年4月1日
9 1987 5 2 ABCDEFGHIJLa 1987年5月3日
10 2000 2 30 ABCDEFGHINOo 日期超出范围
11 1996 2 29 ABCDEFGHINOPQa 1996年3月1日
12 2004 2 1 ABCDEFGHINOPRa 2004年2 月2日
13 2005 4 30 ABCDEFGHIWXa 2005年5月1日
14 2006 6 3 ABCDEFGHIWYa 2006年6月4日
15 2007 12 31 ABCDEFGHIZZ1a 2008年1月1日
16 2008 12 5 ABCDEFGHIZZ2a 2008年12月6日
17 2001 2 29 ABCDEFGHINSs 日期超出范围
18 2002 2 28 ABCDEFGHINSTUa 2002年3月1日
19 2003 2 4 ABCDEFGHINSTVa 2003年2月5日

    (2)分支覆盖:ABb,ABCc,ABCDd,ABCDEe,ABCDEFf,ABCDEFGg,ABCDEFGHh,ABCDEFGHIJKa,ABCDEFGHIJLa,ABCDEFGHINOo,ABCDEFGHINOPQa,

     ABCDEFGHINOPRa,ABCDEFGHIWXa,ABCDEFGHIWYa,ABCDEFGHIZZ1a,ABCDEFGHIZZ2a,ABCDEFGHINSs,ABCDEFGHINSTUa,ABCDEFGHINSTVa

         测试用例:

用例ID 输入 执行路径 预期输出
year month day
1 1890 1 1 ABb 年份超出范围
2 2001 0 3 ABCc 月份超出范围
3 1987 3 0 ABCDd 日期超出范围
4 1988 4 31 ABCDEe 日期超出范围
5 1998 6 31 ABCDEFf 日期超出范围
6 1997 9 31 ABCDEFGg 日期超出范围
7 2014 11 31 ABCDEFGHh 日期超出范围
8 1967 3 31 ABCDEFGHIJKa 1967年4月1日
9 1987 5 2 ABCDEFGHIJLa 1987年5月3日
10 2000 2 30 ABCDEFGHINOo 日期超出范围
11 1996 2 29 ABCDEFGHINOPQa 1996年3月1日
12 2004 2 1 ABCDEFGHINOPRa 2004年2 月2日
13 2005 4 30 ABCDEFGHIWXa 2005年5月1日
14 2006 6 3 ABCDEFGHIWYa 2006年6月4日
15 2007 12 31 ABCDEFGHIZZ1a 2008年1月1日
16 2008 12 5 ABCDEFGHIZZ2a 2008年12月6日
17 2001 2 29 ABCDEFGHINSs 日期超出范围
18 2002 2 28 ABCDEFGHINSTUa 2002年3月1日
19 2003 2 4 ABCDEFGHINSTVa 2003年2月5日

 

     

     (3)路径覆盖:ABb,ABCc,ABCDd,ABCDEe,ABCDEFf,ABCDEFGg,ABCDEFGHh,ABCDEFGHIJKa,ABCDEFGHIJLa,ABCDEFGHINOo,ABCDEFGHINOPQa,

       ABCDEFGHINOPRa,ABCDEFGHIWXa,ABCDEFGHIWYa,ABCDEFGHIZZ1a,ABCDEFGHIZZ2a,ABCDEFGHINSs,ABCDEFGHINSTUa,ABCDEFGHINSTVa

         测试用例:

 

用例ID 输入 执行路径 预期输出
year month day
1 1890 1 1 ABb 年份超出范围
2 2001 0 3 ABCc 月份超出范围
3 1987 3 0 ABCDd 日期超出范围
4 1988 4 31 ABCDEe 日期超出范围
5 1998 6 31 ABCDEFf 日期超出范围
6 1997 9 31 ABCDEFGg 日期超出范围
7 2014 11 31 ABCDEFGHh 日期超出范围
8 1967 3 31 ABCDEFGHIJKa 1967年4月1日
9 1987 5 2 ABCDEFGHIJLa 1987年5月3日
10 2000 2 30 ABCDEFGHINOo 日期超出范围
11 1996 2 29 ABCDEFGHINOPQa 1996年3月1日
12 2004 2 1 ABCDEFGHINOPRa 2004年2 月2日
13 2005 4 30 ABCDEFGHIWXa 2005年5月1日
14 2006 6 3 ABCDEFGHIWYa 2006年6月4日
15 2007 12 31 ABCDEFGHIZZ1a 2008年1月1日
16 2008 12 5 ABCDEFGHIZZ2a 2008年12月6日
17 2001 2 29 ABCDEFGHINSs 日期超出范围
18 2002 2 28 ABCDEFGHINSTUa 2002年3月1日
19 2003 2 4 ABCDEFGHINSTVa 2003年2月5日

   

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

编号 year<1912 or year>2050 覆盖路径
1 F B-C
2 T B-b
编号 month<1 or month>12 覆盖路径
3 F C-D
4 T C-c
编号 day<1 or day>31 覆盖路径
5 F D-E
6 T D-d
编号 month==4 day==31 month==4 and day==31 覆盖路径
7 F F F E-F
8 F T F E-F
9 T F F E-F
10 T T T E-e

 编号

month==6 day==31 month==6 and day==31 覆盖路径
11 F F F F-G
12 F T F F-G
13 T F F F-G
14 T T T F-f
编号 month==9 day==31 month==9 and day==31 覆盖路径
15 F F F G-H
16 F T F G-H
17 T F F G-H
18 T T T G-g
编号 month==11 day==31 month==11 and day==31 覆盖路径
19 F F F H-I
20 F T F H-I
21 T F F H-I
22 T T T H-h
编号 day==31 覆盖路径
23 F J-K
24 T J-L
编号 (year%4==0 and year%100!=0) or year%400==0 覆盖路径
25 F N-S
26 T N-O
编号 day>29 覆盖路径
27 F O-P
28 T O-o
编号 day==29 覆盖路径
29 F P-R
30 T P-Q
编号 day>28 覆盖路径
31 F S-T
32 T S-s
编号 day==28 覆盖路径
33 F T-V
34 T T-U
编号 day==30 覆盖路径
35 F W-Y
36 T W-X
编号 day==31 覆盖路径
37 F Z-Z2
38 T Z-Z1

     测试用例:

 

用例ID 输入 执行路径 覆盖条件 预期输出
year month day
1 1890 1 1 ABb 2 年份超出范围
2 2001 0 3 ABCc 1,4 月份超出范围
3 1987 3 0 ABCDd 1,3,6 日期超出范围
4 1988 4 31 ABCDEe 1,3,5,10 日期超出范围
5 1998 6 31 ABCDEFf 1,3,5,8,14 日期超出范围
6 1997 9 31 ABCDEFGg 1,3,5,8,12,18 日期超出范围
7 2014 11 31 ABCDEFGHh 1,3,5,8,12,16,22 日期超出范围
8 1967 3 31 ABCDEFGHIJKa 1,3,5,8,12,16,20,24 1967年4月1日
9 1987 5 2 ABCDEFGHIJLa 1,3,5,7,11,15,19,23 1987年5月3日
10 2000 2 30 ABCDEFGHINOo 1,3,5,7,11,15,19,26,28 日期超出范围
11 1996 2 29 ABCDEFGHINOPQa 1,3,5,7,11,15,19,26,27,30 1996年3月1日
12 2004 2 1 ABCDEFGHINOPRa 1,3,5,7,11,15,19,26,27,29 2004年2 月2日
13 2005 4 30 ABCDEFGHIWXa 1,3,5,9,11,15,19,36 2005年5月1日
14 2006 6 3 ABCDEFGHIWYa 1,3,5,7,13,15,19,35 2006年6月4日
15 2007 12 31 ABCDEFGHIZZ1a 1,3,5,8,12,16,20,38 2008年1月1日
16 2008 12 5 ABCDEFGHIZZ2a 1,3,5,7,11,15,19,37 2008年12月6日
17 2001 2 29 ABCDEFGHINSs 1,3,5,7,11,15,19,25,32 日期超出范围
18 2002 2 28 ABCDEFGHINSTUa 1,3,5,7,11,15,19,25,31,34 2002年3月1日
19 2003 2 4 ABCDEFGHINSTVa 1,3,5,7,11,15,19,25,31,33 2003年2月5日

 

 

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

import static org.junit.Assert.*;

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

public class DateTest {

    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void testGetDate1() {
        assertEquals("年份超出范围",Date.GetDate(1890, 1, 1));
    }
    @Test
    public void testGetDate2() {
        assertEquals("月份超出范围",Date.GetDate(2001, 0, 3));
    }
    @Test
    public void testGetDate3() {
        assertEquals("日期超出范围",Date.GetDate(1987, 3, 0));
    }
    @Test
    public void testGetDate4() {
        assertEquals("日期超出范围",Date.GetDate(1988, 4, 31));
    }
    @Test
    public void testGetDate5() {
        assertEquals("日期超出范围",Date.GetDate(1998, 6, 31));
    }
    @Test
    public void testGetDate6() {
        assertEquals("日期超出范围",Date.GetDate(1997, 9, 31));
    }
    @Test
    public void testGetDate7() {
        assertEquals("日期超出范围",Date.GetDate(2014, 11, 31));
    }
    @Test
    public void testGetDate8() {
        assertEquals("1967年4月1日",Date.GetDate(1967, 3, 31));
    }
    @Test
    public void testGetDate9() {
        assertEquals("1987年5月3日",Date.GetDate(1987, 5, 2));
    }
    @Test
    public void testGetDate10() {
        assertEquals("日期超出范围",Date.GetDate(2000, 2, 30));
    }
    @Test
    public void testGetDate11() {
        assertEquals("1996年3月1日",Date.GetDate(1996, 2, 29));
    }
    @Test
    public void testGetDate12() {
        assertEquals("2004年2月2日",Date.GetDate(2004, 2, 1));
    }
    @Test
    public void testGetDate13() {
        assertEquals("2005年5月1日",Date.GetDate(2005, 4, 30));
    }
    @Test
    public void testGetDate14() {
        assertEquals("2006年6月4日",Date.GetDate(2006, 6, 3));
    }
    @Test
    public void testGetDate15() {
        assertEquals("2008年1月1日",Date.GetDate(2007, 12, 31));
    }
    @Test
    public void testGetDate16() {
        assertEquals("2008年12月6日",Date.GetDate(2008, 12, 5));
    }
    @Test
    public void testGetDate17() {
        assertEquals("日期超出范围",Date.GetDate(2001, 2, 29));
    }
    @Test
    public void testGetDate18() {
        assertEquals("2002年3月1日",Date.GetDate(2002, 2, 28));
    }
    @Test
    public void testGetDate19() {
        assertEquals("2003年2月5日",Date.GetDate(2003, 2, 4));
    }
    


}

 

 

4、测试小结:

  •      测试找到的缺陷清单:老师第一次提的要求没有完成,返回值是String型,该代码返回值为void,导致返回值不对,assertEquals无法经行断言判断。
  •      对源代码的修改建议:按要求修改好代码,方法的类型重新定义,方法中判断超出范围太过繁琐,建议定义一个新的方法。
  •      测试总结与心得体会:通过本次实验更深一步了解了Junit的使用,虽然被测代码有问题,但是还是按步骤一步步完成了脚本语句。并且在课堂上老师所讲的断言语句不能排列一起使用这个知识点印象深刻。
posted on 2017-04-14 13:50  lala44  阅读(172)  评论(0编辑  收藏  举报