iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
0
Mobile Development

從0開始,全方面自動化測試Android App系列 第 3

[Day 3]用JUnit環境練習第一個Unit test

JUnit

什麼是Junit,Junit是Java上最常見的單元測試工具,它可以幫忙把特定測試檔案執行,更進一步組合成測試套件(test suite)配合script執行自動化測試,發佈測試報告等。如果大家是用Android Studio來開發那做JUnit單元測試就相當容易,因為當你新增project時候Android Studio已經把JUnit的套件設置好了,我們不用特地去下載和做系統配置。

dependencies {
    testImplementation 'junit:junit:4.12'
}

Android Studio在build.gradle裡會自動預載JUnit的dependency

接下來用一個測試原生List class的例子來介紹JUnit的基本操作。

class ExampleUnitTest {
    lateinit var list: List<Int>

    @Before
    fun setup() {
        list = listOf(1, 10, 100, 1000, 1001, 1002)
    }

    @Test
    fun testSize() {
        assertEquals(6, list.size)
    }

    @Test
    fun testIndex() {
        assertEquals(1002, list[5])
    }

    @After
    fun tearDown() {
        //remove resources
    }
}

這是一個測試List功能的unit test檔案,JUnit是經由Annotation的方式來驅動測試流程。我們來介紹一下最基本的三個Annotation

  • @Before
    • 在這個class的每個測試前都會執行的區塊,可以在這邊放置共用測試的資料,例如Database、JSon、List等等,這樣就不用在每個testing function裡都要重複寫一次。所以我們在這邊設置一個global的list變數給下面的兩個test使用。
  • @Test
    • 加入@Test代表這是要被測試的function,當我們呼叫JUnit runner執行class時候這個function會被執行。我們第一個test測試List類別的size欄位是否會回傳正確值,第二個test測試List類別的index功能是否會抓到正確的值。
  • @After
    • 在這個class的每個測試後都會執行的區塊,用來釋放資源,例如database、server等等,這邊沒有需要釋放的資源。

assertEquals是判斷測試值與期望值的一個比較function。其實JUnit的概念很簡單實作上一點都不複雜,所以也讓它很受歡迎。

JUnit in Android Studio

接下來我們看看Android Studio如何實作Unit test的部份,我們先開始一個新的Android專案如下。
https://ithelp.ithome.com.tw/upload/images/20190918/20120975xZMsWok4Io.png

新的專案建立後,在下圖中src/test/java/com.daniel.demotest/目錄下已經有了ExampleUnitTest這個預設的class了
https://ithelp.ithome.com.tw/upload/images/20190918/20120975QTBshmYCfD.png

此時我們在ExampleUnitTest檔案上點擊滑鼠左鍵會出現下圖
https://ithelp.ithome.com.tw/upload/images/20190918/20120975Fx2KlR3BwZ.png

我們只要執行ExampleUnitTest就會在下方的Run window看到執行結果,當然目前這個結果是Tests passed
https://ithelp.ithome.com.tw/upload/images/20190918/20120975eq5hwgD32w.png

說到這裡看似我們的Unit test章節就結束了,但是事實上沒那麼簡單,如下圖這是一個新專案預設MainActivity的畫面,請問要怎麼用unit test的方法來測試畫面中長了一個Hello World!呢?
https://ithelp.ithome.com.tw/upload/images/20190918/20120975Jwf4xFCgiX.png

Sorry,辦不到。因為你沒辦法直接在JUnit的環境launch一個MainActivity的實體,因為Activity如下圖是要從Android device上的Zygote去呼叫APK,經由Layout inflation的過程最後把畫面render出來。而JUnit只能單純的幫我們呼叫單一檔案無法去執行build好的APK。
https://ithelp.ithome.com.tw/upload/images/20190918/20120975BDUGjo5Hbt.png

所以unit test只能單純測試不包含UI的邏輯部份,那你應該會想那unit test在android不就沒用了?android不就是要UI為主的application。這句話只對了一半,雖然mobile application都是要靠UI呈現,但在還是有一些與UI無關的邏輯部份可以用unit test的方式來保證產出的品質。

但是剛剛提到unit test無法動態執行APK那要如何把滿滿都是UI行為的Android Application放到unit test裡執行?這時候我們可以靠一些Application的設計模式、如MVP或是MVVM等架構來幫助我們建立一套可以被測試的架構,在後續章節會繼續介紹。


上一篇
[Day 2] Unit Test 基本觀念
下一篇
[Day 4] 從MVP模式開始練習Unit test
系列文
從0開始,全方面自動化測試Android App30

尚未有邦友留言

立即登入留言