這個單元,我們要開始介紹在Android 上的測試。
Android 的測試分為
Local unit test :
Local unit test:只在Local 的機器上執行,這些測試在編譯後就在JVM(Java Virtual Machine)執行。這種單元測試不依賴於Android 框架,也就是不需要裝APK,執行的速度也快。在上個單元,我們所提到的測試都是屬於此類的單元測試。
Instrumented unit test:
Instrumented unit test 也是單元測試,只是需要Android裝置或模擬器上執行。這些測試需要Android framework,像是Context等等。執行的速度慢,因為你必須產生APK並安裝在裝置或模擬器上執行。
UI test:
UI 測試用來驗證使用者的操作行為,像點擊按鈕,輸入文字,基本上就是使用者會做的事,當然一定要用到Android framework,因為你會直接接觸到UI,也一定要安裝在Android裝置或模擬器。這些UI測試,我們會使用Espresso來測試
Local unit test 總是我們最優先考量的,因為效能最好,測試最穩定。如果有與Android framework相依的,可以使用Robolectric這個第三方元件,來模擬Android framework。也就是可以像Local unit tests一樣在JVM就可以執行。
這三種測試程式放在以下目錄:
app/src/main/java
- Android 程式碼,通常會以Production code來稱像這樣的程式。app/src/test/java
- Local Unit tests,在JVM執行的單元測試。app/src/androidTest/java
- Instrumented unit tests 、UI 測試,需要在Android Device上執行在Google I/O 2017的這個影片,說明了在Android的測試金字塔
圖片來源 Google IO 2017
最底層的是單元測試,這裡的測試速度應該要很快,會在你的本機執行,也就是在JVM(Java Virtual Machine)。執行的速度快,因為不需要Android,基本上就只是執行Java的程式。這裡的測試通常不會執行在真的手機,你會用Mock、Fake的方式來讓你可以在本機執行。
第二層及第三層則適合在實體裝置或模擬器執行,這兩層的執行會讓你知道你的App是真的可以在手機裡執行的。但這裡的測試當有錯時,不容易找到原因。而且測試的速度較慢,因為你會需要build一個apk出來並裝在實體裝置或模擬器上執行。
寫在單元測試的商業邏輯重要,但UI test、Instrumented test測試一樣重要,因為只要有任一出錯,使用者體驗就是不好。Google 則是建議 70% small, 20 % medium, and 10 % large。因為測試也是有代價的,也就是執行測試花時間。
事實上,測試金字塔只是要告訴大家測試自動化要有不同的層度,每一層的效益、花的時間都是不一樣的。希望大家在投入資源時能做有效的運用。
在這個單元「在Android 上進行單元測試」,我們將介紹這幾種Android的測試。另外在第一篇,我們曾提到了Android之所以難以測試的其中一個原因就是與Android framework相依,將會帶著大家來試著解開這些Android的相依。這裡就會用到之前所提到的依賴注入、Mock、Stub、Mockito這些方法。如果你還不熟悉這些的話,建議大家再回到前幾篇將依賴注入、假物件熟悉後再繼續這個單元。
Android TDD 測試驅動開發:從 UnitTest、TDD 到 DevOps 實踐