開發人員測試的主要缺點是:絕大部分測試都是在理想的場景中進行的。在這些情況下并不會出現缺陷 —— 能導致出現問題的往往是那些邊界情況。
什么是邊界情況呢?比方說,把 null
值傳入一個并未編寫如何處理 null
值的方法中,這就是一種邊界情況。大多數開發人員通常都不能成功測試這樣的場景,因為這沒多大意義。但不管有沒有意義,發生了這樣的情況,就會拋出一個 NullPointerException
,然后整個程序就會崩潰。
本月,我將為您推薦一種多層面的方法,來處理代碼中那些不易預料的缺陷。嘗試為應用程序整合進防御性編程、契約式設計和一種叫做 OVal 的易用的通用驗證框架。
![]() |
|
清單 1 中的代碼為給定的 Class
對象(省去了 java.lang.Object
,因為所有對象都最終由它擴展)構建一個類層次。但如果仔細看的話,您會注意到一個有待發現的潛在缺陷,即該方法對對象值所做的假設。
清單 1. 不檢驗 null 的方法
public static Hierarchy buildHierarchy(Class clzz){ Hierarchy hier = new Hierarchy(); hier.setBaseClass(clzz); Class superclass = clzz.getSuperclass(); if(superclass != null && superclass.getName().equals("java.lang.Object")){ return hier; }else{ while((clzz.getSuperclass() != null) && (!clzz.getSuperclass().getName().equals("java.lang.Object"))){ clzz = clzz.getSuperclass(); hier.addClass(clzz); } return hier; } } |
剛編好這個方法,我還沒注意到這個缺陷,但由于我狂熱地崇拜開發人員測試,于是我編寫了一個使用 TestNG 的常規測試。而且,我還利用了 TestNG 方便的 DataProvider
特性,借助該特性,我創建了一個通用的測試用例并通過另一個方法來改變它的參數。運行清單 2 中定義的測試用例會產生兩個通過結果!一切都運轉良好,不是嗎?
文章來源于領測軟件測試網 http://www.kjueaiud.com/