【移動(dòng)應(yīng)用開發(fā)技術(shù)】android基礎(chǔ)知識(shí)12:android自動(dòng)化測(cè)試06-Instrumentation 02 單元測(cè)試_第1頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】android基礎(chǔ)知識(shí)12:android自動(dòng)化測(cè)試06-Instrumentation 02 單元測(cè)試_第2頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】android基礎(chǔ)知識(shí)12:android自動(dòng)化測(cè)試06-Instrumentation 02 單元測(cè)試_第3頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】android基礎(chǔ)知識(shí)12:android自動(dòng)化測(cè)試06-Instrumentation 02 單元測(cè)試_第4頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】android基礎(chǔ)知識(shí)12:android自動(dòng)化測(cè)試06-Instrumentation 02 單元測(cè)試_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余2頁(yè)可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】android基礎(chǔ)知識(shí)12:android自動(dòng)化測(cè)試06—Instrumentation02單元測(cè)試

轉(zhuǎn)載處(原文出處不可靠,否則請(qǐng)指正):/xianming01/article/details/7893402【IT168技術(shù)文檔】任何程序的開發(fā)都離不開單元測(cè)試來保證其健壯和穩(wěn)定。Android的程序自然也不例外。從AndroidSDK0.9開始,就有了比較成熟的測(cè)試框架,但是直到目前最新的1.1版本,也沒有詳細(xì)的文檔介紹這個(gè)內(nèi)容,只是簡(jiǎn)單的給了一個(gè)ApiDemos里的幾個(gè)單元測(cè)試代碼。因此,我在這里對(duì)此內(nèi)容做一下梳理和總結(jié):在Java下做單元測(cè)試必然用到JUnit。這里說的JUnit是指從Apache基金會(huì)下載的junit.jar里提供的一系列單元測(cè)試功能。這些功能顯然是運(yùn)行在JDK之上的。在Android下已經(jīng)沒有了JDK,自然也無(wú)法運(yùn)行JUnit。但是這并不妨礙我們利用JUnit編寫單元測(cè)試。只不過在運(yùn)行單元測(cè)試時(shí),一定要用JDK來運(yùn)行,利用java命令來啟動(dòng)JUnit的某個(gè)Runner。如果是用Eclipse的話,可以在RunConfiguration里新建一個(gè)JUnit。但是一定要記得在Classpath選項(xiàng)卡里將BootstrapEntries中的AndroidLibrary改成JRE,并且添加junit.jar。很明顯的,這種測(cè)試就是正規(guī)的Java單元測(cè)試,和Android沒有任何關(guān)系。你無(wú)法測(cè)試任何關(guān)于Android系統(tǒng)中的API,你寫的Activity,人機(jī)界面等等。所以,如果你想測(cè)試僅僅是一些封裝數(shù)據(jù)的對(duì)象,或者是純粹的數(shù)值計(jì)算,還是可以用這種方法的。Android里面的junit.framework包是怎么回事?很多人看到這個(gè)包的時(shí)候,第一反應(yīng)是Android是不是已經(jīng)完整集成了JUnit。很遺憾這不是事實(shí)。如果你按照J(rèn)Unit的運(yùn)行方法,卻不像上面那樣改用JDK,就一定會(huì)得到一個(gè)異常:##AnunexpectederrorhasbeendetectedbyJavaRuntimeEnvironment:##InternalError(classFileParser.cpp:2924),pid=4900,tid=4476#Error:ShouldNotReachHere()##JavaVM:JavaHotSpot(TM)ClientVM(10.0-b19mixedmodewindows-x86)#Anerrorreportfilewithmoreinformationissavedas:#E:\Mydoc\EclipseWorkspace\TestAndroid\hs_err_pid4900.log##Ifyouwouldliketosubmitabugreport,pleasevisit:#/webapps/bugreport/crash.jsp#實(shí)際上,TestCase這個(gè)類用于在Android擔(dān)當(dāng)所有獨(dú)特的TestCase的基類的作用,它是一個(gè)AbstractClass。Android單元測(cè)試類繼承關(guān)系圖如下所示:之所以有那么多XXXTestCase主要是為了簡(jiǎn)化工作。例如當(dāng)你想對(duì)一個(gè)訪問數(shù)據(jù)庫(kù)的功能進(jìn)行測(cè)試時(shí),首先需要自己?jiǎn)?dòng)并初始化數(shù)據(jù)庫(kù)。在這里是類似的,如果你想測(cè)試一個(gè)Activity,首先要啟動(dòng)它。而ActivityTestCase就會(huì)自動(dòng)幫你做完這些事情。而ActivityUnitTestCase會(huì)更注重測(cè)試的獨(dú)立性,它會(huì)讓測(cè)試與Android底層的聯(lián)系降到最低。其余的類可以查看相關(guān)的Javadoc來按需挑選。要編寫測(cè)試,就是找到合適的XXXTestCase作為基類來繼承,并且編寫自己的測(cè)試方法。很明顯的,最簡(jiǎn)單的編寫測(cè)試的方法就是繼承AndroidTestCase寫一個(gè)自己的TestCase。然后為自己的一組TestCase寫一個(gè)Activity界面,由界面控制TestCase的啟動(dòng),運(yùn)行和結(jié)果報(bào)告。但是,你很快會(huì)發(fā)現(xiàn),為何要給測(cè)試寫一個(gè)界面呢?這太詭異了。這時(shí)就需要一種技術(shù),它可以利用命令行(Shell)來啟動(dòng)一組測(cè)試,并且通過命令行的形式給出結(jié)果。這就是所謂的Instrumentation。什么是Instrumentation?一般在開發(fā)Android程序的時(shí)候,需要寫一個(gè)manifest文件,其結(jié)構(gòu)是:

這樣,在啟動(dòng)程序的時(shí)候就會(huì)先啟動(dòng)一個(gè)Application,然后在此Application運(yùn)行過程中根據(jù)情況加載相應(yīng)的Activity,而Activity是需要一個(gè)界面的。但是Instrumentation并不是這樣的。你可以將Instrumentation理解為一種沒有圖形界面的,具有啟動(dòng)能力的,用于監(jiān)控其他類(用TargetPackage聲明)的工具類。任何想成為Instrumentation的類必須繼承android.app.Instrumentation。下面是這個(gè)類的解釋:“Baseclassforimplementingapplicationinstrumentationcode.Whenrunningwithinstrumentationturnedon,thisclasswillbeinstantiatedforyoubeforeanyoftheapplicationcode,allowingyoutomonitoralloftheinteractionthesystemhaswiththeapplication.AnInstrumentationimplementationisdescribedtothesystemthroughanAndroidManifest.xml'stag.“對(duì)于單元測(cè)試,我們需要認(rèn)真了解的就是android.test.InstrumentationTestRunner類。這是Android單元測(cè)試的主入口。它相當(dāng)于JUnit當(dāng)中TestRunner的作用。那么如何加載它呢,首先要在manifest文件中加入一行關(guān)于Instrumentation的聲明。比如AndroidApiDemos中的測(cè)試?yán)锏膍anifest是這么寫的(我濾掉了所有的注釋):編輯好manifest,就可以打包(build,可以用EclipseADT來做,也可以用aapt命令手工完成),然后安裝到虛擬機(jī)上(用adbinstall命令)。之后就可以利用命令行的方式來加載你的單元測(cè)試了。在AndroidShell中加載一個(gè)Instrumentation的方法是利用以下命令:adbshellaminstrument–wXXXXXX其中-w是指定Instrumentation類的參數(shù)標(biāo)志。一個(gè)簡(jiǎn)單的例子是:adbshellaminstrument-wcom.android.foo/android.test.InstrumentationTestRunner當(dāng)然,也可以利用adbshell先進(jìn)入android命令行模式,再直接寫aminstrument–wXXXXXXX。下面將具體介紹如何將根據(jù)需要加載一組單元測(cè)試。如何在Android中利用Instrumentation來進(jìn)行測(cè)試?在介紹具體的命令之前,我們先理解一下單元測(cè)試的層次。一組單元測(cè)試可以被組織成若干個(gè)TestSuite。每個(gè)TestSuite包含若干TestCase(某個(gè)繼承android.jar的junit.framework.TestCase的類)。每個(gè)TestCase又包含若干個(gè)Test(具體的test方法)。如果假設(shè)com.android.foo是你的測(cè)試代碼的包的根。當(dāng)執(zhí)行以下命令時(shí),會(huì)執(zhí)行所有的TestCase的所有Test。測(cè)試的對(duì)象就是在TargetPackage中指定的包中的代碼:adbshellaminstrument-wcom.android.foo/android.test.InstrumentationTestRunner如果你想運(yùn)行一個(gè)TestSuite,首先繼承android.jar的junit.framework.TestSuite類,實(shí)現(xiàn)一個(gè)TestSuite(比如叫com.android.foo.MyTestSuite),然后執(zhí)行以下命令執(zhí)行此TestSuiteadbshellaminstrument-eclasscom.android.foo.MyTestSuite-wcom.android.foo/android.test.InstrumentationTestRunner其中的-e表示額外的參數(shù),語(yǔ)法為-e[arg1][value1][arg2][value2]…這里用到了class參數(shù)。如果僅僅想運(yùn)行一個(gè)TestCase(比如叫com.android.foo.MyTestCase),則用以下命令:adbshellaminstrument-eclasscom.android.foo.MyTestCase-wcom.android.foo/android.test.InstrumentationTestRunner如果僅僅想運(yùn)行一個(gè)Test(比如就是上面MyTestCase的testFoo方法),很類似的,就這樣寫:adbshellaminstrument-eclasscom.android.foo.MyTestCase#testFoo-wcom.android.foo/android.test.InstrumentationTestRunner然后,所有的測(cè)試結(jié)果會(huì)輸出到控制臺(tái),并會(huì)做一系列統(tǒng)計(jì),如標(biāo)記為E的是Error,標(biāo)記為F的是Failure,Success的測(cè)試則會(huì)標(biāo)記為一個(gè)點(diǎn)。這和JUnit的語(yǔ)義一致。如果希望斷點(diǎn)調(diào)試你的測(cè)試,只需要直接在代碼上加上斷點(diǎn),然后將運(yùn)行命令參數(shù)的-e后邊附加上debugtrue后運(yùn)行即可。更加詳細(xì)的內(nèi)容可以看InstrumentationTestRunner的Javadoc。我希望Android能盡快有正式的文檔來介紹這個(gè)內(nèi)容。如何在Android的單元測(cè)試中做標(biāo)記?在android.test.annotation包里定義了幾個(gè)annotation,包括@LargeTest,@MediumTest,@SmallTest,@Smoke,和@Suppress。你可以根據(jù)自己的需要用這些annotation來對(duì)自己的測(cè)試分類。在執(zhí)行單元測(cè)試命令時(shí),可以在-e參數(shù)后設(shè)置“sizelarge”/“sizemedium”/“sizesmall”來執(zhí)行具有相應(yīng)標(biāo)記的測(cè)試。特別的@Supperss可以取消被標(biāo)記的Test的執(zhí)行。完整的操作過程總結(jié)以上所有的內(nèi)容,編寫并運(yùn)行完整的測(cè)試需要以下的步驟:以上步驟中,在Android自帶的例子中,我發(fā)現(xiàn)它有兩個(gè)manifest.xml。也就是說在步驟3中源代碼和測(cè)試代碼分別生成了兩個(gè)不同的包。然后步驟4利用adbinstall命令安裝到了虛擬機(jī)上。由于我沒有找到EclipseADT有辦法可以為一個(gè)只有Instrumentation,沒有Activity的Application打包并安裝,于是采用了略微不同的辦法完成了這個(gè)工作。下文中將一一詳細(xì)介紹整個(gè)過程。1、編寫程序我新建了一個(gè)項(xiàng)目TestApp,參數(shù)為:PackageName:com.android.testappActivityName:MainActivityApplicationName:TestApp其中,我故意將減法的a–b寫成了b–a。2、編寫測(cè)試程序然后,我新建了一個(gè)SourceFolder,名為test,并在里面新建了包c(diǎn)om.android.testapp.test。并定義了一個(gè)TestCase,名為TestMainActivity,源代碼如下:我繼承了ActivityInstrumentationTestCase。這個(gè)TestCase在執(zhí)行時(shí)會(huì)自動(dòng)幫我啟動(dòng)相應(yīng)的Activity。接下來就是程序的Manifest:在這個(gè)文件中,我將Activity和Instrumentation的聲明寫到了一起,而沒有像ApisDemo那樣分開。請(qǐng)注意里面的標(biāo)簽。如果沒有那句,在運(yùn)行測(cè)試時(shí)會(huì)報(bào)告找不到

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論