Android測(cè)試教程全_第1頁
Android測(cè)試教程全_第2頁
Android測(cè)試教程全_第3頁
Android測(cè)試教程全_第4頁
Android測(cè)試教程全_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Android測(cè)試教程目錄Android測(cè)試教程1Android測(cè)試教程(1):概述1Android測(cè)試教程(2):測(cè)試基礎(chǔ)2Android測(cè)試教程(3):測(cè)試項(xiàng)目3Android測(cè)試教程:測(cè)試相關(guān)API6Android測(cè)試教程(5):第一個(gè)測(cè)試項(xiàng)目HelloWorldTest8Android測(cè)試教程(6):測(cè)試Activity11Android測(cè)試教程(7):測(cè)試ContentProvider12Android測(cè)試教程(8):測(cè)試Service13Android測(cè)試教程(9):ApplicationTestCase示例13Android測(cè)試教程(10):ActivityInstrumenta

2、tionTestCase2示例17Android測(cè)試教程(11):ActivityUnitTestCase示例18Android測(cè)試教程(12):ServiceTestCase示例20Android測(cè)試教程(13):TestCase示例22Android測(cè)試教程(14):ActivityInstrumentationTestCase2示例23Android測(cè)試教程(15):AndroidTestCase示例25Android測(cè)試教程(16):monkeyrunner簡介27Android測(cè)試教程(17):Monkey命令行工具28Android測(cè)試教程(18):總結(jié)32來源:csdn作者:ma

3、pdigitAndroid測(cè)試教程:概述測(cè)試也是開發(fā)過程中一個(gè)重要組成部分,Android開發(fā)環(huán)境集成一個(gè)測(cè)試框架可以用來測(cè)試Android應(yīng)用的各個(gè)方面,單元測(cè)試,UI測(cè)試等。本教程基于Android開發(fā)教程英文版。基本概念包括 Android測(cè)試的基礎(chǔ)知識(shí) ActivityTesting側(cè)重于Activity的測(cè)試,介紹了如果使用Instrumentation在正常Activity生命周期之外來控制Activity,然后測(cè)試Activity的特定的功能和測(cè)試UI的一些技巧。 ContentProviderTesting側(cè)重測(cè)試ContentProvider。 ServiceTesting側(cè)

4、重測(cè)試Service。 需要測(cè)試的內(nèi)容等。以及在EclipseADT開發(fā)環(huán)境下如何創(chuàng)建一個(gè)測(cè)試項(xiàng)目和Android開發(fā)工具提供的一些測(cè)試工具。在閱讀本測(cè)試教程之前,你需要有Android開發(fā)的一些基本知識(shí),可以參見Android開發(fā)教程,此外需要了解一些JUnit的基本概念。并又ApiDemo中的測(cè)試示例進(jìn)行解析。Android測(cè)試教程:測(cè)試基礎(chǔ)Android測(cè)試框架(AndroidTestingFramework)為Android開發(fā)環(huán)境的一個(gè)組成部分,可以用來測(cè)試Android的各個(gè)方面,從單元測(cè)試到框架測(cè)試到UI測(cè)試等。其主要功能有: Android測(cè)試框架基于JUnit,因此可以直接使

5、用JUnit來測(cè)試一些與Android平臺(tái)不是很相關(guān)的類,或者使用Android的JUint擴(kuò)展來測(cè)試Android組件,如果你剛開始接觸Android測(cè)試,可以先從AndroidTestCase寫一些通用的測(cè)試用例,然后再寫較復(fù)雜的測(cè)試用例。 AndroidJUint擴(kuò)展提供了對(duì)Android特定組件(如Activity,Service)的測(cè)試支持,這些擴(kuò)展類提供了一些輔助方法來幫助創(chuàng)建測(cè)試使用的“樁”類或方法。 創(chuàng)建的測(cè)試包包含中一個(gè)測(cè)試包中,這個(gè)測(cè)試包和主應(yīng)用程序包具有類似的結(jié)構(gòu),創(chuàng)建測(cè)試包的步驟和創(chuàng)建Android應(yīng)用的方法基本類似。 Eclipse的ADT包含了創(chuàng)建測(cè)試用例的SDKX

6、具,并提供用于和其它IDE集成的命令行工具。這些工具可以從被測(cè)試的應(yīng)用程序包讀取所需信息用于創(chuàng)建測(cè)試項(xiàng)目的build文件,mainfest文件和文件目錄結(jié)構(gòu)等。 SDKtk提供了一個(gè)moneyrunner(一個(gè)python應(yīng)用)可以模擬用戶按鍵事件來測(cè)試UI。卜圖為Android測(cè)試框架的一個(gè)總結(jié):Android測(cè)試教程:測(cè)試項(xiàng)目Android的編譯和測(cè)試工具需要測(cè)試項(xiàng)目組織符合預(yù)訂的結(jié)構(gòu):分別為Testcase類,Testcase包以及測(cè)試項(xiàng)目。JUnit為Android的測(cè)試的基礎(chǔ),一般來說,一個(gè)JUint測(cè)試為一個(gè)用來測(cè)試一個(gè)應(yīng)用某一部分的語句。你可以將多個(gè)測(cè)試Test方法組織起來構(gòu)成一

7、個(gè)測(cè)試用例(Testcase),多個(gè)測(cè)試用例可以構(gòu)成TestSuites。每個(gè)Test方法相對(duì)獨(dú)立,一個(gè)測(cè)試類Testclass包含一組相關(guān)的Test或其它輔助方法。在Android平臺(tái)上,你可以使用測(cè)試工具調(diào)入TestPackage和所要測(cè)試的應(yīng)用,然后執(zhí)行TestRunner來運(yùn)行測(cè)試用例。使用EclipseADT工具創(chuàng)建測(cè)試項(xiàng)目的方法:1.在創(chuàng)建應(yīng)用的同時(shí)創(chuàng)建測(cè)試項(xiàng)目,如下圖AppliationTestBrowse.*Nev;AndroidProjectNewAndruidTestProjectCwatMarhewAndroidTertProjttresource.Content0Use

8、defaultlocationLocatior:C;/ecIipse/workspace/App11ationTestTertTargetTestTargetPackage:com.p-streets.testBuildTargetTargetNameVendorPlatformAPILeDAndroid1.5AndroidOpenSourceProject1.53選中GoogleAPIsHAndroidL6GoogleAPIsAndroid2.1-updatelpGoogleAPIs|Android乙2GoogleAPIs口GALAXYTabAddon Android2.3J|GoogleA

9、PIs EDK11I1CreateaTestProject,GoogleIhgAndroid。昨nSour%ProjectGoogleJnc.AndroidOpenSourceProjectGoogle(ncAndroidOpenSourceProjectGoogleInc.SamsungElectronicsCo.,Ltd.AndreidOpenSourceProjectGoogleInc.SonyEricssonMobileCcmmunicaticnsABflADT自動(dòng)為應(yīng)用創(chuàng)建對(duì)應(yīng)的測(cè)試項(xiàng)目1,53L64L642.1-updatel721-updatel322811S2JS2slg2.3

10、.1923,19III2.導(dǎo)入已有的測(cè)試項(xiàng)目,并和被測(cè)試的應(yīng)用關(guān)聯(lián)。AndroidSDK自帶ApiDemo,并帶有其對(duì)應(yīng)的測(cè)試項(xiàng)目ApiDemos->Test.打開ApiDemos->Test的方法如下,首先是選中BuildTarget(比如Android2.2),然后選擇Createprojectfromexistingsample,從下拉列表中選擇ApiDemos->Tests(注意你要先創(chuàng)建ApiDemosAndroidApiDemos示例解析(1):創(chuàng)建ApiDemo示例)將ApiDemos->tests和ApiDemos關(guān)聯(lián)起來:的項(xiàng)目Projects中添修改

11、ApiDemos->tests測(cè)試項(xiàng)目的屬性,在JavaBuildPath力口ApiDemos你最女?使Eclipse工具創(chuàng)建測(cè)試項(xiàng)目:作為運(yùn)行TestPackage或其子類做為Test自動(dòng)為你的測(cè)試項(xiàng)目設(shè)置使用InstrumentationTestRunner的TestRunner,測(cè)試項(xiàng)目必須使用InstrumentationTestRunnerPackage的runner.為測(cè)試項(xiàng)目創(chuàng)建合適的項(xiàng)目名稱和測(cè)試包名稱,比如你需要測(cè)試的應(yīng)用的包名稱為com.mydomain.myapp貝U自動(dòng)創(chuàng)建的測(cè)試包名為com.mydomain.myapp.test,從測(cè)試包名可以很容易找到對(duì)應(yīng)的應(yīng)

12、用程序包名稱。自動(dòng)創(chuàng)建合適的build文件,mainifest文件和文件目錄結(jié)構(gòu)。建議使用的文件目錄結(jié)構(gòu)可以如下所示:MyProjectZAndroidManifest.xmlresZ,(resourcesformainapplication)srcZ(sourcecodeformainapplication)tests/-AndroidManifest.xml-res/-,(resourcesfortests)-src/-,(sourcecodefortests)Android測(cè)試教程:測(cè)試相關(guān)APIAndroid的測(cè)試框架相關(guān)的API主要定義在三個(gè)包中: android.test用于編寫A

13、ndroid測(cè)試用例 android.test.mock定義了方便測(cè)試用的測(cè)試"樁"類 android.test.suitebuilder運(yùn)行測(cè)試用例的TestRunner類Android測(cè)試API是基于JUnit擴(kuò)展而來,并添加了與Android平臺(tái)相關(guān)的測(cè)試API。JUnit你可以直接使用JUnit中相關(guān)API編寫一些和平臺(tái)無關(guān)的測(cè)試用例(基于TestCase),Android測(cè)試API中提供了一個(gè)TestCase的子類AndroidTestCase,可以用來編寫一些Android相關(guān)的對(duì)象的測(cè)試用例,AndroidTestCase支持一些和平臺(tái)相關(guān)的setup,tea

14、rdown以及setup方法。你也可以直接使用JUnit的Assert方法顯示測(cè)試結(jié)果,這些Assert方法可以通過比較預(yù)期的值和實(shí)際的值,如果不同可以排除異常。Android測(cè)試API擴(kuò)展了一些Assert方法用于支持和Android平臺(tái)相關(guān)的比較。要注意的是,Android測(cè)試API支持JUnit3代碼風(fēng)格,而不支持JUnit4代碼風(fēng)格,也只能使用InstrumentationTestRunner來運(yùn)行測(cè)試用例。InstrumentationAndroid的Instrumentation提供了一些"鉤子"方法連接到Android操作系統(tǒng)中,可以獨(dú)立控制Android組件

15、(Activity,Service等)的生命周期,并可以控制Android如何調(diào)用一個(gè)應(yīng)用。在通常情況下(普通的Android應(yīng)用),Android的activity,Service等的生命周期是由Android操作系統(tǒng)來控制的。比如一個(gè)Activity的生命周期開始于onCreate(由某個(gè)Intent激活),然后是onResume.可以參見Android簡明開發(fā)教程五:Activities。應(yīng)用程序本身無法直接控制這些生命周期狀態(tài)的切換。但使用InstrumatationAPI時(shí)你可以直接調(diào)用這些方法。一個(gè)進(jìn)程中,這在通常的情況下是不可能實(shí)現(xiàn)的。使用InstrumentationAPI你可

16、以直接調(diào)用Activity或是Service的生命周期回調(diào)函數(shù),從而可以讓你運(yùn)行一步一步的運(yùn)行Activity或是Service的生命周期函數(shù)。如下例顯示了如何使用InstrumentationAPI來測(cè)試Activity保持和恢復(fù)State。/Startthemainactivityofthe/applicationundertestmActivity=getActivity();/GetahandletotheActivityobject's/mainUIwidget,aSpinnermSpinner=(Spinner)mActivity.findViewById(com.andr

17、oid.example.spinner.R.id.Spinner01);/SettheSpinnertoaknownpositionmActivity.setSpinnerPosition(TEST_STATE_DESTROY_POSITION);/Stoptheactivity-TheonDestroy()/methodshouldsavethestateoftheSpinnermActivity.finish();/Re-starttheActivity-theonResume()/methodshouldrestorethestateoftheSpinnermActivity=getAc

18、tivity();/GettheSpinner'scurrentpositionintcurrentPosition=mActivity.getSpinnerPosition();/Assertthatthecurrentpositionisthe/sameasthestartingpositionassertEquals(TEST_STATE_DESTROY_POSITION,currentPosition);其中關(guān)鍵的一個(gè)方法是getActivity(),只有調(diào)用getActivity()后被測(cè)試的activity才會(huì)啟動(dòng)。此外InstrumentationAPI允許把測(cè)試項(xiàng)目和被

19、測(cè)試的應(yīng)用項(xiàng)目運(yùn)行到同一個(gè)進(jìn)程中,從而在測(cè)試代碼中可以直接調(diào)用被測(cè)試應(yīng)用的方法和訪問其成員。Testcase相關(guān)類Android提供了多個(gè)由Testcase或Assert派生而來的子類以支持Android平臺(tái)相關(guān)的setup,teardown和其它輔助方法。AndroidTestCase為一Android平臺(tái)下通用的測(cè)試類,它支持所有JUnit的Assert方法和標(biāo)準(zhǔn)的setUp和tearDown方法,并可以用來測(cè)試Androidpermission組件相關(guān)的測(cè)t類如測(cè)試activity,Contentprovider,Service相關(guān)的測(cè)試類,Android沒有提供單獨(dú)白用來測(cè)試Broad

20、castReceiver的測(cè)試類,而是可以通過發(fā)送Intent對(duì)象來檢測(cè)BroadcastReceiver的反應(yīng)結(jié)果來測(cè)試BroadcastReceiver。ApplicationTestCase可以用來測(cè)試Application對(duì)象。InstrumentationTestCase如果你要使用InstrumentationAPI,那么你必須使用InstrumentationTestCase或其子類。AssertionclassesAndroid測(cè)試中可以使用JUnit中提供的Assert方法來顯示測(cè)試結(jié)果。除此之外,TestingAPI還提供了MoreAsserts和ViewAsserts類。

21、其中MoreAsserts支持更多的比較方法包括RegEx(正則)比較等。ViewAsserts可以用來校驗(yàn)UIView。Mockobjectclassesandroid.test.mock包中定義一些測(cè)試"樁"類,如MockApplication,MockContentProvider,MockContext,MockCursor,MockPackagManager等用例幫助測(cè)試。后面將具體介紹如何使用這些API來編寫測(cè)試用例。Android測(cè)試教程(5):第一個(gè)測(cè)試項(xiàng)目HelloWorldTest本例介紹創(chuàng)建一個(gè)測(cè)試項(xiàng)目的一般步驟和編寫測(cè)試用例的基本方法。為簡單起見,創(chuàng)

22、建一個(gè)HelloWorld應(yīng)用,帶有一個(gè)Greeting類,其定義如下:publicclassGreetingprivateStringname;publicGreeting(Stringname)=name;publicStringgetGreetings()return"Hello,"+name;測(cè)試項(xiàng)目打算來測(cè)試這個(gè)Greeting類的getGreetings的方法,比如說,創(chuàng)建Greeting("World"),預(yù)期的getGreetings的值應(yīng)為"Hello,World"。我們可以使用JUnit框架來編寫

23、一個(gè)測(cè)試用例。這里我們?cè)趧?chuàng)建HelloWorld的項(xiàng)目的同時(shí)創(chuàng)建一個(gè)測(cè)試項(xiàng)目,參見Android測(cè)試教程(3):測(cè)試項(xiàng)目HeiloWorldJ®5TC由com.pstreets.demori|7|Greeting.java©Greetingorame3Greetin虱StringqgetGreeitingeO;.1.rinj.UMeItoWorIdjava.©HelioWorldagreetingcriCreatetBLindh:cidt>孰genGeneratedJavaFilesbMAndroid1.6assetsAndroidMarrifel.xmId

24、efault,propertiespreguard.cfgk-H&NoWorldTet»西5rleV津genGeneratedJavaFilesAndroidL6assetsAndroidMarrif&5ticmI國default,propettierprcguard.cfg可以看到新創(chuàng)建的測(cè)試項(xiàng)目名稱為HelloWorldTest,并在src中創(chuàng)建了com.pstreets.demo.test文件夾(和HelloWorld應(yīng)用的com.pstreets.demo包相對(duì)應(yīng))。但src還沒有任何代碼??梢钥吹紿elloWorldTest屬性的JavaBuildPath-

25、>Projects中引用的Project為HelloWorld,表示在HelloWorldTest項(xiàng)目中可以引用HelloWorld項(xiàng)目中的類。然后在HelloWorldTest的src的com.pstreets.demo.test中添加一個(gè)AllTests.java,其定義如下:publicclassAllTestsextendsTestSuitepublicstaticTestsuite()returnnewTestSuiteBuilder(AllTests.class).includeAllPackagesUnderHere().build();AllTests.java般可以不用

26、修改的應(yīng)用到大部分的測(cè)試項(xiàng)目中,如果有特殊需要,可以使用android.test.suitebuilder的類定義那些Testcase需要包含到最終的測(cè)試包(TestSuite)中.定義了AllTests.java,這個(gè)測(cè)試項(xiàng)目就基本完整了,也可以運(yùn)行了,只是還沒有定義任何測(cè)試用例(Testcase)。這里定義一個(gè)GreetingTest,用于測(cè)試Greeting類:publicclassGreetingTestextendsTestCaseGreetinggreeting;OverridepublicvoidsetUp()greeting=newGreeting("World&qu

27、ot;);)OverridepublicvoidtearDown()publicvoidtestGetGreeting()assertTrue(greeting.getGreetings().compareToIgnoreCase("Hello,World")=0);)其實(shí)對(duì)于與這個(gè)例子setUp和tearDown不是必須的,如果多個(gè)TestCase使用同一組測(cè)試數(shù)據(jù),可以在setUp中創(chuàng)建這些測(cè)試數(shù)據(jù),JUnit中運(yùn)行每個(gè)TestCase前會(huì)運(yùn)行setUp,運(yùn)行TestCase后會(huì)執(zhí)行tearDown。JUnit把以test開頭的方法作為一個(gè)實(shí)例,也可以使用annotat

28、ionTest表示一個(gè)方法為測(cè)試方法。GreetingTest由TestCase派生,因?yàn)檫@里測(cè)試是一個(gè)普通Java類(和Android平臺(tái)無關(guān)),也可以使用AndroidTestCase作為基類。testGetGreeting使用assertTrue來檢測(cè)測(cè)試結(jié)果,預(yù)期的getGreetings()的值為"Hello,World”,如果為true,表示測(cè)試通過。以AndroidJUintTest的方式運(yùn)行HelloWorldTestRunAs。白bugAsValidateTeamCompareWithRestore-fromLd匚口IHistory-.4一.T_I->Ll_4

29、JavaApplicationAlt-bShift+X,JJl5JUnitTestR.urrCcnfigurations.,.AltfShift-bXT運(yùn)彳亍HelloWorldTest時(shí),Android測(cè)試環(huán)境會(huì)自動(dòng)啟動(dòng)HelloWorld,并在JUint窗口顯示最終測(cè)試結(jié)果。在開發(fā)應(yīng)用過程中,可以一邊編寫應(yīng)用,一邊編寫測(cè)試用例。Android測(cè)試教程(6):測(cè)試ActivityActivity的測(cè)試非常依賴于Android的Instrumation框架,和Android其他組件不同的是,Activity具有復(fù)雜的生命周期回調(diào)函數(shù)(如onCreate,onStart等),通常情況下除通過In

30、strumation接口外不能直接調(diào)用這些回調(diào)函數(shù)。 測(cè)試Activity的基本測(cè)試類為InstrumentationTestCase,它提供了Instrumentation接口給TestCase的子類。為了支持Activity測(cè)試,InstrumentationTestCase提供了下面功能: 生命周期控制:使用Instrumentation,你可以啟動(dòng),暫停,中止被測(cè)試的ActivityDependencyInjection:Instrumentation允許創(chuàng)建一些Mock對(duì)象如Context,Application來幫助測(cè)試Activity,從而幫助你控制測(cè)試環(huán)境并和實(shí)際的應(yīng)用的其他部

31、分隔離開來。你也可以定制一些Intent以啟動(dòng)Activity。 用戶界面交互:你可以使用Instrumentation向UI發(fā)送按鍵和觸摸事件。下面幾個(gè)為主要的用于測(cè)試Activity由TestCase派生而來的測(cè)試類: ActivityInstrumentationTestCase2通常用于多個(gè)Activity的功能測(cè)試,它使用正常的系統(tǒng)框架來運(yùn)行Activity(使用應(yīng)用程序本身),并使用正常系統(tǒng)Context(非Mock)來測(cè)試Activity的功能。允許你創(chuàng)建一些MockIntent用來測(cè)試Activity的響應(yīng)。要注意的是,這種TestCase不允許使用Mock的Context和A

32、pplication對(duì)象測(cè)試,也就是說你必須使用和應(yīng)用程序?qū)嶋H運(yùn)行的環(huán)境來測(cè)試。 ActivityUnitTestCase通常用來測(cè)試單獨(dú)Activity。在啟動(dòng)被測(cè)試的Activity之前,你可以Inject一個(gè)假的Context或是Application,使用這個(gè)Mock的Context中一個(gè)隔離環(huán)境中運(yùn)行被測(cè)試的Activity。通常用于Activity的單元測(cè)試,而不和Anroid系統(tǒng)進(jìn)行交互。 SingleLaunchActivityTestCase用于測(cè)試單個(gè)Activity,和ActivityUnitTestCase不同的是,它只運(yùn)行setUp和tearDown一次,而不是在運(yùn)行

33、testCase中每個(gè)TestMethod前后運(yùn)行setup和tearDown,它可以保證運(yùn)行多個(gè)測(cè)試之間fixture不會(huì)被重置,從而可以用來測(cè)試一些有關(guān)聯(lián)的方法。本篇和后面幾篇介紹Activity,Service,ContentProvider測(cè)試的基本概念和相關(guān)類,之后則結(jié)合ApiDemo->Tests為例具體介紹這些類的用法。Android測(cè)試教程(7):測(cè)試ContentProviderContentProvider為不同的應(yīng)用訪問數(shù)據(jù)提供了統(tǒng)一的接口,本篇介紹Android測(cè)試包中用于測(cè)試ContentProvider的相關(guān)知識(shí)。Android測(cè)試包中用于測(cè)試ContentP

34、rovider的基本類為ProviderTestCase2,允許你在一個(gè)隔離環(huán)境下來測(cè)試ContentProvider。并提供了一些Mock類如IsolatedContext,MockContentResover來輔助測(cè)試。和其它測(cè)試一樣,對(duì)于ContentProvider測(cè)試也是通過InstrumentationTestRunner來進(jìn)行的。編譯測(cè)試代碼的一般方法是通過派生ProviderTestCase2(為AndroidTestCase的子類),因此可以使用JUnit和Android平臺(tái)相關(guān)的方法來測(cè)試ContentProvider??梢詤⒁姾竺娴膶?shí)例來了解如何測(cè)試ContentProv

35、ider。Android測(cè)試教程(8):測(cè)試ServiceAndroid測(cè)試框架也提供對(duì)Service測(cè)試的支持,基本類為ServiceTestCase,因?yàn)镾ervice類通常假定和它是和Client是分開使用的,因此你可以無需使用Instrumentation來測(cè)試Service。當(dāng)你設(shè)計(jì)一個(gè)Service時(shí),你應(yīng)該考慮測(cè)試用例中如何檢查Service的當(dāng)前狀態(tài),比如你在onCreate,onStartCommand中啟動(dòng)一個(gè)Service,一般沒有一個(gè)全局變量來表示Service是否成功,你可能需要自己定義一個(gè)全局變量用于測(cè)試用例中。ServiceTestCase中提供getServic

36、e()可以取得當(dāng)前被測(cè)試的Service對(duì)象。ServiceTestCase為AndroidTestCase的子類,因此可以測(cè)試和Permission相關(guān)的功能,并提供Mock的Application和Context對(duì)象為測(cè)試Service提供了一個(gè)隔離的測(cè)試環(huán)境。Android測(cè)試教程(9):ApplicationTestCase示例前面介紹了Android測(cè)試的一些理論知識(shí),從本篇開始的幾篇將結(jié)合ApiDemoTest示例來介紹Android測(cè)試的實(shí)例。在此之前可以參照Android測(cè)試教程(3):測(cè)試項(xiàng)目創(chuàng)建ApiDemos->tests測(cè)試項(xiàng)目,本項(xiàng)目測(cè)試用來測(cè)試ApiDemos

37、,主要目的是介紹Android測(cè)試框架的使用方法。當(dāng)然要測(cè)試ApiDemos,事先要?jiǎng)?chuàng)建好項(xiàng)目ApiDemos。下圖顯示了創(chuàng)建好ApiDemos->Tests后,ApiDemos->Tests中所含的Java類:任ApiOemos/士ccm_exannple_android_apis_tfrsts三Android2.2/3“七,舟匚口小庫*號(hào)mpk1用ndqidgpi導(dǎo)J|AllTests.java|_JApiDemosApplicationTe.javal|ApIDemo5Testjava* ,jjccm.ej(ample.dnclroid,apis,app|J|Forwardi

38、ngTe?t.java.JLocalService!Mtjava* 70r二onn,碎xompl號(hào)用ndq汨聞.MorseCodeCoriverterTestjava* :cam.examplendroidrjpiview|JFocus?Activity7est.java7iFocu52AndroidTestjavagenGe"eraitc.a1;a-liesassetsresA.ndroidMarrife5t.xmIbufldpropertitndefaultpropertiesAndroid測(cè)試項(xiàng)目也是一個(gè)Android應(yīng)用項(xiàng)目,其基本使用方法和開發(fā)一般的Android應(yīng)用非常類

39、似,Android測(cè)試項(xiàng)目主要是利用Android測(cè)試框架編寫測(cè)試用例來測(cè)試對(duì)應(yīng)的Android應(yīng)用的各個(gè)方面。其中AllTests.java定義如下:publicclassAllTestsextendsTestSuitepublicstaticTestsuite()returnnewTestSuiteBuilder(AllTests.class).includeAllPackagesUnderHere().build();使用TestSuiteBuilder指明所有該包和其子包中定義的TestCase都為最終TestSuite的一部分(需要被運(yùn)行的測(cè)試)。AllTests.java一般可以不

40、用修改的應(yīng)用到大部分的測(cè)試項(xiàng)目中,如果有特殊需要,可以使用android.test.suitebuilder的類定義那些Testcase需要包含到最終的測(cè)試包(TestSuite)中.ApiDemosApplicationTests測(cè)試介紹ApplicationTestCase的基本使用方法。下圖為ApplicationTestCase的繼承關(guān)系:舊日忸/口口自阻LjunrLfra色w/uricT曰stCase間巾-叱由與An由加儂©£(Landroid.test.Applies!ionTestCaE&=Textends-nUmid口皿ApubcaflonAppli

41、cationTestCase主要用來測(cè)試Application類,提供了對(duì)Application類生命周期方法的基本支持,并可以支持一些dependencyinjection以幫助構(gòu)造測(cè)試Application的的環(huán)境。ApplicationLifecycle支持,每個(gè)Application運(yùn)行都遵循一定的順序(生命周期方法),ApplicationTestCase提供下面方法來支持對(duì)Application生命周期方法的測(cè)試:只有當(dāng)測(cè)試用例調(diào)用createApplication()后才會(huì)執(zhí)行Application的onCreate方法,從而使得你有機(jī)會(huì)在調(diào)用Application的onCrea

42、te方法之前對(duì)測(cè)試框架做些調(diào)整。當(dāng)測(cè)試用例結(jié)束時(shí),測(cè)試用例的tearDown方法會(huì)被調(diào)用,然后會(huì)調(diào)用Application的onDestroy()方法停止和銷毀Application.DependencyInjection每個(gè)Application都依賴于運(yùn)行它的Context對(duì)象,Android測(cè)試框架允許你注入一個(gè)Mock的或者孤立的context對(duì)象,以實(shí)現(xiàn)真正的單元測(cè)試,如果只是想做一般的測(cè)試,你的Application方法將被注入全功能的Context對(duì)象,你可以使用setContext來注入你定義的Mock的Context對(duì)象,setContext必須在createApplicat

43、ion之前調(diào)用。測(cè)試框架提供了如MockContext,RenamingDelegatingContext,ContextWrapper來幫助你構(gòu)造用于測(cè)試Applicaton的Context對(duì)象。本例的代碼如下:publicclassApiDemosApplicationTestsextendsApplicationTestCase<ApiDemosApplication>publicApiDemosApplicationTests()super(ApiDemosApplication.class);OverrideprotectedvoidsetUp()throwsExcept

44、ionsuper.setUp();SmallTestpublicvoidtestPreconditions()*Testbasicstartup/shutdownofApplication*/MediumTestpublicvoidtestSimpleCreate()createApplication();有幾個(gè)新知識(shí)1. SmallTestMediumTest:Android測(cè)試框架可以使用SmallTest,MediumTest和LargeTest來標(biāo)注測(cè)試方法,這些分類劃分主要是根據(jù)測(cè)試訪問數(shù)據(jù)的位置,如本地,SD卡,網(wǎng)絡(luò),下表為通常劃分測(cè)試等級(jí)的基本方法:FeatureSmallMed

45、iumLargeNetworkaccessNolocalhostonlyYesDatabaseNoYesYesFilesystemaccessNoYesYesUseexternalsystemsNoDiscouragedYesMultiplethreadsNoYesYesSleepstatementsNoYesYesSystempropertiesNoYesYesTimelimit(seconds)60300900+2. testPreconditionstestPreconditions測(cè)試主要用來運(yùn)行其它測(cè)試方法之前來校驗(yàn)Application對(duì)象的初始化情況,和setUp類似,但和set

46、Up不同的是,testPreconditions只會(huì)被運(yùn)行一次,而setUp通常在執(zhí)行每個(gè)測(cè)試方法之前都會(huì)運(yùn)行一次,一般需把它做為Application第一個(gè)測(cè)試方法,但由于JUnit使用Reflection來取得測(cè)試方法,因此并不一定能保證testPreconditions一定在其它測(cè)試方法之前運(yùn)行。testSimpleCreate為測(cè)試Application的測(cè)試方法,調(diào)用createApplication會(huì)觸發(fā)Application的onCreate方法,測(cè)試結(jié)束后,執(zhí)行tearDown,然后調(diào)用Application的onDestroy方法,如果Application的onCreate

47、,onDestroy運(yùn)行拋出異常的話,則本測(cè)試方法失敗,否則表示測(cè)試通過。ApplicationTestCase還提供了一個(gè)terminateApplication中止Application,可以測(cè)試Application的onTerminate方法。Android測(cè)試教程(10):ActivityInstrumentationTestCase2示例ActivityInstrumentationTestCase2主要用來測(cè)試一個(gè)或多個(gè)Activity的功能測(cè)試,使用和最終應(yīng)用同樣的運(yùn)行環(huán)境來測(cè)試Activity的功能??梢允褂谜O到y(tǒng)Context(非Mock)來測(cè)試Activity的功能。并

48、允許你創(chuàng)建一些MockIntent用來測(cè)試Activity的響應(yīng)。要注意的是,這種TestCase不允許使用Mock的Context和Application對(duì)象測(cè)試,也就是說你必須使用和應(yīng)用程序?qū)嶋H運(yùn)行的環(huán)境來測(cè)試。ActivityInstrumentationTestCase2的繼承關(guān)系如下圖所示:Ljunit,fi一meworkAssartLiunHfmm-waflcTLanWoicnestInstrum而。:舊訂席teaseL自門droid-10tAjctr-tyT自客自Landroid.tesLAcljityinsfrumentalionTestGase2<Textends-由由

49、立白口仇仙忖I它的getActivity()方法可以取得被測(cè)試的Activity的實(shí)例對(duì)象。publicclassApiDemosTestextendsActivityInstrumentationTestCase2<ApiDemos>publicApiDemosTest()super(ApiDemos.class);publicvoidtestActivityTestCaseSetUpProperly()assertNotNull("activityshouldbelaunchedsuccessfully",getActivity();測(cè)試方法testActi

50、vityTestCaseSetUpProperly使用getActivity(),主要目的是測(cè)試本測(cè)試的Activity能否正常啟動(dòng),測(cè)試getActivity()是否非空。此外ActivityInstrumentationTestCase2還提供了兩個(gè)方法:setActivityInitialTouchMode(boolean)在啟動(dòng)Activity之前設(shè)置TouchModesetActivityIntent(Intent)可以設(shè)置啟動(dòng)Activity的Intent對(duì)象來測(cè)試ActivityAndroid測(cè)試教程(11):ActivityUnitTestCase示例ActivityUnitT

51、estCase通常用來測(cè)試單獨(dú)Activity。在啟動(dòng)被測(cè)試的Activity之前,你可以Inject一個(gè)假的Context或是Application,使用這個(gè)Mock的Context中一個(gè)隔離環(huán)境中運(yùn)行被測(cè)試的Activity。通常用于Activity的單元測(cè)試,而不和Anroid系統(tǒng)進(jìn)行交互。ActivityUnitTestCase的類繼承關(guān)系如下圖:舊回mno口口回通仃日meworkAssertLiunitTpstCa5HkdTidRjmerrtationT白tC3津eUaEed加stAcbyitvTestCasHLandroidtestActurrtyUnitTestCas&=

52、:remends+唧加"應(yīng)該要注意的是,作為單純的單元測(cè)試,被測(cè)試的Activity不運(yùn)行在一般應(yīng)用運(yùn)行的環(huán)境中也不和其它Activity產(chǎn)生交互。在這種情況下,不能調(diào)用下面的方法,如果調(diào)用一般會(huì)拋出異常:createPendingResult(int,Intent,int)startActivityIfNeeded(Intent,int)startActivityFromChild(Activity,Intent,int)startNextMatchingActivity(Intent)getCallingActivity()getCallingPackage()createPen

53、dingResult(int,Intent,int)getTaskId()isTaskRoot()moveTaskToBack(boolean)下面的方法可以調(diào)用,但一般不起任何作用,你可以使用getStartedActivityIntent()和getStartedActivityRequest()來檢查參數(shù)值。startActivity(Intent)startActivityForResult(Intent,int)isFinishCalled()下面的方法也可以調(diào)用,一般也無效果,可以使用getFinishedActivityRequest檢查傳入的參數(shù)。finish()finishF

54、romChild(Activity)finishActivity(int)ForwardingTest的代碼如下:publicclassForwardingTestextendsActivityUnitTestCase<Forwarding>privateIntentmStartIntent;privateButtonmButton;publicForwardingTest()super(Forwarding.class);OverrideprotectedvoidsetUp()throwsExceptionsuper.setUp();mStartIntent=newIntent(

55、Intent.ACTION_MAIN);MediumTestpublicvoidtestPreconditions()startActivity(mStartIntent,null,null);mButton=(Button)getActivity().findViewById(R.id.go);assertNotNull(getActivity();assertNotNull(mButton);MediumTestpublicvoidtestSubLaunch()Forwardingactivity=startActivity(mStartIntent,null,null);mButton=

56、(Button)activity.findViewById(R.id.go);mButton.performClick();assertNotNull(getStartedActivityIntent();assertTrue(isFinishCalled();MediumTestpublicvoidtestLifeCycleCreate()Forwardingactivity=startActivity(mStartIntent,null,null);getInstrumentation().callActivityOnStart(activity);getInstrumentation().callActivityOnResume(activity);getInstrumentation().callActivityOnPause(activity);getInstrumentation().callActivityOnStop(activity);在setUp中,創(chuàng)建了一個(gè)MockIntent對(duì)象mStartIntent用于測(cè)試Activity。按慣例測(cè)試方法testPrecondi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論