在《初入Android單元測試》中我們對Android單元測試有了一個大概的了解,我們直接進入項目測試環(huán)節(jié)。直接用代碼來學習單元測試。
我們寫單元測試,一般都會用到一個或多個單元測試框架,在這里,我們介紹一下JUnit4這個測試框架。這是Java界用的廣泛,也是基礎的一個框架,其他的很多框架,包括我們后面會看到的Robolectric,都是基于或兼容JUnit4的。
在Android工程中引入JUnit
在Android項目里面使用JUnit是很簡單的,你只需要將JUnit這個library加到你的dependencies里面。
testCompile 'junit:junit:4.12'
當然,如果你是通過Android Studio來創(chuàng)建的項目,那么這個dependency默認是加上了的,所以你甚至這步都可以省略。
JUnit基本的使用
當我們通過Android Studio創(chuàng)建好項目之后,我們在src/androidTest/java下,會看到自動生成了的單元測試代碼
雖然代碼很少,但是在看代碼之前,我們也先來學習一下JUnit中的一些知識點。
@Test : 通過給某個方法添加這個注解,JUnit會把它當作是一個需要測試的方法。
assertEquals(expected, actual):驗證expected的值跟actual是一樣的,如果是一樣的話,測試通過,不然的話,測試失敗。
可以看到自動生成的代碼中有一個useAppContext()的方法,該方法上面也標注了@Test注解,所以該方法是一個可以測試的方法,里面只有兩行代碼,它的作用是判斷當前測試的app包名是否等于"com.whyalwaysmea.junit"(當然,你的代碼此處應該是你自己的包名)
點擊左側的運行按鈕,可以直接對該方法進行測試運行了。如果包名和字符串相等,那么測試方法會運行成功,如果包名和字符串不相等,那么測試方法會報錯,具體的可以看所打印出來的log
JUnit的更多方法
更多的注解:
@Before: 如果一個方法被@Before修飾過了,那么在每個測試方法調(diào)用之前,這個方法都會得到調(diào)用。
@After: 每個測試方法運行結束之后,會運行的方法。比如一個測試文件操作的類,那么在它的測試類中,可能@Before里面需要去打開一個文件,而每個測試方法運行結束之后,都需要去close這個文件。這個時候可以把文件close的操作放在@After里面,讓它自動去執(zhí)行。
類似的,還有@BeforeClass和@AfterClass。@BeforeClass的作用是,在跑一個測試類的所有測試方法之前,會執(zhí)行一次被@BeforeClass修飾的方法,執(zhí)行完所有測試方法之后,會執(zhí)行一遍被@AfterClass修飾的方法。
@Ignore: 很多時候,因為某些原因(比如正式代碼還沒有實現(xiàn)等),我們可能想讓JUnit忽略某些方法,讓它在跑所有測試方法的時候不要跑這個測試方法。要達到這個目的也很簡單,只需要在要被忽略的測試方法前面加上@Ignore可以了
更多驗證:
assertEquals(expected, actual, tolerance)
這里傳入的expected和actual是float或double類型的,大家知道計算機表示浮點型數(shù)據(jù)都有一定的偏差,所以哪怕理論上他們是相等的,但是用計算機表示出來則可能不是,所以這里運行傳入一個偏差值。如果兩個數(shù)的差異在這個偏差值之內(nèi),則測試通過,否者測試失敗。
assertTrue(boolean condition)
驗證contidion的值是true
assertFalse(boolean condition)
驗證contidion的值是false
assertNull(Object obj)
驗證obj的值是null
assertNotNull(Object obj)
驗證obj的值不是null
assertSame(expected, actual)
驗證expected和actual是同一個對象,即指向同一個對象
assertNotSame(expected, actual)
驗證expected和actual不是同一個對象,即指向不同的對象
注意:上面的每一個方法,都有一個重載的方法,可以在前面加一個String類型的參數(shù),表示如果驗證失敗的話,將用這個字符串作為失敗的結果報告。
比如:
assertEquals("Current user Id should be 1", 1, currentUser.id());
當currentUser.id()的值不是1的時候,在結果報道里面將顯示"Current user Id should be 1",這樣可以讓測試結果更具有可讀性,更清楚錯誤的原因是什么。
總結
該篇主要介紹了JUnit的一些基本使用,當然他的功能不僅于此,畢竟他是java項目中使用廣泛的單元測試框架。