想學習單元測試無從下手,本文對以最易懂的方式介紹單元測試。
若有錯漏,煩請斧正。轉載請注明出處。歡迎關注程序引力
- 作者:程序引力 | 謝一 (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。
這些框架除了可以滿足待測試代碼對安卓庫的不同依賴情況,還有各自不同的特點,如運行環境與條件均可能存在差異。開發者可以對所需要的框架有一個大致了解后,再選擇進行學習。
若你喜歡本文或覺得有所幫助,請點贊或關注。
你的支持是對筆者最大的鼓勵與肯定。比芯~