关于闰年的测试
? ? ?很多軟件都實現了日期這一功能,日歷系統算是人類的一個legacy system。在此系統逐步進化中,也衍生出一些問題,例如“千年蟲”、”閏年蟲”。其中閏年蟲是人們對于一些電腦在設計時未考慮閏年因素,將所有年份的2月都默認為有29天或者28天而出現運算錯誤的一種形象叫法,因為在英文里Bug兼有臭蟲、缺陷等含義,所以這一缺陷被稱為“閏年蟲”。
? ? ?在2012年2月底,廣州“閏年蟲”爆發,上千的士因計價器出問題而停運,如圖所示:
? ? ? 就連著名的微軟也會出現”閏年蟲”的失誤,微軟Windows Azure云平臺若干子區域受“閏年蟲”影響致許多客戶12至24個小時無法使用服務。根據Windows Azure服務儀表板顯示,從UTC時間2012年2月29日凌晨到3月1日早上,大量的子區域服務和全球性服務發生了超過24小時的中斷。
? ? ? 因此如何正確判斷閏年是一個十分重要的問題,下面是C# 的代碼片段:
1 public static bool IsLeapYear(int year) 2 { 3 System.Diagnostics.Debug.Assert(year >= 1900); 4 if (year % 400 == 0) 5 return true; 6 if (year % 100 == 0) 7 return false; 8 if (year % 4 == 0) 9 return true; 10 return false; 11 }? ? ?如果你要寫這個程序的單元測試, 你會列出多少個測試用例? ?一個”笨”方法就是進行窮舉,可又會面臨以下問題:
? ? ?因而我們要引入 “等價類 (Equivalence)” 這一概念。所謂等價類是指輸入域的某個互不相交的子集合,所有等價類的并集便是整個輸入域,目的在于測試用例的無冗余性。?一個粗淺的做法是:
如果一個函數可以返回 true | false, 你至少得有兩類測試集合, 讓它分別返回 true | false
? ? ?如果你知道這個函數工作的原理, 或者了解程序要反映的現實世界, 你可以舉出更詳細的等價類, 例如針對 IsLeapYear()的測試用例如下:
被 400 整除的年份
被 100 整除, 但是不被400 整除的年份
被 100 整除, 同時被400 整除的年份
被 4 整除, 但是不被100 整除的年份
被 4 整除, 同時被100 整除的年份
偶數, 不被4 整除的年份
奇數年份
其它非法輸入的年份
? ? ? 另外程序員都知道程序經常在邊界條件附近出錯, 針對IsLeapYear(), 你可以得出下面兩個測試用例:
設計允許的最小的年份
設計允許的最大的年份
? ? ?總而言之,選取正確而又合適的測試用例是測試程序有無bug的必備條件。除此之外,判斷是否為閏年的代碼也可以簡化如下:
1 bool isLeapYear( int year ) 2 { 3 return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0); 4 }?
轉載于:https://www.cnblogs.com/xlwm/p/4337150.html
總結
- 上一篇: NLP 开源形近字算法之相似字列表(番外
- 下一篇: 关于项目奖