單元測試很重要、TDD很重要,但在Android要怎麼寫呢?這個系列將用Kotlin介紹單元測試基本概念以及在Android如何運用單元測試。進而在Android 實踐TDD(測試驅動開發)。其中會運用MVP、MVVM 這兩個架構提升可測試性。
希望讓大家在看完這個系列,可以實際在你的Android app開發上導入單元測試及TDD。
在測試之前,先學會架構!
我開設了一門教MVP、MVVM 架構的線上課程,搭配Android Architecture Components。
Android 架構設計 | 用 Architecture Components 打造易維護、可測試的App
出版書
天瓏網路書店:Android TDD 測試驅動開發:從UnitTest、TDD到DevOps實踐
單元測試就是以程式中最小的邏輯單元或最小的工作單元為對象,來撰寫測試程式,驗證邏輯是否正確。
一般來說,程式中最小的邏輯單元就是一個function。
我們在寫一個App時,大部分花的時間,可能不是花在寫程式,而是在除錯、修改、維護,而單元測試可以讓你用最快的時間發現程式的問題在哪?讓你修改程式時不用害怕改錯。人應該做更有價值的事,不是一直check。
Android framework的相依
Android 的單元測試其實不容易寫。因為Android 專案的編譯是透過本機的SDK,而執行App卻是依賴真實的裝置或模擬器。當我們進行單元測試時,如果與Android Framework相關,就需要執行在真實的裝置或模擬器。這將導至測試的時間大大的增加。
這也是這個系列的重點之一,如何讓你在執行單元測試時,不會因為相依Android Framework 而變慢。
Android的架構
在Android,Activity有著太多的邏輯,可能會處理View的邏輯、商業邏輯、資料交換等等,Activity的程式碼就會越來越多,變得難以維護,也難測試。我們會在這個系列用MVP、MVVP架構將邏輯切割為不同的部分。分割好這些部分能讓你減少與Android Framework的相依,也就是能在本機JVM執行,以提升速度。
這個主題將以4個單元進行
從單元測試基本概念、測試框架JUnit,怎麼依賴注入、怎麼使用假資料Mock、Stub等等。
單元重點
撰寫第一個測試
測試框架 JUnit
依賴注入 Dependency Injection
假資料 Stub與Mock
Mock 框架:Mockito
單元二將進入到Android的測試,在初學Android 測試你可能會遇到2個讓你無法在Android測試的問題。
在Android 不知道怎麼運用單元測試
我學會單元測試了,但是在Android不知道怎麼用。你可能會在單元測試學到了怎麼測試計算價錢的邏輯,怎麼測試商業邏輯。如果我是寫一個電商的App,通常不太會有複雜的商業邏輯寫在App裡。例如你不會在App寫計價的功能,(安全考量你會寫在Web API),你的App最頻繁做的事可能呼叫 Web API呈現資料,或將使用者填寫的資料丟給Web API。這個單元將展示你該怎麼測試及測試哪些情境。
Android Framework的相依。
你的App可能會有部分邏輯及功能與Android Framework相依,例如儲存資料SharePreference、Context、Activity等等,這會讓你的測試必須跑在實機或模擬器上,這種Instrumented Test讓測試的速度變慢。我們將在這個單元將展示如何解Android Framework的相依以提升測試的速度及何時該直接使用Instrumented Test來提高測試的真實度。
單元重點
在Android 寫單元測試
隔離Android Framework
Instrumented Tests
Robolectric
UI測試
擅用CustomView提升可測試性
使用ProductFlavor mock
要設計良好的架構,必須做到關注點分離
。無論你有沒有寫過測試,可能都知道Activity經常有過多的職責,這些過多的職責會導至不易測試。在這個單元將會透過MVVM(Model View ViewModel)、MVP(Model View Presenter)架構,來做到關注點的分離。除了讓程式碼易維護也讓你的程式是容易被測試的。
單元重點
MVP 架構與單元測試
MVVM 架構與單元測試
依賴注入框架
呼叫API (Retrofit)的測試
學會了單元測試之後,下一個問題就是什麼時候撰寫測試
。TDD(Test-Driven Development)測試驅動開發 是一種在撰寫Production code之前先撰寫Testing Code的一種方法。
在TDD,我們會先撰寫一個會執行失敗的測試,接著完成Production Code,也讓測試可以通過,籍此來確認Production Code是正確的。
而在 Google I/O 2017 的 解釋了怎麼在Android TDD,透過先寫外圈的Fail UI Test,接著逐一完成內圈的黃色的Feature Unit Test,完成所有的Unit Test之後,接著讓最後外圈UI Test通過。
圖片來源:Google I/O 2017
單元重點
TDD 介紹
MVP 架構的TDD
MVVM 架構的TDD
開發工具,你需要安裝IntelliJ、Android Studio。在第一單元,我們將用IntelliJ來實作範例。在第二單元開始進入Android將使用Android Studio實作範例。
你一定可以學會單元測試的,一定可以運用在Android app開發的。
每一篇都會有範例可以下載, 請大家動手試看看,會得到更好的學習效果。
Android 架構設計 | 用 Architecture Components 打造易維護、可測試的App
3堂組合:Android 架構設計 + 動畫入門到進階 + UI 進階實戰