Android 單元測試小總結

Android 單元測試

保證最小的獨立單元(函數)的代碼是否正確。

詳細介紹:
https://github.com/leeowenowen/AndroidUnitTest

推薦文章:
http://chriszou.com/2016/06/07/android-unit-testing-everything-you-need-to-know.html

為什么做單元測試

  • 方便重構,修改代碼:改前跑一遍,改后跑一遍
  • 更快的反饋:每開發完一個獨立模塊后就可以測試
  • 節約時間:30%編碼,70%測試。改一次,編譯一次。
  • 提升代碼設計:TDD,每個類更小,職責更明確,功能單一。從維護者的角度去編寫代碼。
  • 對軟件質量的提升:從代碼層面發現bug

測什么

單元測試,是為了測試某一個類的某一個方法能否正常工作,而寫的測試代碼。它不是測試一整個流程。而非public方法是這個類的實現細節,我們并不關心,我們只關心某一個public方法的輸入、輸出。

  • 有返回值:輸入響應參數,查看返回值
  • 沒返回值:驗證方法被調用

問題

  • 一般來說,單元測試不會接觸到數據庫,不會接觸到網絡,不會接觸到一些復雜的外部環境,如果有的話,那可能是你測試的方式有誤,測試的粒度不夠“單元”。
  • public,private方法不夠科學
  • 需要增加與業務無關的代碼去測試代碼
  • 需要模擬Android的類,生命周期以及運行環境
    • MVP,MVVM, DI將業務層完全剝離出來,變成純java方便測試
  • TDD

如何測試

Mock

所謂的mock就是創建一個類的虛假的對象,在測試環境中,用來替換掉真實的對象,以達到兩大目的:

  • 驗證這個對象的某些方法的調用情況,調用了多少次,參數是什么等等
  • 指定這個對象的某些方法的行為,返回特定的值,或者是執行特定的動作

Mockito

中文文檔:https://github.com/hehonghui/mockito-doc-zh

PowerMock

PowerMock支持靜態,final以及私有方法的mock
官網:https://github.com/powermock/powermock
推薦文章:https://my.oschina.net/jackieyeah/blog/157076

測試框架

JUnit

單元測試的本質依舊是驗證函數的功能,測試框架也是JUnit

  • setup(@Before)

  • 執行操作(@Test,@After)

  • 驗證結果(@Assert):

    • assertEquals(expected, actual)
    • assertTrue/False(boolean condition)
    • assertNull/NotNull(Object obj)
  • 如果有異常:@Test(expected = Exception.class)沒拋出,測試失敗

Robolectric(推薦)

JVM上無法調用安卓相關的類,所以需要使用Robolectric來模擬android的運行環境。

使用Robolectric后也可以測試android中的視圖屬性,點擊事件,跳轉等。

Android Testing Support Library

谷歌官方提供的測試工具
https://google.github.io/android-testing-support-library/

  • Espresso(UI自動化測試)
  • AndroidJUnitRunner(單元測試)
  • Instrumentation(可模擬Android環境,類似Robolectric)
  • Unit4 Rules
  • UiAutomator

經驗

test和androidTest

構建項目時會自動創建兩個測試的package:androidTest和test,沒有也可以自己創建,我個人簡單的理解為:

  • test:不需要依賴運行環境的JUnit單元測試代碼放這里
  • androidTest: 需要依賴運行環境(模擬器或真機)的集成測試,UI測試代碼放這里

創建測試類

  • 打開要測試的類
  • 點擊Android Studio菜單欄 -> Navigate -> Test -> Crate test case...
  • 選擇需要測試的函數,以及測試框架等等

測試Realm

https://github.com/realm/realm-java/tree/master/examples/unitTestExample

測試Rxjava

http://www.programcreek.com/java-api-examples/index.php?api=rx.observers.TestSubscriber

gradle執行UnitTest

  • ./gradlew test 運行所有Module下的測試
  • test 命令實際包含了testDebug和testRelease以及其他渠道包(如果有的話,如:testAmazonDebug,testAmazonRelease)
  • {@projectName}/{@moduleName}/build/reports/tests下會生成測試結果的報告
  • 如果運行時出現錯誤會中斷,可以使用./gradlew test --continue來不中斷執行
  • 如果想單獨測試某個模塊也可以使用./gradlew {@moduleName}:test比如./gradlew lib_dao:testReleaseUnitTest

Jenkins CI

如果想在build結束后生產Unit Test的報表:

  • 確定在構建時執行了gradle test相關的task
  • 在最后一步添加一個build step,叫做Publish Junit test result report,將生成的所有測試結果文件(xml)的路徑添加到Test report XMLs參數中,例如lib_dao/build/test-results/release/*.xml
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容

  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,485評論 2 45
  • @Author:彭海波 前言 單元測試(又稱為模塊測試, Unit Testing)是針對程序模塊(軟件設計的最小...
    海波筆記閱讀 4,994評論 0 52
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,755評論 25 708
  • 趙偉只要在這條街上一露面,絕對算得上一道惹眼的風景。雖然離開部隊有幾年,早已脫下了那一身橄欖綠,但以他修長的身材和...
    唯一還是我閱讀 509評論 0 1
  • 我是一名90后,生在偏僻的村子,小時候住著土房子,吃著番薯長大,有一個對我很好的奶奶。由于家庭不和睦,性格比較內...
    默金閱讀 413評論 2 3