提及軟件測試四個字,想必你們腦海中浮現的有集成測試、系統測試、黑盒測試、白盒測試等,可能就是沒想到會有單元測試。 對於大學是學習軟件工程專業出身的同窗來講可能會聽過這四個字,對工做好幾年的職場老鳥可能也聽過可是沒實際用過居多。絕大多數的開發人員都是忙於把手頭的工做開發好,並不會把單元測試歸入工做範疇,他們會說,我連功能開發都忙不過來了,哪有時間去作單元測試,何況還要寫測試代碼,那不是重複寫一篇代碼功能嗎?但,單元測試真的不值得花時間去作嗎,那是由於可能你並不清楚單元測試的投入產出比有多高,下面就簡單介紹單元測試到底能給開發人員帶來多少好處。html
單元測試本質上也是代碼,與普通代碼的區別在於它是驗證代碼正確性的代碼。可簡單作個定義:單元測試是開發人員編寫的、用於檢測在特定條件下目標代碼正確性的代碼。前端
軟件開發天生就具備複雜性,沒人敢打包票說本身寫的代碼一點問題都沒有,或者不經測試就能保證代碼正確運行,可能你在這個執行路徑下可以執行,卻不知還有其餘路徑,有一一去驗證過嗎,所以,要保證程序的正確性就必需要對咱們代碼進行嚴格測試。java
舉個簡單例子:好比有個計算類,裏面有個 add 方法,操做就是兩個數進行相加。android
public class Calculator { public int add(int one, int another) { //只是簡單的兩個數相加 return one + another; } }
常規作法:假如你寫好了這個方法,你想進行驗證 add 方法的正確性,須要寫個使用 add 方法的 main 函數,首先實例化 Calculator 類,而後調用 add 方法並傳入兩個參數,好比 1 和 2。而後你運行這個工程,看得出結果是否爲 3 ,若是是 3 ,則代表我這個方法寫的沒有錯誤,可能就不測試了,就繼續開發後續的功能,若是不是 3 ,則返回去看看代碼中哪裏出錯了,從新進行調試,甚至有時候肉眼還看不出代碼哪裏出錯,此時就引入斷點去查看,在此期間,很大一部分時間就花在斷點、調試、運行上。數據庫
單元測試作法:首先會利用 JUnit 測試框架(至於這個框架後面介紹)寫一段測試代碼,以下:編程
public class CalculatorTest { public void testAdd() throws Exception { Calculator calculator = new Calculator(); int sum = calculator.add(1, 2); Assert.assertEquals(3, sum); } }
這裏的 CalculatorTest 是 Calculator 對應的測試類,這裏的 testAdd 對應着 add 的測試方法,進行測試通常分爲三步驟:數組
看到 Assert 這個關鍵詞了嗎,這裏能夠理解爲斷言或者指望值,根據入參的值,指望有個什麼值輸出,而不是靠肉眼去驗證是否是本身想要的值,是直接經過判斷值是否相等性來驗證會具備更客觀性。性能優化
以上介紹的只是單元測試一點點,那它能給咱們帶來哪些更多好處呢?數據結構
一般咱們在作任何工做會先考慮它的回報,編寫代碼更是如此。若是單元測試的做用不大,沒有人會願意再寫一堆無用的代碼,那麼單元測試到底可以給咱們帶來什麼優勢呢?以下:多線程
等等,講了這麼多優勢,無非就是良好的接口設計、正確性、可迴歸、可測試、完善的調用文檔、高內聚、低耦合,這些優勢已經足以讓咱們對單元測試重視起來了,可是我的以爲還有更重要的緣由。
不少開發人員不寫單元測試,最重要的一個緣由是他們並不知道單元測試可以帶來什麼好處,甚至根本不瞭解單元測試這個詞,那天然就像平行線般與之毫無交集。還有一個比較重要的緣由是一些開發人員的編程思想還處在一個相對初級的階段,開發軟件只管實現功能,什麼高內聚、低耦合、重構、設計、可測試等認爲太過專業,對於這些名詞以及意義還不瞭解,這天然不會考慮使用了。還有一些非思想層面的理由,以下:
JUnit 是一個 Java 語言的單元測試框架,它是 xUnit 單元測試架構體系的一個實例,用於編寫和運行可重複的測試。它包括如下特性:
TestNG 是一個測試框架,其靈感來自 JUnit 和 NUnit ,但引入了一些新的功能,使其功能更強大,使用更方便。TestNG 消除了大部分的舊框架的限制,使開發人員可以編寫更加靈活和強大的測試。 由於它在很大程度上借鑑了Java註解( JDK5.0 引入的)來定義測試,它也能夠顯示如何使用這個新功能在真實的Java語言生產環境中。
特色以下:
由於 JUnit 測試框架是基於 Java 語言,固然 Android 開發也是基於 Java 語言,因此在 Android 中咱們能夠用 Junit4 單元測試框架進行迴歸測試,但同時,Google 也提供了一個 AndroidJUnit4 測試框架,看名字就知道它是基於 JUnit 4 框架適合在 Android 環境中作單元測試。
那麼,AndroidJUnit4 和 Junit4 有什麼區別呢?很大一個區別在於:
1,AndroidJUnit4 測試能夠在真機的環境下進行。好比你要測文件讀取SD卡,或者操做 SqlLite 數據庫,這些條件只有在真機上纔有的,此時你用 AndroidJUnit4 框架測試,能夠直接跑起來用真實的環境作相應的單元測試。
2,JUnit4 測試是運行在工程項目中,也就是在編譯階段。此時若是想要模擬 Android 環境,好比我想用 JUnit4 來測試 Activity 類,那麼就須要引用第三方庫來支持,引用 Mockito 和 Robolectric 框架來模擬 Android 環境進行相應的單元測試。
因此什麼時候用 AndroidJUnit4 和 JUnit4 不一樣的框架進行單元測試,就看你待測試的方法前置條件是什麼,而後作不一樣的選擇。
總的來講,單元測試不是集成測試,單元測試只是測試一個方法單元,不是測試一整個流程。集成測試是一種End To End的系統測試,測試相關模塊集成在一塊兒是否可以按照預期工做,通常都是接口或者功能層面的測試,可能會依賴不少系統因素,測試的代碼邏輯通常比較複雜,運行時間會比較長,出錯以後的修復成本高。單元測試則是開發者在集成測試以前就已經進行自測過,同時呢,進行單元測試以後,對於某個方法的執行路徑組合進行了一一驗證,它只關注三個目標:
源於對掌握的Android開發基礎點進行整理,羅列下已經總結的文章,從中能夠看到技術積累的過程。
1,Android系統簡介
2,ProGuard代碼混淆
3,講講Handler+Looper+MessageQueue關係
4,Android圖片加載庫理解
5,談談Android運行時權限理解
6,EventBus初理解
7,Android 常見工具類
8,對於Fragment的一些理解
9,Android 四大組件之 " Activity "
10,Android 四大組件之" Service "
11,Android 四大組件之「 BroadcastReceiver "
12,Android 四大組件之" ContentProvider "
13,講講 Android 事件攔截機制
14,Android 動畫的理解
15,Android 生命週期和啓動模式
16,Android IPC 機制
17,View 的事件體系
18,View 的工做原理
19,理解 Window 和 WindowManager
20,Activity 啓動過程分析
21,Service 啓動過程分析
22,Android 性能優化
23,Android 消息機制
24,Android Bitmap相關
25,Android 線程和線程池
26,Android 中的 Drawable 和動畫
27,RecylerView 中的裝飾者模式
28,Android 觸摸事件機制
29,Android 事件機制應用
30,Cordova 框架的一些理解
31,有關 Android 插件化思考
32,開發人員必備技能——單元測試