可以開始編寫單元測試了嗎?等等……,您打算把單元測試代碼放在什么地方呢?把它和被測試代碼混在一起,這顯然會照成混亂,因為單元測試代碼是不會出現在最終產品中的。建議您分別為單元測試代碼與被測試代碼創建單獨的目錄,并保證測試代碼和被測試代碼使用相同的包名。這樣既保證了代碼的分離,同時還保證了查找的方便。遵照這條原則,我們在項目 coolJUnit 根目錄下添加一個新目錄 testsrc,并把它加入到項目源代碼目錄中(加入方式見 圖2)。
圖2 修改項目源代碼目錄
圖2 修改項目源代碼目錄
現在我們得到了一條 JUnit 的最佳實踐:單元測試代碼和被測試代碼使用一樣的包,不同的目錄。
一切準備就緒,一起開始體驗如何使用 JUnit 進行單元測試吧。下面的例子來自筆者的開發實踐:工具類 WordDealUtil 中的靜態方法 wordFormat4DB 是專用于處理 Java 對象名稱向數據庫表名轉換的方法(您可以在代碼注釋中可以得到更多詳細的內容)。下面是第一次編碼完成后大致情形:
package com.ai92.cooljunit; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 對名稱、地址等字符串格式的內容進行格式檢查 * 或者格式化的工具類 * * @author Ai92 */ public class WordDealUtil { /** * 將Java對象名稱(每個單詞的頭字母大寫)按照 * 數據庫命名的習慣進行格式化 * 格式化后的數據為小寫字母,并且使用下劃線分割命名單詞 * * 例如:employeeInfo 經過格式化之后變為 employee_info * * @param name Java對象名稱 */ public static String wordFormat4DB(String name){ Pattern p = Pattern.compile("[A-Z]"); Matcher m = p.matcher(name); StringBuffer sb = new StringBuffer(); while(m.find()){ m.appendReplacement(sb, "_"+m.group()); } return m.appendTail(sb).toString().toLowerCase(); } }
它是否能按照預期的效果執行呢?嘗試為它編寫 JUnit 單元測試代碼如下:
package com.ai92.cooljunit; import static org.junit.Assert.assertEquals; import org.junit.Test; public class TestWordDealUtil { //測試wordFormat4DB正常運行的情況 @Test public void wordFormat4DBNormal(){ String target = "employeeInfo"; String result = WordDealUtil.wordFormat4DB(target); assertEquals("employee_info", result); } }
很普通的一個類嘛!測試類 TestWordDealUtil 之所以使用“Test”開頭,完全是為了更好的區分測試類與被測試類。測試方法 wordFormat4DBNormal 調用執行被測試方法 WordDealUtil.wordFormat4DB,以判斷運行結果是否達到設計預期的效果。需要注意的是,測試方法 wordFormat4DBNormal 需要按照一定的規范書寫:
1.
測試方法必須使用注解 org.junit.Test 修飾。
2.
測試方法必須使用 public void 修飾,而且不能帶有任何參數。
測試方法中要處理的字符串為“employeeInfo”,按照設計目的,處理后的結果應該為“employee_info”。assertEquals 是由 JUnit 提供的一系列判斷測試結果是否正確的靜態斷言方法(位于類 org.junit.Assert 中)之一,我們使用它將執行結果 result 和預期值“employee_info”進行比較,來判斷測試是否成功。
看看運行結果如何。在測試類上點擊右鍵,在彈出菜單中選擇 Run As JUnit Test。運行結果如下圖所示:
文章來源于領測軟件測試網 http://www.kjueaiud.com/