深入淺出Android單元測試(一):單元測試基礎


安卓機器人
想學習單元測試無從下手,本文對以最易懂的方式介紹單元測試。

若有錯漏,煩請斧正。轉載請注明出處。歡迎關注程序引力

  • 作者:程序引力 | 謝一 (Evan Xie)
  • 郵箱:evanyixie@gmail.com

軟件測試作為軟件質量的保障,有着十分重要的意義。按照不同的層次划分,測試也有着諸多的種類。按照測試方式分,有白盒測試、黑盒測試、灰盒測試。按照測試范圍或流程來分,有單元測試、集成測試與系統測試等。其中,應用覆蓋面最廣、也是最為基礎的就是單元測試。

何為單元測試

單元測試(Unit Test)又被稱為模塊測試,是針對程序中最小可測試單元來進行測試的活動。一般來講,在如今的軟件開發工程中,是指對程序中方法(或稱函數)的測試。通過為這個方法構造初始化的條件,並運行這個方法,看這個方法的行為是否與預期的一致,以此來決定該方法是否正常。

單元測試的意義

快速定位問題

單元測試的主要作用,就是將原本人工檢查程序行為的方式,在最小可測單元范圍內,用程序檢測程序的方法來代替。為此,單元測試的主要作用就是定位問題。同時,由於單元測試的執行效率較高,可以大批量快速執行。這對於對於單元測試覆蓋率較高的工程,若代碼工程有任何問題,則可以快速執行全部單元測試,能夠幫助開發者快速定位或排除問題。

持續集成

目前的軟件交付要求快速迭代與持續集成,在這樣的團隊中每一天都有代碼合入,並且定期都會有新版本發布。在這一過程中,若使用單元測試覆蓋軟件各部分,在開發與集成的過程中不對代碼進行測試,發現問題就立即告警,則可以提高軟件質量與開發效率。

優化軟件設計與架構

單元測試並不是在代碼開發完畢才開始撰寫的,一般情況下都是與開發過程並行或者先與開發過程的。在這個過程中,為了構造可測試的接口與參數,自然會讓開發者在軟件設計時讓程序趨於模塊化,並且接口明確,層次清晰。這也就在無形中優化了軟件的設計與架構。

重構的保障

在重構代碼時,可能會影響既有業務和功能,常常會為了解決一個問題而不慎引入更多問題。若有單元測試的覆蓋,在重構時則有所保障,能夠幫助開發者快速發現問題,提高重構效率。

單元測試思路

開發者在未接觸單元測試之前,往往無從下手。其實,單元測試代碼的開發與普通程序的開發沒有本質的差別。它的核心邏輯是:

  • 確認待測試的方法或對象
  • 為待測試的方法構造初始化條件
  • 調用(運行)該測試方法
  • 比較被測試方法的行為(結果)與預期的是否一致

通過這樣一個模板或思路去理解單元測試,那就非常簡單了。在現行的軟件測試實踐中,為了提高測試代碼的開發效率,業界有着許多測試框架,利用這些測試框架,可以幫助開發者快速開發測試代碼。為此,在進行單元測試前,需要根據自身的情況,對單元測試框架做一定的學習。但不管測試框架是怎樣的,其核心思路都與上文討論的一致。

單元測試原則

單元測試原則常被概括為:FIRST,分別是:

  • 快速(Fast)
    單元測試應該能夠被快速地執行完畢,執行效率低會讓開發者不願意運行。同時,單元測試需要在整個開發過程中執行很多次,過慢的運行速度會影響開發效率

  • 用例獨立(Independent):
    單元測試用例之間應該相互獨立,最好不要有關聯,也不要有執行順序的要求。

  • 可重復(Repeatable):
    單元測試不應該依賴於環境中的數據,它應該有自己的初始化數據或條件,每一次單元測試都是可重復的。

  • 可自驗證的(Self-Validating):
    單元測試應該不用人工檢查,而是可以自驗證的。

  • 全面完整的(Thorough):
    單元測試不應該追求每一個方法都覆蓋到,而是應該追求所有的使用場景都全面完整的覆蓋到。例如對邊界條件,錯誤輸入,大數據量的情況都要覆蓋到。

Android單元測試分類

按照單元測試運行的環境區分,可以分為本地測試以及設備測試.

本地測試

本地測試(Local unit test)運行在JVM中,一般適用於對於沒有Android依賴的測試。該部分測試代碼一般放置於安卓工程的<模塊名>/src/test/java中。

  • 優點:運行速度快、效率高。
  • 缺點:一般情況下,測試代碼不能有Android依賴。

若有Android依賴且要使用本地測試的方式,可以使用測試框架如Mockito來實現。

設備測試

設備測試(Instrumented test)運行在手機或模擬器中,一般適用於需要Android依賴的測試。該部分測試代碼一般放置於安卓工程的<模塊名>/src/androidTest/java中。

  • 優點:測試代碼直接支持對Android的依賴。
  • 缺點:需要真機或模擬器配合,運行速度較本地測試稍慢。

實際上,在這類測試過程中是編譯了一個額外的Apk,並安裝到手機或模擬器中運行的。

測試框架選擇

目前流行的Android測試框架較多,按照對Android依賴的強弱情況,可以分為:

  • 無依賴:JUnit
  • 弱依賴:AndroidJUnitRunner、Mockito
  • 強依賴:Espresso

開發者可以根據自身情況來對測試框架進行選擇,若僅僅測試無安卓依賴的Java代碼,可以僅僅使用JUnit框架。若待測試的代碼對安卓庫有一定的弱依賴,則可以選擇AndroidJUnitRunner、Mockito。若待測試代碼對安卓庫有着非常強的依賴,可以選擇Espresso。

這些框架除了可以滿足待測試代碼對安卓庫的不同依賴情況,還有各自不同的特點,如運行環境與條件均可能存在差異。開發者可以對所需要的框架有一個大致了解后,再選擇進行學習。

若你喜歡本文或覺得有所幫助,請點贊或關注。
你的支持是對筆者最大的鼓勵與肯定。比芯~

底部關注二維碼:小


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM