2016年11月28日 星期一

Testing: Android環境的單元測試

前言

在前一篇Testing: 單元測試簡介一文中介紹完單元測試後,也認識了不依賴單元測試框架,而改用手動撰寫單元測試是非常耗時和麻煩的,好不容易讓已寫好的程式碼運行穩定,當下次撰寫新的程式碼時,那些擾人的手動判斷又要重複一次,真是太可怕了。完全手工的方式撰寫,機械化地執行它們,很容易出錯也浪費時間,我們希望能透過自動化建置來解決這些問題,這時我們就需要單元測試框架的輔助。

第一個單元測試

在Android的開發中,撰寫的語言是以Java為基礎,所以測試的框架便是JUnit。當你開啟一個新的Android專案時,你無須引入JUnit任何的函式庫,Gradle當中就已經幫你包含進去了,如下所示。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    compile 'com.android.support:appcompat-v7:25.0.1'

    testCompile 'junit:junit:4.12'
}

Android Studio同時也會為你建置一個單元測試案例(Test case),可以先看看這個預設的測試案例具備什麼元素,如下所示。

public class ExampleUnitTest {

    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

這個測試案例的類別名稱為ExampleUnitTest,並且隸屬於test package底下,而這個package都是放置與單元測試相關的案例,也就是直接運行在JVM層的測試。這個類別包含了一個名為@Test的annotation,測試案例稱為addition_isCorrect(),裡面寫了assertEquals(4, 2 + 2)的程式碼,所以可以知道撰寫一個測試案例至少要具備這些元素。

  • 測試類別: 這個類別主要包含你應有的測試案例。
  • Annotation: 若沒有增加這個@Test這個Annotation,編譯時就會無法得知這個方法是否為測試方法。你也可以試著將這個移除,就會發現原本左邊的測試按鈕會消失,變為一般的方法了,如下圖。

  • Assertion: Assertion的意思為斷言,其實就是斷定你所預期的行為是否正常。

測試結果

當知道具備這些基本元素後,可以試著執行看看,並觀察其結果。在檔案列表中,對著該測試類別點選右鍵,選擇Run ‘XXXXXX’,如下圖。


或是程式碼中針對某個測試案例執行也行,點選方法左邊的執行圖示即可,如下圖。


執行完後的結果如下圖所示,綠燈是通過;紅燈則是失敗。



小結

順利執行完簡單的Android單元測試,對於基本的實作有了初步概念,一個測試案例至少需具備測試類別名稱、Test的Annotation,以及你所斷言的預期行為,下一篇我們要正式進入練習單元測試的領域啦!

沒有留言:

張貼留言