第二次作业+105032014074

测试链接:http://www.cnblogs.com/mrlry/p/6599265.html

一、测试人员提出的问题和缺陷:

1、缺陷集中在哪几个方面:日期边界,输出格式

2、没有考虑日期小于1的非法输入情况,出错返回多个出错的信息,没有按问题中要求的先错误先返回。另外程序的输出结果都没有按照要求的“****年**月**日”格式输出,而是变成如1995,1,1的形式

二、修正后的代码清单:

 1 package test01;
 2 import java.util.Scanner;
 3 
 4 public class Test01_nextdate {
 5     static int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//静态数组存储月份的天数
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         int y=0 ,m=0,d=0;
 9         System.out.println("请输入年  月 日(用空格隔开),-1退出:");
10         @SuppressWarnings("resource")
11         Scanner scan = new Scanner(System.in);
12         while(true){
13         y=scan.nextInt();
14         if(y == -1)System.exit(0);//-1退出程序
15         m=scan.nextInt();
16         d=scan.nextInt();
17         System.out.println(nextDate(y,m,d));
18         }
19     }
20     public static String nextDate(int year,int month,int day)//nextDate方法
21     {
22         String newDate = null;//用来接收日期
23         checkLeapYear(year);//如果是闰年则将m[2]置为29
24         switch(checkInput(year,month,day))//判断输入的的合法性属于哪种类型,如果输入合法再进行相关操作
25         {        
26             case 1: return newDate = "月份超出范围"; 
27             case 2: return newDate = "日期超出范围"; 
28             case 3: return newDate = "年份超出范围"; 
29             default:    
30                 if(month==12 && day==31)//判断是否为最后一个月的最后一天,如果 是则年份加1,为1月1日
31                 {
32                     year++;
33                     month = 1;
34                     day = 1;
35                 }
36                 else if(day < m[month]) day++;//如果日期的天数小于本月天数执行day++;否则表示为当月的最后一天执行month++,day=1;
37                 else 
38                 {
39                     month++;
40                     day =1;
41                 }
42                 newDate=year+"年"+month+"月"+day+"日";
43                 m[2] = 28;//重置二月的天数
44                 return newDate;            
45         }
46     }
47     public static void checkLeapYear(int year)//如果是闰年则将m[2]置为29
48     {
49         if(year%4 == 0 && year%100 != 0)
50             m[2] = 29;//闰年2月29天
51         if(year%400 == 0)
52             m[2] = 29;
53     }
54     public static int checkInput(int year,int month, int day)//判断输入是否合法,并分成不同类别
55     {
56         if(month<1 || month>12)
57             return 1;
58         if(day<1 || day>m[month])
59             return 2;
60         if(year<1992 || year>2050)
61             return 3;
62         return 0;
63     }
64 }

 运行结果:

三、修正后的心得体会

a.缺陷原因

     根据测试人员所反应的问题和建议,我也找到问题的所在。

1、对于日期误判的修改:对于所有if(d<31)d++;语句加入判断条件d>0,即判断要求日期大于0。

2、对于年份误判的修改:由于在程序中最后对年份进行判断所以在之间的赋值中只要是一年的最后一天y++即年份加一,所以当进行年份判断时y就已经加1了,所以出现问题。只  要添加一个变量k用来存储原来输入的年份,再用k变量来作为判定年份合法性,就可以解决问题。

b.代码的变更

     通过以上两个修改就可以解决问题了。其实我在当时提交完代码后也发现这个问题,并在原贴下跟帖修正后的java代码。不过我觉得正如测试人员所说我原先的代码各种操作杂糅在一起没有一定的阅读性,所以我对代码做了相应的修正和优化,封装了checkLeapYear()与checkInput()两个方法分别用来判断闰年与输入合法性的相关操作,减少了很多不必要的变量。添加一个存储月份天数的静态数组来简化switch语句冗长的结构,并添加相关的注释,最后做相应的测试并能够通过以上链接中所指出的所有错误样例。

c.学习心得

      最后,对一个月来的学习心得就是测试是软件开发不可或缺的一部分,好的测试人员与开发人员是相辅相成的,开发人员的编程习惯和思维的清晰度在代码的可阅读性上是会被展现出来的,所以好的开发人员条理相对于一般的开发人员更清晰,所以就要求测试具备一定的开发能力才能更好与更高效的测试,当然测试的相关知识也是必不可少的。测试的过程是个循序渐进的过程,在这个过程中作为测试人员能够学习到测试的知识也懂得了在编写代码上的规范,别人的代码有什么不足?思考自己编写代码会不会也会存在这样的问题呢?在这一方面上将也是在提升自己编写代码的能力。在我这个菜鸟看来,我已经学到了很多,但还需要更加努力更加细心的学习。

原文地址:https://www.cnblogs.com/linpanhuang/p/6611626.html