1. 程式人生 > >深入淺出Android單元測試(一):單元測試基礎

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

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

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

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

何為單元測試

單元測試(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。

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

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

底部關注二維碼:小