android上的單元測試

2023-01-25 08:15:01 字數 3539 閱讀 8942

【it168 技術文件】任何程式的開發都離不開單元測試來保證其健壯和穩定。android的程式自然也不例外。從android sdk 0.

9開始,就有了比較成熟的測試框架,但是直到目前最新的1.1版本,也沒有詳細的文件介紹這個內容,只是簡單的給了乙個api demos裡的幾個單元測試**。因此,我在這裡對此內容做一下梳理和總結:

junit還能用麼?

在 j**a下做單元測試必然用到junit。這裡說的junit是指從apache**會**的裡提供的一系列單元測試功能。這些功能顯然是執行在jdk之上的。

在android下已經沒有了jdk,自然也無法執行junit。但是這並不妨礙我們利用junit編寫單元測試。只不過在執行單元測試時,一定要用jdk來執行,利用j**a命令來啟動junit的某個runner。

如果是用eclipse的話,可以在run configuration裡新建乙個junit。但是一定要記得在classpath選項卡裡將bootstrap entries中的android library改成jre,並且新增

很明顯的,這種測試就是正規的j**a單元測試,和android沒有任何關係。你無法測試任何關於android系統中的api,你寫的activity,人機介面等等。所以,如果你想測試僅僅是一些封裝資料的物件,或者是純粹的數值計算,還是可以用這種方法的。

android裡面的包是怎麼回事?

很多人看到這個包的時候,第一反應是android是不是已經完整整合了junit。很遺憾這不是事實。如果你按照junit的執行方法,卻不像上面那樣改用jdk,就一定會得到乙個異常:

# an unexpected error has been detected by j**a runtime environment:

# internal error ( pid=4900, tid=4476

#error: shouldnotreachhere()

# j**a vm: j**a hotspot(tm) client vm (10.0-b19 mixed mode windows-x86)

# an error report file with more information is s**ed as:

# e:\mydoc\eclipseworkspace\testandroid\hs_err_

# if you would like to submit a bug report, please visit:

#  實際上,testcase這個類用於在android擔當所有獨特的testcase的基類的作用,它是乙個abstract class。android單元測試類繼承關係圖如下所示:

之所以有那麼多***testcase主要是為了簡化工作。例如當你想對乙個訪問資料庫的功能進行測試時,首先需要自己啟動並初始化資料庫。在這裡是類似的,如果你想測試乙個activity,首先要啟動它。

而activitytestcase就會自動幫你做完這些事情。而 activityunittestcase會更注重測試的獨立性,它會讓測試與android底層的聯絡降到最低。其餘的類可以檢視相關的j**adoc 來按需挑選。

要編寫測試,就是找到合適的***testcase作為基類來繼承,並且編寫自己的測試方法。

很明顯的,最簡單的編寫測試的方法就是繼承androidtestcase寫乙個自己的testcase。然後為自己的一組testcase寫乙個activity介面,由介面控制 testcase的啟動,執行和結果報告。但是,你很快會發現,為何要給測試寫乙個介面呢?

這太詭異了。這時就需要一種技術,它可以利用命令列(shell)來啟動一組測試,並且通過命令列的形式給出結果。這就是所謂的instrumentation。

什麼是instrumentation?

一般在開發android程式的時候,需要寫乙個manifest檔案,其結構是:……

這樣,在啟動程式的時候就會先啟動乙個application,然後在此application執行過程中根據情況載入相應的activity,而activity是需要乙個介面的。但是instrumentation並不是這樣的。你可以將instrumentation理解為一種沒有圖形介面的,具有啟動能力的,用於監控其他類(用target package宣告)的工具類。

任何想成為instrumentation的類必須繼承下面是這個類的解釋:

「base class for implementing application instrumentation code. when running with instrumentation turned on, this class will be instantiated for you before any of the application code, allowing you to monitor all of the interaction the system has with the application. an instrumentation implementation is described to the system through an 's tag.

「對於單元測試,我們需要認真了解的就是類。這是android單元測試的主入口。它相當於junit當中testrunner的作用。

那麼如何載入它呢,首先要在manifest檔案中加入一行關於instrumentation的宣告。比如android api demos中的測試裡的manifest是這麼寫的(我濾掉了所有的注釋):

如果用eclipse的adt外掛程式(0.8版本以上),也可以用圖形介面來新增,如下圖:

編輯好 manifest,就可以打包(build,可以用eclipse adt來做,也可以用aapt命令手工完成),然後安裝到虛擬機器上(用adb install命令)。之後就可以利用命令列的方式來載入你的單元測試了。在android shell中載入乙個instrumentation的方法是利用以下命令:

adb shell am instrument –w ******

其中-w是指定instrumentation類的引數標誌。乙個簡單的例子是:

adb shell am instrument -w

當然,也可以利用adb shell先進入android命令列模式,再直接寫am instrument –w ******x。下面將具體介紹如何將根據需要載入一組單元測試。

如何在android中利用instrumentation來進行測試?

在介紹具體的命令之前,我們先理解一下單元測試的層次。一組單元測試可以被組織成若干個testsuite。每個testsuite包含若干 testcase(某個繼承的的類)。

每個testcase又包含若干個 test(具體的test方法)。

如果假設是你的測試**的包的根。當執行以下命令時,會執行所有的testcase的所有test。測試的物件就是在target package中指定的包中的**:

adb shell am instrument -w

如果你想執行乙個testsuite,首先繼承的類,實現乙個 testsuite(比如叫然後執行以下命令執行此testsuite

adb shell am instrument -e class -w

其中的-e表示額外的引數,語法為-e [arg1] [value1] [arg2] [value2] …這裡用到了class引數。

一上單元測試題

一 二單元測試題班級姓名 一 比一比,記一記,口頭組詞。木馬日口 禾鳥月田 二 找出你認識的字,讀給同桌聽。鉛筆用心認識橡皮寫字學習 年級筆畫筆順田格本 三 寫一寫。1 寫出你知道的筆畫。2 在田字格中寫出 山 火 石 四 讀拼音,寫筆畫。h ng shpin 五 你知道哪個音節是正確的嗎?在正確音...

四上 五六單元 測試卷

吳江實驗小學愛德校區四年級語文第 五 六單元考試卷 班級 姓名學號成績 認真書寫 1分 捲麵整潔 1分 一 看拼音,寫詞語。16分 x u n j ch sh tzh s ji n k l ch n y u d f ku n ch n sh x n l i d zhp su ni d n sh y ...

單元測試反思

為了了解學生對小數乘法這部分知識的掌握情況,本週進行了單元測試,縱看測試成績,感觸頗多,通過反思我發現教學中仍存在著很多的問題 1.個別學生學習習慣不好,做題粗心大意,做後懶得檢查。還有學生做題習慣差,做題步驟不完整。2.儘管在後進生身上也付出了一定的時間和精力,但從測試成績來看,只是略有進步或進步...