1. 程式人生 > >【Android】單元測試方法簡介

【Android】單元測試方法簡介

前言

基本單元測試框架

Java單元測試框架:Junit、Mockito、Powermockito等;

Android單元測試框架:Robolectric、AndroidJUnitRunner、Espresso等。

最開始建議先學習Junit & Mockito。這兩款框架是java領域應用非常普及,使用簡單,官網的說明也很清晰。junit執行在jvm上,所以只能測試純java,若要測試依賴android庫的程式碼,可以用mockito**隔離依賴**(下面會談及)。

之後學習AndroidJUnitRunner,Google官方的android單元測試框架之一,使用跟Junit

是一樣的,只不過需要執行在android真機或模擬器環境。由於mockito只在jvm環境生效,而android是執行在DalvikART,所以AndroidJUnitRunner不能使用mockito

然後可以嘗試Robolectric & EspressoRobolectric執行在jvm上,但是框架本身引入了android依賴庫,所以可以做android單元測試,執行速度比執行在真機or模擬器快。但Robolectric也有侷限性,例如不支援載入so,測試程式碼也有點彆扭。當然,robolectric可以配合junit、mockito使用。Espresso也是Google官方的android單元測試框架之一,強大就不用說了,測試程式碼非常簡潔。Espresso本身執行在真機上,因此android任何程式碼都能執行,不像junit&mockito那樣隔離依賴。缺點也是顯而易見,由於執行在真機,不能避免“慢”

Junit

Junit測試順序:@FixMethodOrder

參考Junit單元測試 | 註解和執行順序

Powermockito

如何mock單例模式

【Unit Test Hints】: How to mock a Singleton using PowerMock

Robolectric

使用Robolectric時,你可能會遇到問題。因為Robolectric對於每一個測試元件都使用了一個新的擁有不同設定的ClassLoader。對於PowerMock也是一樣,對於每一個基本元件,它都提供了一個ClassLoader,並且規定他們都為不可重用狀態。

JVM有兩個非常重要的相關限制:

  1. 一個共享的庫在一個程序中只能被載入一次.
  2. ClassLoader不共享載入的庫的資訊

因此在測試執行中使用多個ClassLoader是非常有問題的。因為每一個Classloader例項都會嘗試載入so,但是除了第一個會成功之外,其它的都會報Native library XXX already loaded in another classloader(已經在另一個classloader被載入過了)的異常.

避免這個的唯一方法是避免使用多個ClassLoader,如果必須使用新的ClassLoader,則使用fork程序的方式.

Instrumentation

Espresso

參考資料