在我們每天業務代碼都寫不完,為什么還要寫測試代碼呢,項目完成之后我再測不行嗎?
看起來像是增加了代碼量,但是它恰恰幫你減少了后期測試排錯的時間,每個team,每個人都是有Bug指標的,首先,每次你那么多bug績效就不好看;其次,這恰能讓我們寫的代碼更健壯,提升代碼質量,后期調試,維護也更容易。試想,你是想后期加班debug呢,還是想在寫每個業務的時候就進行正確性測試,留出更多的時間陪女朋友,陪家人來的更爽
一、JUnit4快速入門
1、JUnit4的簡單介紹
JUnit是一個可編寫可復用測試集的簡單框架,是xUnit的一個子集。
那么什么又是xUnit呢?
xUnit是一套基於測試驅動開發的測試框架,其家族成員眾多,包括PythonUnit、CppUnit(C++)、JUnit(JAVA)
JUnit是托管在Github上的,包含junit.jar、hamcrest-core.jar(設置匹配性規則,是junit的功能增強)兩個包
2、為什么要使用Junit
測試框架可以幫我們對寫的程序進行有目的的測試,能幫我們最大限度的避免代碼中的bug,是程序達到預期的效果,通常一個完整的項目會包含成千上萬,甚至更多的方法,那么如何確定這些方法的結果都是我們想要的,就變得重要。當然也可以創建很多的main函數,使用很多的System.out.println()方法測試每個方法,將結果輸出到控制台,但是我想沒人願意做這樣枯燥繁瑣的事情,而且,這種方式存在明顯的缺點,測試方法不能一起運行,其結果多數都需要程序員自己觀察才可以判定。
幸運的是Junit讓這一切簡單優雅起來,Junit使用斷言機制,可以直接將我們預期的結果和程序最終的結果進行比對,確保對結果的可預知性。
3、如何開發測試用例
Eclipse中包含了Junit的測試框架
二、JUnit4使用詳解
1、使用方法
①、測試方法必須使用@Test進行修飾
②、測試方法必須使用public void進行修飾,不能帶任何的參數
③、新建一個源代碼目錄來存放我們的測試代碼,發布的項目不能包含測試代碼,所以在src源代碼目錄新建一個test文件夾,與項目代碼分離,發布的時候直接刪除test文件夾就可以了。
④、測試類的包應該和被測試類保持一致
⑤、測試單元中的每個方法必須可以獨立測試,測試方法間不能有任何的依賴
⑥、測試類使用Test作為類型后綴(不是必須)
⑦、測試方法使用test作為方法名前綴(不是必須)
2、測試失敗的兩種情況
Failure一般由單元測試使用的斷言方法判斷失敗所引起的,這表示經測試發現了問題,就是說程序輸出的結果和我們預期的不一樣
Error是由代碼異常引起的,它可以產生於測試代碼本身的錯誤,也可以是被測試代碼中的一個隱藏的bug
測試用例不是用來證明你是對的,而是用來證明你沒有錯
測試用例只是用來達到你想要的預期結果,但對於邏輯錯誤無能為力。
3、JUnit運行流程
① @BeforeClass修飾的方法會在所有方法被調用之前被執行,而且該方法是靜態的,所以當測試類被加載后馬上就會運行它,而且在內存中他只會存在一份,所以他比較適合加載配置文件或只適合加載一次的東西。
② @AfterClass修飾的方法通常用來對資源進行清理,如關閉數據庫的連接
③ @Before和@After會在每個測試方法的前后各執行一次
用這四個注解修飾的代碼,可以理解為固定代碼,即一定會被執行的代碼
4、JUnit4中的常用注解
@Test:將一個普通的方法修飾成為一個測試方法,還提供了處理異常和限時測試的功能
@Test(expected = xxException.class)
@Test(timeout=毫秒),對死循環進行測試,也可以進行簡單的性能測試
@BeforeClass:它會在所有的方法運行前被執行,static修飾
@AfterClass:它會在所有的方法運行結束后被執行,static修飾
@Before:會在每一個測試方法被運行前執行一次
@After:會在每一個測試方法被運行后執行一次
@Ignore:所修飾的測試方法會被測試運行器忽略
@RunWith:可以更改測試運行器,繼承org.junit.runner.Runner
斷言
三、JUnit4的深入使用
1、Junit測試套件的使用
在實際項目中,隨着開發的深入,項目會越來越大,相應的測試類也會越來越多,那么總不能一個一個的運行吧,JUnit測試套件就提供了批量運行的方法
① 測試套件就是組織 測試類一起運行的
② 寫一個類作為測試套件的入口類,這個類里不包含其他的方法,更改測試運行器Suite.class,將要測試的類作為數組傳入到Suite.SuiteClasses({})
2、JUnit參數化設置
① 更改默認的測試運行器為RunWith(Parameterized.class)
② 聲明變量來存放預期值和結果值
③ 聲明一個返回值為Collection的公共靜態方法,並使用@Parameters進行修飾
④ 為測試類聲明一個帶有參數的公共構造函數,並在其中為之聲明變量賦值
四、Junit4在web項目中的使用
Spring與hibernate的整合測試
我們在使用開源框架進行項目開發時,框架之間的整合無疑是出錯率比較高的地方,可以使用JUnit進行對Spring於hibernate的整合測試