Android單元測試(三):測試難點及方案選擇

3.1 Android單元測試難點

在Android應(yīng)用程序里寫單元測試時,剛開始往往會有無從下手的感覺。他既有處理UI邏輯的代碼,也有處理業(yè)務(wù)邏輯的代碼,總感覺一團亂麻。根據(jù)個人的經(jīng)驗總結(jié)起來,本人覺得主要難點有以下幾條:

  1. Activity類充當了god class(上帝類),它接管了所有的職責,各種業(yè)務(wù)邏輯錯綜復(fù)雜的穿插在一起。業(yè)務(wù)邏輯之間沒有一個清晰的邊界,也就無法劃分出“單元”。
  2. 針對UI層面的單元測試,業(yè)界沒有統(tǒng)一的標準,不知該如何下手。
  3. Android默認的測試框架,必須運行在Android環(huán)境上,而這樣會導(dǎo)致每次寫單元測試時,都需要打包運行,才能進行測試。如果你的項目工程很大,打包的時間會很長,這樣為了跑一個單元測試得花費老半天時間。
  4. 我們來測試某一個方法時,有時會發(fā)現(xiàn),這個方法里某個地方會依賴一個很重的對象來處理某個業(yè)務(wù)邏輯,而這個重對象的構(gòu)造確很復(fù)雜,這樣也會造成寫單元測試的困難。

總的說來,造成單元測試很難寫的原因:一方面是程序架構(gòu)的問題,業(yè)務(wù)邏輯分層不清晰,職責不單一;另一方面是沒有一個好的測試框架,有好的工具才會事半功倍。

3.2 如何解決單元測試難點

針對這些問題,我們一一來分析,該采用什么樣的架構(gòu)設(shè)計,以及采用什么樣的測試框架,能解決我們寫單元測試的難點。

  1. 以前的Android應(yīng)用程序,都是采用傳統(tǒng)的MVC開發(fā)模式。MVC模式共分為3層:Model層、Controller層、View層,三層之間代碼通常會耦合嚴重,彼此之間存在嚴重的依賴關(guān)系,這其實違反了軟件設(shè)計高內(nèi)聚、低耦合的原則。我們期待的是能夠?qū)γ恳粚佣寄苓M行單獨測試,層與層之間沒有那么多的彼此依賴。由此,在MVC的基礎(chǔ)之上演化出了MVP設(shè)計模式(不懂的自行搜索學(xué)習(xí)),UI與業(yè)務(wù)邏輯完全隔離開來,這樣就可以單獨針對P層來測試,也可單獨針對Model層來測試。
  2. UI層的單元測試,現(xiàn)在谷歌提供了一個默認的測試框架Espresso+AndroidJUnitRunner,應(yīng)該說官方提供的這個測試框架一定程度上解決了UI測試難的問題。
  3. 打包慢是大家都會碰到的問題,我們期望的是有這么一個測試環(huán)境:當我們寫好單元測試代碼,能不能直接運行在JVM環(huán)境上,就像運行一個java類里面的main方法一樣那么簡單,不用每次都要打包那么麻煩而且緩慢。很早就有了JUnit這么一個測試框架,它只能運行純java代碼,但是我們的代碼里面會用到很多Android SDK的東西,這樣JUnit就不能完全滿足我們的需求了。幸運的是,我們有了Robolectric單元測試框架,它實現(xiàn)了一套JVM能運行的Android代碼,一定程度上做到了脫離Android環(huán)境進行測試。
  4. 單元測試是針對某個方法來寫的,如果這個方法里依賴了一個很重的對象(構(gòu)造這個對象很復(fù)雜),那我們該怎么辦呢。同樣幸運的是,我們有Mockito這個測試神器。我們可以使用Mockito這么一個測試框架,對這些及其復(fù)雜的對象,mock一個出來,mock出來的對象具備了與原來對象一模一樣的功能,這樣就解決了這個問題。

3.3 測試方案

最終我選擇的測試方案如下圖所示:


測試框架.png

Presenter層僅僅處理業(yè)務(wù)邏輯,不需要處理UI等,所以我選擇了直接運行在JVM環(huán)境上的框架;View層都是UI相關(guān)的東西,這個沒的選擇;Model層有2種選擇,一種類似于數(shù)據(jù)庫存儲、SharePreference數(shù)據(jù)讀取,它必須運行在Android環(huán)境上才方便測試,一種類似于Restfull Api接口請求之類的,它在JVM環(huán)境上是可以直接運行的,所以這里我選擇了2種框架,具體根據(jù)實際情況來選擇。

3.4 小結(jié)

本文先總結(jié)了Android單元測試的幾個難點,接著針對這幾個難點一一分析怎么去解決它們,最后確定了Android單元測試的整體測試方案,主要是不同情況下不同單元測試框架的選擇。

系列文章:
Android單元測試(一):前言
Android單元測試(二):什么是單元測試
Android單元測試(三):測試難點及方案選擇
Android單元測試(四):JUnit介紹
Android單元測試(五):JUnit進階
Android單元測試(六):Mockito學(xué)習(xí)
Android單元測試(七):Robolectric介紹
Android單元測試(八):怎樣測試異步代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容