android、junit深入淺出mo-Android感受帶給我們新體驗(yàn)_第1頁(yè)
android、junit深入淺出mo-Android感受帶給我們新體驗(yàn)_第2頁(yè)
android、junit深入淺出mo-Android感受帶給我們新體驗(yàn)_第3頁(yè)
android、junit深入淺出mo-Android感受帶給我們新體驗(yàn)_第4頁(yè)
android、junit深入淺出mo-Android感受帶給我們新體驗(yàn)_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余41頁(yè)可下載查看

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

AninstrumentiontestrunnerisnotAndroid、 深入淺出(一)—— 初步解用一些C++的開(kāi)源庫(kù)中學(xué)習(xí)過(guò)與CPPUnit,簡(jiǎn)要分析過(guò)其主要框架,如下:APIDemoes\test文件夾下的測(cè)試代碼相對(duì)比較復(fù)雜,我們會(huì)循序漸進(jìn)的學(xué)習(xí),逐步深入的理解,在后面為大家詳細(xì)解析如何閱讀這些測(cè)試代碼,本篇幅就初步解析什么是JUnitJUnit是采用測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的方式,也就是說(shuō)在開(kāi)發(fā)前先寫(xiě)好測(cè)試代碼,主要用來(lái)現(xiàn)簡(jiǎn)要JUnit的4大功能管理測(cè)試用例。修改了哪些代碼,這些代碼的修改會(huì)對(duì)哪些部分有影響,通過(guò)JUnit將這次的修改做個(gè)完整測(cè)試。這也就JUnit中所謂的TestSuite。TestCase,并將TestCase添加到相應(yīng)的TestSuite方便管理。預(yù)期的等都需要有個(gè)明確的定義,JUnit在這方面提供了強(qiáng)大的功能。以上部分與我們平常使用IDE調(diào)試的過(guò)程是完全一樣的,只不過(guò)是增加了測(cè)試用例管理、檢測(cè)等功能,提高了單元的效率,保證了單元測(cè)試的完整性,明確了通過(guò)一個(gè)簡(jiǎn)要的例子,詳細(xì)說(shuō)明4大功能是如何實(shí)現(xiàn)的。相關(guān)文AninstrumentiontestrunnerisnotAndroid、 深入淺出(二)—— 例子分檢測(cè)結(jié)合主要功能,舉個(gè)簡(jiǎn)單的例子分析如下源代碼:publicclass{publicintadd(intaugend,int{returnaugend+addendpublicintsubtration(intminuend,int{returnminuend–subtrahend}測(cè)試用例importpublicclassTestSampleextends{privateinta;privateintb;privateintr1,r2;voidsetUp()/*開(kāi)始測(cè)試當(dāng)前用例–初始化測(cè)試環(huán)境{a=b=r1=r2=}voidtearDown()/*當(dāng)期用例測(cè)試結(jié)束publicvoidtestAdd()/*SampleCalculatorAdd{SampleCalculatorcalculator=newSampleCalculator();intresult=calculator.add(a,b);assertEquals(r1,result);/*檢測(cè)}publicvoidtestSubtration()/*SampleCalculatorSubtration{SampleCalculatorcalculatornewSampleCalculator();intresult=calculator.subtration(a,b);assertEquals(r2,result);/*檢測(cè)*/}}TestCase的管importjunit.framework.Test;publicclassTestAll{publicstaticTest{TestSuitesuite=newTestSuite(”TestSuitereturnsuite;}}只要選擇了TestSuiteTest,TestSample就將加入當(dāng)前測(cè)試中。如果將來(lái)面,運(yùn)行以上測(cè)試的例子,JUnit的界面如下:相關(guān)文AninstrumentiontestrunnerisnotAndroid、 深入淺出(三)—— 深入解析(上AndroidJUnit在這些包中最為重要的是:junit.framework、android.test,其中前者是JUnit的包,后者是AndSDK在Junit.framework的基礎(chǔ)上擴(kuò)展出來(lái)的包,重點(diǎn)解析這2個(gè)包。首先解junit.framework包,結(jié)構(gòu)如下:ArrayIndexOutOfBoundsException異常而導(dǎo)致的無(wú)法預(yù)料的問(wèn)在面向?qū)ο蟮恼Z(yǔ)言C++、JAVA中較常見(jiàn),在這里就不多說(shuō)了。舉個(gè)簡(jiǎn)單的例子,并簡(jiǎn)要說(shuō)明過(guò)第一步:實(shí)現(xiàn)在tearDown中清理這些變量;protecteddoublefValue1;protecteddoublefValue2;protectedvoidsetUp(){}}assertTrue(result==5.0);}{案例的名字對(duì)應(yīng)的測(cè)試方法來(lái)運(yùn)行,如下:TestCase=newMathTest(”testAdd”);第二步:將TestCase添加到TestSuiltTestSuitesuite=newTestSuite();TestSuitesuite=new總結(jié)說(shuō)們將深入解析android.test包。相關(guān)文AninstrumentiontestrunnerisnotAndroid、 深入淺出(三)—— 深入解析(下首先整android.test包的結(jié)構(gòu),如下圖所示:看到ApplicationTestCase,ProviderTestCase2,ServiceTestCase,Service、BroadCast3AndroidSDK類(lèi)<Textends<Textends<Textends<Textends這些類(lèi)就不在這里說(shuō)明,應(yīng)該與我們平時(shí)使用Activity、Service、Provider基本一樣。下面舉個(gè)例子,來(lái)說(shuō)明如何使用這些類(lèi),我們就將上一篇J2SE測(cè)試?yán)?,在Android中實(shí)現(xiàn):importandroid.util.Log;publicclassMathTestextends{protecteddoublefValue1;protecteddoublefValue2;protecteddoublefRe;staticfinalStringLOG_TAG=protectedvoidsetUp(){fValue1=2.0;fValue2=fRe=}publicvoid{Log.d(LOG_TAG,“testAdd”assertTrue(LOG_TAG+”1″,((fValue1+fValue2)==fRe)}}importpublicclassExampleSuiteextends{public{addTestSuite(MathTest.class}}樣的,在AndroidAVD上運(yùn)行程序后看到的結(jié)果如下:個(gè)測(cè)試界面是我們自己編寫(xiě)的單元測(cè)試的界面,下一篇幅重點(diǎn)介紹這部分總結(jié)說(shuō)明android.test包深入的學(xué)習(xí),只有到AndroidSDK相關(guān)文AninstrumentiontestrunnerisnotAndroid、 深入淺出(四)——隨著學(xué)習(xí)的深入,發(fā)現(xiàn)包面的篇幅中,我們忽略了android.test包中一個(gè)重要的類(lèi)AndroidTestRunner,這個(gè)類(lèi)是android.test包的類(lèi),下面為大家詳細(xì)說(shuō)junit.framework包中的TestListener接口junit.runner包,結(jié)構(gòu)如下:AndroidTestRunner類(lèi)結(jié)構(gòu),如下圖所示:看到setContext(Contextcontext)這個(gè)函數(shù)的這個(gè)參數(shù)Contextcontext,總算讓我看到j(luò)unit與Android的結(jié)合點(diǎn)了,在看下其他幾個(gè)函數(shù),我們會(huì)發(fā)現(xiàn),這個(gè)類(lèi)是AndroidTestRunnertestRunner=newAndroidTestRunner();testRunner.setTest(newExampleSuite());testRunner.addTestListener(this);testRunner.setContext(parentActivity);相關(guān)文AninstrumentiontestrunnerisnotAndroid、 深入淺出(五)—— 例子分的工,邊看這篇文章邊閱讀例子程序的代碼。首先分析整個(gè)工程的結(jié)構(gòu)圖,如下AndroidTestCase,Testsuite面的篇幅中已經(jīng)學(xué)習(xí)過(guò)了,ContestTest、類(lèi)代碼簡(jiǎn)要列舉,如下publicclassJUnitextendsActivity{staticfinalStringLOG_TAG=“junit”;ThreadtestRunnerThread=null;/**Calledwhentheactivityisfirstcreated.*/publicvoidonCreate(Bundle{launcherButton.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewview)}}privatesynchronizedvoid{if((testRunnerThread!=null)&&!testRunnerThread.isAlive())testRunnerThread=null;if(testRunnerThread==null{testRunnerThread=newThread(newTestRunner(this));}{Toast.makeText(this,“Testisstill}classTestRunnerimplements{staticfinalStringLOG_TAG=inttestCounter;interrorCounter;ActivitypublicTestRunner(ActivityparentActivity{this.parentActivity=publicvoid{testCounter=errorCounter=failureCounter=Log.d(LOG_TAG,“Teststarted”/*整個(gè)代碼的AndroidTestRunnertestRunner=newAndroidTestRunner();testRunner.setTest(newExampleSuite());testRunner.addTestListener(this);testRunner.setContext(parentActivity);Log.d(LOG_TAG,“Testended”}//publicvoidaddError(Testtest,Throwable{Log.d(LOG_TAG,“addError:“+test.getClass().getName());Log.d(LOG_TAG,t.getMessage(),t);}publicvoidaddFailure(Testtest,AssertionFailedError{Log.d(LOG_TAG,“addFailure:“+test.getClass().getName());Log.d(LOG_TAG,t.getMessage(),t);}publicvoidendTest(Test{Log.d(LOG_TAG,“endTest:“+test.getClass().getName()}publicvoidstartTest(Test{Log.d(LOG_TAG,“startTest:“+test.getClass().getName()}}整個(gè)程序的代碼,如下publicvoid{/*整個(gè)代碼的AndroidTestRunnertestRunner=newAndroidTestRunner();testRunner.setTest(newExampleSuite());testRunner.addTestListener(this);testRunner.setContext(parentActivity);}(在大腦中留下深刻的,后面會(huì)經(jīng)常使用):紅色劃線(xiàn)部分代表例子程序代碼中使用的AndroidTestRunner類(lèi)的函數(shù)。這里使用testRunner.runTest();會(huì)占用大量的時(shí)間,如果直接在如何將TestRunner中的測(cè)試信息顯示在界面上Snake:AndroidSDKHandler,通過(guò)UIUI線(xiàn)程的事件隊(duì)列。<application<uses-library<activityandroid:name=”.JUnit”<intent-<actionandroid:name=”ent.action.MAIN”<categoryandroid:name=”ent.category.LAUNCHER”</intent-總結(jié)說(shuō)相關(guān)文AninstrumentiontestrunnerisnotAndroid、 深入淺出(六)——如何運(yùn)行單元測(cè)試也是在網(wǎng)上查找了不少這方面的的資料學(xué)習(xí),才知道如何運(yùn)試單元,因此在這里總結(jié)說(shuō)明與大家??偨Y(jié)起來(lái),大概有4種不同的方法:使用ADT運(yùn)試單JUnitTest,如下:試就的必須深入的去了解后面2中運(yùn)行的方法。通過(guò)AVD運(yùn)試單運(yùn)行AVD,選擇Dev ,當(dāng)前界面如下通過(guò)adbs命令運(yùn)試單 aminstrument-wcom.xmobileappo/android.test.InstrumentationTestRunner錯(cuò)誤提示說(shuō)單擊“AndroidJUnitTest”運(yùn)行后,出現(xiàn)“AndroidLaunch”錯(cuò)誤提示,如下Aninstrumentiontestrunnerisnotspecified使用adbsam命令運(yùn)行,出現(xiàn)“Error=Unabletofindinstrumentationinfofor”錯(cuò)誤信息,如下:總結(jié)說(shuō)instrument。為了方便大家學(xué)習(xí)上面的運(yùn)試單元的方法,一個(gè)簡(jiǎn)單的例子供大家,這個(gè)例子中包含一個(gè)Activity(o)以及對(duì)這個(gè)Activity相關(guān)文Aninstrumentiontestrunnerisnot 解已經(jīng)在AndroidSDK中學(xué)習(xí)了很多關(guān)于JUnit的內(nèi)容,但是感覺(jué)一直有幾個(gè)問(wèn)題沒(méi)有解決(不知道大家是否有同樣的感受)JUnit22個(gè)問(wèn)題如下:控制這些基本元素運(yùn)行的,這需要Android系統(tǒng)提供一些底層操作的接口才可以做到。對(duì)于第二個(gè)問(wèn)題,我在Cview中似乎找到了答案,Cview中提供一些界面操作的函數(shù),例如:performClick(),看AndroidSDK還是提供了一些這方面的函數(shù)來(lái)模擬。對(duì)于第一個(gè)問(wèn)題,本篇對(duì)這個(gè)問(wèn)題幅詳細(xì)說(shuō)明下。首先我們先想下,如果要實(shí)現(xiàn)對(duì)Activity的測(cè)試需要些什么?首先需要?jiǎng)?chuàng)建才返回,這就需要一些同步方面的操作。將前面的概括起來(lái)就是2個(gè)方面:控制下面就對(duì)instrumentation詳細(xì)說(shuō)明。什么是Instrumentationapplicationinstrumentationandroid.app包中Instrumentation類(lèi)結(jié)構(gòu),如下圖所示其包含有2個(gè)內(nèi)部類(lèi):ActivityMoniter、ActivityMoniter:有關(guān)特定的Intent的監(jiān)視。一個(gè)ActivityMoniter類(lèi)的實(shí)例通過(guò)函數(shù)Activity,ActivityMoniterhitcount計(jì)數(shù)更新等其他操作。一個(gè)ActivityMonitor也可以用來(lái)尋找一個(gè)Activity,通過(guò)waitForActivity()方法,這個(gè)函數(shù)將返直到匹配的活動(dòng)被創(chuàng)建。然后我們看下Instrumentation類(lèi)的函數(shù),列舉其主要函數(shù)如下Application、ActivityInstrumentation題,在Instrumentation類(lèi)中都實(shí)現(xiàn)了,尤其是些同步操作方面的。Instrumentation簡(jiǎn)單使用的例子publicclassoTestextends{omActivityTested;publicoTest(){}protectedvoidsetUp()throws{Intentintent=new mActivityTested=(o)}protectedvoidtearDown()throws{}}InstrumentationTestCasegetInstrumentation()函數(shù)獲取Instrumentation對(duì)象,通過(guò)InstrumentationstartActivitySync()函數(shù)啟動(dòng)一個(gè)Activity,直到Avtivity啟動(dòng)后返回。 中的<instrumentation>說(shuō)過(guò)這個(gè)工具我們可以很方面的在AndroidManifest.xml添加元素總結(jié)說(shuō)去深入的學(xué)習(xí)這個(gè)類(lèi),才能更好的測(cè)試Activity對(duì)象。相關(guān)文 解句話(huà)來(lái)說(shuō)明就是:這是AndroidJUnit框架的基礎(chǔ)上錦上添花。在TestSuite這個(gè)容器,下面開(kāi)始介紹這個(gè)中間層。packagesandallsub-package(給定的包和所有子包),這些都讓我們感覺(jué)到adbsaminstrument-w我們?cè)诹信e一些這樣令,如下:adbsaminstrument-w-eclasscom.android.foo.FooTestadbsaminstrument-w-eclasscom.android.foo.FooTest#testFooadbsaminstrument-w-e 看了這些命令,再結(jié)合TestSuiteBuilder的函數(shù),大家就明白了一個(gè)重要的問(wèn)題:在AndroidManifest.XML文件Instrumentation的屬性(如下圖所示)中為什么沒(méi)有任何與TestSuite相關(guān)的說(shuō)明?TestSuiteBuilder就是在我們提供當(dāng)前測(cè)試的測(cè)試范圍的配置,例如:是否將某TestCaseTestSuiteBuilderbuilderTestSuite??吹竭@里我們的的疑惑就少了很多,下面我們繼續(xù)介紹InstrumentationTestRunner類(lèi)。InstrumentationTestRunner類(lèi)結(jié)構(gòu),如下圖所示主要函數(shù)接口列舉如下:InstrumentationTestRunner典型的使用過(guò)程:l在AndroidManifest.xmlinstrumentation并targetPackage屬性中說(shuō)明被測(cè)試的 aminstrument-w”,并添加額外令“-efunc來(lái)運(yùn)行所有的功能測(cè)試。這謝測(cè)試?yán)^承至測(cè) aminstrument-w”,并添加額外令“-eunit運(yùn)行instrumentation使用“adbs aminstrument-w”,并添加額外令“-eclass”來(lái)運(yùn)行某個(gè)單獨(dú)的TestCase。publicclassApiDemosRunnerextends{publicTestSuite{Log.i(”ApiDemosRunner”,returnnew}publicClassLoader{return}}萬(wàn)變不離其中,整個(gè)測(cè)試的還是TestSuite,只不過(guò)AndroidSDK在此基礎(chǔ)上增加了TestSuiteBuilder,是我們對(duì)TestCase的管理更加方便??偨Y(jié)說(shuō)相關(guān)文Aninstrumentiontestrunnerisnot單擊“AndroidJUnitTest”運(yùn)行后,出現(xiàn)“Aninstrumentiontestrunnerisnotspecified”錯(cuò)誤提示,如下:ERROR:Applicationdoesnotspecifyaandroid.test.InstrumentationTestRunnerinstrumentationordoesnotdeclareuses-libraryandroid.test.runner。Test在Instrumentationrunner后的列表框選項(xiàng)中,我們看到選擇框中沒(méi)有任何選項(xiàng),就說(shuō)明AndroidManifest.xml配置有問(wèn)題。不是這個(gè)原因?qū)е碌腻e(cuò)誤,JUnitFAQ中是這么說(shuō)明的:WhydoIgetthewarning“AssertionFailedError:NotestsfoundinXXX”whenIrunmytest?Makesureyouhavemoreormoremethodannotated(with@Test.Forexample:publicvoidtestSomething()這個(gè)錯(cuò)誤在提示我們:當(dāng)前的testrunner沒(méi)有任何Test。在我們的package中包含有不少TestCase,一切也都是按照AndroidSDK的設(shè)置來(lái)編寫(xiě)的代碼,出現(xiàn)即使是AndroidSDK中的例子程序運(yùn)行也存在這個(gè)問(wèn)題,我運(yùn)行ApiDemos\test中的JUnit測(cè)試單元,也一直存在這樣那樣的問(wèn)題。在學(xué)習(xí)到了前面的這些知識(shí)后,按AndroidSDKJUnit測(cè)試程序,步驟如下:首先,從InstrmentationRunner繼承,實(shí)現(xiàn)我們的自己的InstrumentpublicclassMoandroidTestRunnerextendsInstrumentationTestRunner{publicTestSuite{}publicClassLoader{return}}然后,將這個(gè)TestCase添加到TestSuite中,并將TestSuite返回到publicTestSuite{InstrumentationTestSuitesuite=newInstrumentationTestSuite(this);returnreturnnew}最后,按照前面說(shuō)的步驟,配置AndroidManifest.xml文件這里需要說(shuō)明的,我們創(chuàng)建了自己的Instrumentation,在配置要將riTtueJUnitEclipes、DevToolInstrumentation、adbsam–w命令啟動(dòng),應(yīng)該就可以看到測(cè)試運(yùn)行了??凑揂ndroidSDK再此基礎(chǔ)上怎么擴(kuò)展,只要我們能了解這

溫馨提示

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

評(píng)論

0/150

提交評(píng)論