1. 程式人生 > >android基礎知識12:android自動化測試03—基於junit的android測試框架03

android基礎知識12:android自動化測試03—基於junit的android測試框架03

     本文主要介紹如何執行junit測試。

7、如何執行junit測試

      前面我們學習了很多JUnit的程式,在Android ADT外掛中已經為我們提供了很多這方面的功能,方便我們進行單元測試。但是如何進行單元測試,例如在ApiDemos\test提供的測試例子程式如何執行,對於我們這些初學者來說有些茫然,我也是在網上查找了不少這方面的的資料學習,才知道如何執行測試單元,因此在這裡總結說明與大家分享。總結起來,大概有4種不同的方法:

7.1 使用ADT 執行測試單元
在Eclipes中選擇工程,單擊右鍵,在Run as/Debug as子選單選項中選擇Android JUnit Test,如下:


單擊執行後,應用程式將啟動,在Eclipes中會出現個新的面板JUnit,如下:


        這個介面上就顯示了測試的結果,這種方法操作比較簡單,但是要想自己寫單元測試就的必須深入的去了解後面2中執行的方法。

7.2 通過AVD 執行測試單元

執行AVD,選擇Dev Tool,當前介面如下:


雙擊Instrumentation後,介面如下:


測試例子開始執行,在LogCat中檢視執行過程輸出的資訊,介面如下:


這些資訊就是測試例子輸出的資訊。
7.3 通過adb shell 命令執行測試單元
這種方法應該是為linux程式設計師設定的,完全的命令列,使用起來相對比較麻煩,命令格式如下:


按照上面的命令列格式,輸入:adb shell am instrument -w com.xmobileapp.hello/android.test.InstrumentationTestRunner

執行後的介面如下:

測試結果的資訊與第2種方法中的logCat中輸出的資訊是完全一樣的。

7.4 錯誤提示說明
在執行測試例子的過程中,也會遇到了不少的錯誤提示,總結如下:
單擊“Android JUnit Test”執行後,出現“Android Launch”錯誤提示,如下:


        這個錯誤的原因估計是:AndroidManifest.xml配置錯誤,關於這個問題的分析說明,請閱讀

An instrumention test runner is not specified篇幅中的說明。
使用adb shell am命令執行,出現“Error = Unable to find instrumentation info for……..”錯誤資訊,如下:

遇到這個問題Error = Unable to find instrumentation info for……..可試試
adb shell pm list instrumentation 檢視你的裝置有沒有安裝這個instrumentation測試包,使用adb shell am instrument -w 必須要在裝置上安裝測試包。

7.5 總結說明

看了這些,對instrument是不是有很大的困惑,下一篇幅我們將學習Android SDK 中的instrument。為了方便大家學習上面的執行測試單元的方法,一個簡單的例子供大家下載,這個例子中包含一個Activity(Hello)以及對這個Activity(HelloTest)的單元測試2部分,大家可以使用上面介紹的方法來啟動單元測試。

8 android junit學習總結

在學習Android、JUnit的過程中,隨著學習的深入,將Android、JUnit的類按照繼承關係整理如下:
Test—TestCase—AndroidTestCase
Test—TestCase—InstrumentationTestCase
Test—TestSuite—InstrumentationTestSuite
TestListener——BaseTestRunner—AndroidTestRunner
Instrumentation—

InstrumentationTestRunner
        上面的5條路線,也是我們不斷學習的過程,對於前4條路線感覺自己解析的都比較清楚,最後一條路線似乎說的不是很清楚,後來我又查看了不少這方面的資料,對Instrumentation再次說明下。
      每個Android 應用程式執行在自己的程序,Instrumentation殺死當前應用程式,並重新啟動應用程式(restarts the process with Instrumentation)。       Instrumentation提供給我們一個應用程式上下文的Handle,通過這個Handle我們可以洞察應用程式,從而驗證測試斷言,我們還可以通過它來寫一些比介面測試更加底層的測試用例。需要強調說明的是:Instrumentation不能捕獲UI方面的bugs。
Android在JUnit的基礎上擴展出來的、與Instrumentation有關的3個類:

JUnit的使用心得

       JUnit是採用測試驅動開發的方式,也就是說在開發前先寫好測試程式碼,主要用來說明被測試的程式碼會被如何使用,錯誤處理等;然後開始寫程式碼,並在測試程式碼中逐步測試這些程式碼,直到最後在測試程式碼中完全通過。
      看了是否感覺有些不符合程式設計師的思維習慣(先寫程式碼然後在除錯),的確這也是JUnit是對程式設計師思維習慣的“顛覆”。在這裡我自己也感覺,好像很難做到,為什麼?在一匹“馬”沒有完全設計好前,怎麼規定這匹“馬”將來會如何跑?而且即使把“馬”將來會如何“跑”定義好了,在實現的時候“馬”被改變了怎麼辦?說到底還是:一個人不能同時具有2個角色,否則自己有時候就不知道當前是哪個角色!
      說到這裡,我就說明下,我自己對JUnit “錯誤”的使用方法,這也許與JUnit測試驅動開發的目的相矛盾,但是的確可以有效地減少bug。JUnit從核心來說就是將原始碼與測試程式碼完全分開,將測試程式碼作為一個單獨的程式。前面介紹的方法,都將原始碼與測試程式碼合為一體,由於原始碼的重要性大於測試程式碼的重要性,所以測試程式碼經常有不完整、結構不清晰等問題,這樣程式設計師的單元測試也就不完整。JUnit就是被我用來做完整的單元測試,對當前的部分程式碼,測試其在每種“環境”下的執行結果。

後記說明

       這是網路上看到的一個系列文章,對junit做了比較想盡的介紹。看了這些文章,估計可以對android junit測試有一個比較初步的瞭解。我自己也只是看了這些文章,然後看了下例子以及部分原始碼。對一些細節還不是很瞭解,後續會深入閱讀一下相關原始碼,特別是ApplicationTestCase以及Runner的部分。