單元測試是參與項目開發(fā)的工程師在項目代碼之外建立的白盒測試工程,用于執(zhí)行項目中的目標函數(shù)并驗證其狀態(tài)或者結果,其中,單元指的是測試的最小模塊,通常指函數(shù)。如圖1所示的綠色文件夾即是單元測試工程。這些代碼能夠檢測目標代碼的正確性,打包時單元測試的代碼不會被編譯進入APK中。
創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網(wǎng)站設計制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的漢川網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
處于高速迭代開發(fā)中的Android項目往往需要除黑盒測試外更加可靠的質量保障,這正是單元測試的用武之地。單元測試周期性對項目進行函數(shù)級別的測試,在良好的覆蓋率下,能夠持續(xù)維護代碼邏輯,從而支持項目從容應對快速的版本更新。
單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。對于單元測試中單元的含義,一般來說,要根據(jù)實際情況去判定其具體含義,如C語言中單元指一個函數(shù),Java里單元指一個類,圖形化的軟件中可以指一個窗口或一個菜單等。總的來說,單元就是人為規(guī)定的最小的被測功能模塊。單元測試是在軟件開發(fā)過程中要進行的最低級別的測試活動,軟件的獨立單元將在與程序的其他部分相隔離的情況下進行測試。
在一種傳統(tǒng)的結構化編程語言中,比如C,要進行測試的單元一般是函數(shù)或子過程。在像C++這樣的面向對象的語言中, 要進行測試[1] 的基本單元是類。對Ada語言來說,開發(fā)人員可以選擇是在獨立的過程和函數(shù),還是在Ada包的級別上進行單元測試。單元測試的原則同樣被擴展到第四代語言(4GL)的開發(fā)中,在這里基本單元被典型地劃分為一個菜單或顯示界面。
經常與單元測試聯(lián)系起來的另外一些開發(fā)活動包括代碼走讀(Code review),靜態(tài)分析(Static analysis)和動態(tài)分析(Dynamic analysis)。靜態(tài)分析就是對軟件的源代碼進行研讀,查找錯誤或收集一些度量數(shù)據(jù),并不需要對代碼進行編譯和執(zhí)行。動態(tài)分析就是通過觀察軟件運行時的動作,來提供執(zhí)行跟蹤,時間分析,以及測試覆蓋度方面的信息。
? ? ? ? 在實際的開發(fā)中幾乎訪問網(wǎng)絡已經成為一個app的標配,那么每次寫完一個網(wǎng)絡請求都要重新打包在模擬器或者真機上運行一次,當然這種方式是可以的,但是打包一個apk花費相對較多的時間。我們可以使用android官方提供給我們的test框架,通過測試框架編寫相應的測試用例,每次只測試相對較小的方法,打包到真機或者模擬器上的時間相對較小提升編碼效率,大大降低bug出現(xiàn)的幾率。
? ? ? ? ? ?使用android studio2.2.3導入使用android studio1.5編寫的項目時使用Android Test出現(xiàn)了問題,運行報錯:“Test running failed: Unable to find instrumentation info for: ComponentInfo”這句話的意思是沒有找到instrumentation這個類,"Run"-"Edit Configurations"-"Android Tests"-選擇你的單元測試-"Specific instrumentation runner" -選擇"InstrumentationTestRunner"即可解決問題。
? ? ? ? ? ?出現(xiàn)這個問題的原因nstrumentation runner默認是MutidexTestRunner,入MultiDex后單元測試工具默認變成了MultiDexTestRunner,需要在build.gradle指定分包之前用的InstrumentationTestRunner工具,按照上面修改就可以解決這個問題。
請注意測試本身不是靠工具的而是靠設計,這是我的理念,所以我一向覺得,很多人認為做測試做的好就是靠掌握一門好的工具,這個觀點是不正確的,所以我可以負責任的告訴你,做Android手機需要掌握的不是工具、而是理念、思維、以及框架,總的來說是本質,而工具只是輔助,那么現(xiàn)在我來介紹一些我了解的工具(僅僅是了解,很多沒用過)
開源 Android 軟件測試工具包括:Android Test Kit, AndroidJUnit4, Appium, calabash-android, Monkey, MonkeyTalk, NativeDriver, Robolectric, RoboSpock, Robotium, UIAutomator, Selendroid。
Android Test Kit
Android Test Kit 是一組 Google 開源測試工具,用于 Android 平臺,包含 Espresso API 可用于編寫簡潔可靠的 Android UI 測試。
AndroidJUnit4
AndroidJUnit4 是一個讓 JUnit 4 可以直接運行在 Android 設備上的開源命令行工具。
Appium
Appium 是一個開源、跨平臺的自動化測試工具,用于測試原生和輕量移動應用,支持 iOS, Android 和 FirefoxOS 平臺。Appium 驅動蘋果的 UIAutomation 庫和 Android 的 UiAutomator 框架,使用 Selenium 的 WebDriver JSON 協(xié)議。Appinm 的 iOS 支持是基于 Dan Cuellar's 的 iOS Auto. Appium 同時綁定了 Selendroid 用于老的 Android 平臺測試。
Calabash-android
calabash-android 是一個基于 Cucumber 的 Android 的功能自動化測試框架。Calabash 允許你寫和執(zhí)行,是開源的自動化移動應用測試工具,支持 Android 和 iOS 原生應用。Calabash 的庫允許原生和混合應用的交互測試,交互包括大量的終端用戶活動。Calabash 可以媲美 Selenium WebDriver。但是, 需要注意的是 web 應用和桌面環(huán)境的交互跟觸摸屏應用的交互是不同的。Calabash 專為觸摸屏設備的原生應用提供 APIs。
Monkey
Monkey 是 Google 開發(fā)的 UI/應用測試工具,也是命令行工具,主要針對壓力測試。你可以在任意的模擬器示例或者設備上運行。Monkey 發(fā)送一個用戶事件的 pseudo-random 流給系統(tǒng),作為你開發(fā)應用的壓力測試。
MonkeyTalk
MonkeyTalk 是世界上最強大的移動應用測試工具。MonkeyTalk 自動為 iOS 和 Android 應用進行真實的,功能性交互測試。MonkeyTalk 提供簡單的 "smoke tests",復雜數(shù)據(jù)驅動的測試套件。MonkeyTalk 支持原生,移動和混合應用,真實設備或者模擬器。MonkeyTalk 使得場景捕獲非常容易,可以記錄高級別,可讀的測試腳本。同樣的命令可以用在 iOS 和 Android 應用上。你可以記錄一個平臺的一個測試,并且可以在另外一個平臺回放。MonkeyTalk 支持移動觸摸和基于手勢交互為主的移動體驗。點擊,拖拽,移動,甚至是手指繪制也可以被記錄和回放。
NativeDriver
NativeDriver 是 WebDriver API 的實現(xiàn),是原生應用 UI 驅動,而不是 web 應用。
Robolectric
Robolectric 是一款Android單元測試框架,使用 Android SDK jar,所以你可以使用測試驅動開發(fā) Android 應用。測試只需幾秒就可以在工作站的 JVM 運行。Robolectric 處理視圖縮放,資源加載和大量 Android 設備原生的 C 代碼實現(xiàn)。Robolectric 允許你做大部分真實設備上可以做的事情,可以在工作站中運行,也可以在常規(guī)的 JVM 持續(xù)集成環(huán)境運行,不需要通過模擬器。
RoboSpock
RoboSpock 是一個開源的 Android 測試框架。提供簡單的編寫 BDD 行為驅動開發(fā)規(guī)范的方法,使用Groovy 語音,支持 Google Guice 庫。RoboSpock 合并了 Robolectric 和 Spock 的功能。
Robotium
Robotium 是一款國外的Android自動化測試框架,主要針對Android平臺的應用進行黑盒自動化測試,它提供了模擬各種手勢操作(點擊、長 按、滑動等)、查找和斷言機制的API,能夠對各種控件進行操作。Robotium結合Android官方提供的測試框架達到對應用程序進行自動化的測 試。另外,Robotium 4.0版本已經支持對WebView的操作。Robotium 對Activity,Dialog,Toast,Menu 都是支持的。
UIAutomator
uiautomator 測試框架提高用戶界面(UI)的測試效率,通過自動創(chuàng)建功能 UI 測試示例,可以在一個或者多個設備上運行你的應用。
Selendroid
Selendroid 是一個 Android 原生應用的 UI 自動化測試框架。測試使用 Selenium 2 客戶端 API 編寫。Selendroid 可以在模擬器和實際設備上使用,也可以集成網(wǎng)格節(jié)點作為縮放和并行測試。
其實單元測試不僅能保證項目進度還能優(yōu)化你的設計。有些開發(fā)者會說,寫單元測試代碼太費勁了,比寫業(yè)務代碼還麻煩。可是如果強迫開發(fā)者必須寫單元測試代碼的時候。聰明且又想‘偷懶’的開發(fā)人員為了將來可以更方便地編寫測試代碼。唯一的辦法就是通過優(yōu)化設計,盡可能得將業(yè)務代碼設計成更容易測試的代碼。慢慢地開發(fā)者就會發(fā)現(xiàn)。自己設計的程序耦合度也越來越低。每個單元程序的輸入輸出,業(yè)務內容和異常情況都會盡可能變得簡單。最后發(fā)現(xiàn)自己的編程習慣和設計能力也越來越老練了。
其實容易測試的代碼基本上可以和設計良好的代碼劃等號。因為一個單元測試用例其實就是一個單元的最早用戶。容易使用顯然意味著良好的設計。
有著良好設計的項目一直是很注重代碼重用的。代碼重用的好處在這里就不多說了。但是要做到代碼重用首先要保證被重用的單元程序必須是個非常優(yōu)秀的程序,除了良好的設計,還要有詳細的文檔。另外最重要的其實是單元測試代碼。不知道大家有沒有這樣的經歷?當大家不清楚一個API 函數(shù)如何使用而去尋找文檔的幫助時,往往會跳過大段的英文說明而去直接看文檔中提供的樣例程序,然后在自己的程序中依葫蘆畫瓢調用這個函數(shù)。那么,您有沒有意識到,被重用的代碼如果有了單元測試代碼。你的測試代碼就可以成為這個函數(shù)最好的API 了。
單元測試代碼還可以通過簡單的事務回滾功能在生產環(huán)境上做基于真實數(shù)據(jù)的測試而不用擔心會產生不必要的數(shù)據(jù)。利用這樣的測試代碼我們可以在發(fā)布程序后check 剛才的發(fā)布是否成功。以往發(fā)布的時候我們經常會碰到一種比較尷尬的情況,當我們將程序發(fā)布到正式環(huán)境上后,我們每個人心里一直還是有點后顧之憂。因為我們不能在正式環(huán)境上運行我們的程序,只能被動地等待客戶操作過后才知道發(fā)布的程序是否正常。這種情況讓我們非常被動,如果運氣好可能不出什么問題,可是一旦客戶在正式環(huán)境上發(fā)現(xiàn)報了個系統(tǒng)異常之類的錯誤或者出現(xiàn)錯誤數(shù)據(jù),那就后果很嚴重了,這將影響到產品的聲譽,顯然這樣也是很沒面子事。如果我們運行過單元測試代碼,萬一有問題我們就可以主動的發(fā)現(xiàn)并且修改后重新發(fā)布。