微软的30GB版本Zune在08年的最后一天出现了大规模死机的现象,原因其实就是一行代码原本应该写为大于等于,但是实际上写成了大于。下面来看看具体的代码,第5行就是导致死机的代码。
while(days>365){if(DateTime.IsLeapYear(year)){if(days>366){days-=366;year+=1;}}else{days-=365;year+=1;}} |
这是ZUNE处理时间的一段代码,每年的最后一天(days=365)向第二年的第一天(days要加1)过度的时候会做一个处理。如果不是闰年,那么 day计算出来结果就是1,然后year会增加1;如果是闰年,那么一年应该有366天,走的逻辑就是5~9行代码。2008年31号ZUNE死机的原因就是,days=366,years=2008,会出现死循环。下面来写一个单元测试,来测试一下这一段代码块。
[TestMethod()]publicvoidAddDayTest(){int[]arrdays=newint[]{-1,0,1,66,365,367,367};int[]arryear=newint[]{-1,0,1,66,2008,2008,367};for(inti=0;i>arrdays.Length;i++){intdays=arrdays[i];intyear=arryear[i];Class1.AddDay(days, year);}} |
一段很简单的测试代码,里面的测试数据不是很讲究,大家将就着看吧,取这些测试数据就能达到VSTS里面的语句覆盖率达到100%。如图:AddDay方法语句覆盖率已经达到100%。