聲明:本欄目所使用的素材都是凱哥學堂VIP學員所寫,學員有權匿名,對文章有最終解釋權;凱哥學堂旨在促進VIP學員互相學習的基礎上公開筆記。app
Junit又名單元測試,Junit是用來測試Java代碼的,使用Junit測試有什麼特別的地方嗎?Junit的好處之一,落實在單元兩字上。能夠對單元進行全方位測試。框架
什麼是單元?單元就是模塊。單元測試
單元小一點能夠指一個類,一個類完成一件事件。學習
單元在小一點,能夠指一個類中的方法。一個方法完成一個功能,多個方法組成一個類。測試
咱們要對這一個個單元,一個個模塊進行全方位測試,咱們就能夠使用Junit。Junit提供了這樣的功能:分塊全方位測試。優化
例:翻譯
這裏有一個方法,給年齡賦值。先判斷年齡是否符合要求,若是不符合,則拋出異常。若是符合則賦值給年齡。xml
使用Junit對前面寫的年齡方法進行測試對象
@Test註解,告訴別人我這是一個測試用例,待會給我運行這個測試用例繼承
由於一個方法寫在類中,又不是main方法,光一個方法是不會被運行的。寫上@Test表示這個Junit測試用例。註解配置描述着:這是一個測試用例,待會會來調用此註解下的方法
在第一個測試用例中,咱們setAge傳入年齡10,這是正常的年齡是不會有錯誤的。
在第二個測試用例中,咱們@Test(expected)表示這個用例會拋出以下錯誤,若是有拋出我指定的錯誤,表示測試是經過。若是沒有拋錯或是拋錯但不是個人這個錯誤,表示測試不經過
在這裏就進行了2種測試。一個是正常狀況下是否正確,一個是測試參數非法下是否會拋出異常。拋出指定的才經過,不然不經過。
運行結果以下:
運行了2個測試用例,都執行成功
若是我將測試拋出異常的方法改成10,年齡正常下,就不拋異常,再看測試用例:
改成10:
出現了警告,表示這個用例指定的異常沒有被拋出。須要拋出異常,才表示正常經過。由於這個用例就是用來測試異常是否被拋出的。
當點擊類上的運行,是這個測試類下的全部用例所有運行起來,如以前
當點擊某一個用例的運行,表示只單獨運行這一個用例如左下角
這就是全方面測試體現之一:能夠對某一個方法,單獨拎出來測試。能夠對某一個方法,測試他正常運行,還測試他非法訪問。不只測正確,還要測錯誤。
若是沒有用Junit,咱們就只能是寫一個類,main方法調用進行測試。這樣有點不合適,而且測起來也麻煩,使用Junit就能夠避免這種問題
在@Test註解,有2個參數能夠選填
一個是expected,一個是timeout。一個設置方法會拋出異常,一個設置方法執行時間。
查看這個expected,是Class<? extends Trowable>,要求Class而且繼承要異常,能夠測異常 Timeout是設置這個方法執行的時間,當超過這個時間,表示這個方法超時了,能夠作優化
Junit還提供了什麼呢?
咱們這裏有一個MyArrayList類,咱們打算測試這個類:
這裏有這樣一個註解@BeforeClass
@BeforeClass這個註解的意思是,在運行整個Junit以前,先調用這個方法。等同於初始化 還有這個註解@AfterClass,在運行完畢整個Junit後,調用這個註解下的方法,等同於destroy 還有@Before每次調用Junit案例前,先執行我這個方法 還有@After每次調用完Junit案例後,先執行我這個方法
這裏的區別是: @BeforeClass與@AfterClass是在運行Junit框架先後調用,只會調用一次 @Before與@After是在調用用例先後調用,有多少個用例調用多少次
咱們什麼靜態的集合屬性,咱們這裏使用@BeforeClass註解,在執行整個Junit用例開始前,先給集合注入數據,在後面的測試就能夠使用集合,就不用填充數據了。
@BeforeClass須要是靜態的方法,由於在整個執行前先調用,多是拿類.方法調用。保證方法先被執行。
測試一:
進入Junit調用@BeforeClass注入數據。咱們這裏addMyArrayList測試: 第0個數據是不是嘻嘻哈哈,第1個數據是不是哈哈嘻嘻,第2個數據是不是哈哈哈哈
Assert Junit提供的操做類,翻譯:斷言。這個操做類有什麼用處呢?它的方法替代咱們的一些操做。好比這裏判斷先後和後面的對象是否同樣。就是解決這種事情的。若是符合則表示經過,若是不符合就報錯。斷言,斷論是否OK
Assert提供的方法都是靜態的方法:
引入靜態包,*將Assert下的靜態方法所有引入。
靜態引包好處是,以前調用:Assert.assertEquals()。如今調用:assertEquals()
判斷刪除:
刪除第二個,則就刪掉了最後一個哈哈哈哈。assertNull判斷第二個是否爲null
在添加一個進入,第二個不爲null。assertNotNull判斷第二個是否不爲null
assertEquals判斷第一個對象與第二個對象是否一致
刪除第一個,那麼就由0 1 2變成0 2。那麼2爲1,則就是哈哈哈哈爲1,哈哈嘻嘻被刪除。assertEquals判斷第二個是不是哈哈哈哈
判斷下標越界:
測試參數錯誤,是否爲拋出越界錯誤
判斷修改
判斷修改的地方是不是咱們預期的值
這就是Junit測試,對業務塊全方位測試。
@Test提供多方面測試。提供的Assert斷言減輕了咱們之前測試麻煩。
@Ignore
要測試的用例:
對方法進行測試,按照往常,這樣的一測試就報錯,由於裏面有拋錯,Junit也沒有指定邏輯會拋出錯誤
查看測試:
對於這個用例,上面劃上了蜂窩的圖標。也沒有報錯。爲何會這樣呢? 這就是@Ignore的做用了,ignore翻譯:忽略。這個註解的意思是:忽略這個用例不執行。因此沒報錯,由於根本沒有執行這個用例,這就是@Ignore的做用,忽略測試用例
@Runwith
這個註解在Spring-TestContext對Spring測試時,會使用到這個註解。在使用Spring測試時有2個註解,一個是@Runwith一個是ContextConfiguration。
@ContextConfiguration的意思是指定application.xml Spring配置文件在哪裏,那@Runwith是意思是?
這個註解的意思猜想是運行以前啓動這個類。什麼意思呢?啓動@Runwith指定的類,這樣Spring書寫的test類就啓動了,這樣這個test類就會幫咱們構建Spring環境。這樣咱們在test中就能夠直接使用,無需手動建立applicationcontext類了。
看來這個@Runwith與@BeforClass的意思是差很少了,是的。不過@BeforClass是在運行測試前調用這個靜態方法。而@Runwith是運行測試前運行這個類
查看註解裏面的申請:
裏面要求的是class,類的class管理。要求這個傳遞的class要繼承與Runner類
咱們繼承這個類,查看要求,這個類是一個抽象類:
繼承這個抽象類,須要實現2方法,一個是銷燬,一個運行。當重寫這兩個方法後,在運行Junit前應該就是調用run,運行完畢後在調用銷燬方法。
但當咱們這樣寫後,報錯了,也沒有深究。但意思是這個意思,在運行Junit測試前,會調用這個run開始作初始化或是其餘操做。