免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
android Instrumentation 轉(zhuǎn)載
Android提供了一系列強(qiáng)大的測(cè)試工具,它針對(duì)Android的環(huán)境,擴(kuò)展了業(yè)內(nèi)標(biāo)準(zhǔn)的JUnit測(cè)試框架。盡管你可以使用JUnit測(cè)試Android工程,但Android工具允許你為應(yīng)用程序的各個(gè)方面進(jìn)行更為復(fù)雜的測(cè)試,包括單元層面及框架層面。

Android測(cè)試環(huán)境的主要特征有:

l   可以訪問Android系統(tǒng)對(duì)象。

l   Instrumentation框架可以控制和測(cè)試應(yīng)用程序。

l   Android系統(tǒng)常用對(duì)象的模擬版本。

l   運(yùn)行單個(gè)test或test suite的工具,帶或不帶Instrumentation。

l   支持以Eclipse的ADT插件和命令行方式管理Test和Test工程。

這篇文章是對(duì)Android測(cè)試環(huán)境和測(cè)試方法的簡要介紹,并假設(shè)你已經(jīng)擁有一定的Android應(yīng)用程序編程及JUnit測(cè)試的經(jīng)驗(yàn)。

概要

Android
測(cè)試環(huán)境的核心是一個(gè)Instrumentation框架,在這個(gè)框架下,你的測(cè)試應(yīng)用程序可以精確控制應(yīng)用程序。使用Instrumentation,
你可以在主程序啟動(dòng)之前,創(chuàng)建模擬的系統(tǒng)對(duì)象,如Context;控制應(yīng)用程序的多個(gè)生命周期;發(fā)送UI事件給應(yīng)用程序;在執(zhí)行期間檢查程序狀態(tài)。
Instrumentation框架通過將主程序和測(cè)試程序運(yùn)行在同一個(gè)進(jìn)程來實(shí)現(xiàn)這些功能。

通過在測(cè)試工程的manifest文件中添
加<instrumentation>元素來指定要測(cè)試的應(yīng)用程序。這個(gè)元素的特性指明了要測(cè)試的應(yīng)用程序包名,以及告訴Android如何
運(yùn)行測(cè)試程序。在Inustrumentation TestRunner章節(jié)有更多的細(xì)節(jié)描述。

下面的圖片概要的描述了Android的測(cè)試環(huán)境:




Android中,測(cè)試程序也是Android程序,因此,它和被測(cè)試程序的書寫方式有很多相同的地方。SDK工具能幫助你同時(shí)創(chuàng)建主程序工程及它的測(cè)試
工程。你可以通過Eclipse的ADT插件或者命令行來運(yùn)行Android測(cè)試。Eclipse的ADT提供了大量的工具來創(chuàng)建測(cè)試用例,運(yùn)行以及查看
結(jié)果。

Testing API

Android提供了基于JUnit測(cè)試框架的測(cè)試API來書寫測(cè)試用例和測(cè)試程序。另外,Android還提供了強(qiáng)大的Instrumentation框架,允許測(cè)試用例訪問程序的狀態(tài)及運(yùn)行時(shí)對(duì)象。

下面的章節(jié)描述了Android中可利用的主要測(cè)試API。

JUnit TestCase類


承自JUnit的TestCase,不能使用Instrumentation框架。但這些類包含訪問系統(tǒng)對(duì)象(如Context)的方法。使用
Context,你可以瀏覽資源,文件,數(shù)據(jù)庫等等。基類是AndroidTestCase,一般常見的是它的子類,和特定組件關(guān)聯(lián)。

子類有:

l   ApplicationTestCase——測(cè)試整個(gè)應(yīng)用程序的類。它允許你注入一個(gè)模擬的Context到應(yīng)用程序中,在應(yīng)用程序啟動(dòng)之前初始化測(cè)試參數(shù),并在應(yīng)用程序結(jié)束之后銷毀之前檢查應(yīng)用程序。

l   ProviderTestCase2——測(cè)試單個(gè)ContentProvider的類。因?yàn)樗笫褂肕ockContentResolver,并注入一個(gè)IsolatedContext,因此Provider的測(cè)試是與OS孤立的。

l   ServiceTestCase——測(cè)試單個(gè)Service的類。你可以注入一個(gè)模擬的Context或模擬的Application(或者兩者),或者讓Android為你提供Context和MockApplication。

Instrumentation TestCase類


承自JUnit
TestCase類,并可以使用Instrumentation框架,用于測(cè)試Activity。使用Instrumentation,Android可
以向程序發(fā)送事件來自動(dòng)進(jìn)行UI測(cè)試,并可以精確控制Activity的啟動(dòng),監(jiān)測(cè)Activity生命周期的狀態(tài)。

基類是InstrumentationTestCase。它的所有子類都能發(fā)送按鍵或觸摸事件給UI。子類還可以注入一個(gè)模擬的Intent。

子類有:

l   ActivityTestCase——Activity測(cè)試類的基類。

l   SingleLaunchActivityTestCase——測(cè)試單個(gè)Activity的類。它能觸發(fā)一次setup()和tearDown(),而不是每個(gè)方法調(diào)用時(shí)都觸發(fā)。如果你的測(cè)試方法都是針對(duì)同一個(gè)Activity的話,那就使用它吧。

l   SyncBaseInstrumentation——測(cè)試Content Provider同步性的類。它使用Instrumentation在啟動(dòng)測(cè)試同步性之前取消已經(jīng)存在的同步對(duì)象。

l   ActivityUnitTestCase——對(duì)單個(gè)Activity進(jìn)行單一測(cè)試的類。使用它,你可以注入模擬的Context或Application,或者兩者。它用于對(duì)Activity進(jìn)行單元測(cè)試。

不同于其它的Instrumentation類,這個(gè)測(cè)試類不能注入模擬的Intent。

l  

ActivityInstrumentationTestCase2——在正常的系統(tǒng)環(huán)境中測(cè)試單個(gè)Activity的類。你不能注入一個(gè)模擬的
Context,但你可以注入一個(gè)模擬的Intent。另外,你還可以在UI線程(應(yīng)用程序的主線程)運(yùn)行測(cè)試方法,并且可以給應(yīng)用程序UI發(fā)送按鍵及觸
摸事件。

Assert類

Android還繼承了JUnit的Assert類,其中,有兩個(gè)子類,MoreAsserts和ViewAsserts:

l   MoreAsserts類包含更多強(qiáng)大的斷言方法,如assertContainsRegex(String, String),可以作正則表達(dá)式的匹配。

l  
ViewAsserts類包含關(guān)于Android View的有用斷言方法,如assertHasScreenCoordinates(View,
View, int, int),可以測(cè)試View在可視區(qū)域的特定X、Y位置。這些Assert簡化了UI中幾何圖形和對(duì)齊方式的測(cè)試。

Mock對(duì)象類

Android
有一些類可以方便的創(chuàng)建模擬的系統(tǒng)對(duì)象,如Application,Context,Content
Resolver和Resource。Android還在一些測(cè)試類中提供了一些方法來創(chuàng)建模擬的Intent。因?yàn)檫@些模擬的對(duì)象比實(shí)際對(duì)象更容易使
用,因此,使用它們能簡化依賴注入。你可以在android.test和android.test.mock中找到這些類。

它們是:

l   IsolatedContext——模擬一個(gè)Context,這樣應(yīng)用程序可以孤立運(yùn)行。與此同時(shí),還有大量的代碼幫助我們完成與Context的通信。這個(gè)類在單元測(cè)試時(shí)很有用。

l   RenamingDelegatingContext——當(dāng)修改默認(rèn)的文件和數(shù)據(jù)庫名時(shí),可以委托大多數(shù)的函數(shù)到一個(gè)存在的、常規(guī)的Context上。使用這個(gè)類來測(cè)試文件和數(shù)據(jù)庫與正常的系統(tǒng)Context之間的操作。

l  

MockApplication,MockContentResolver,MockContext,MockDialogInterface,MockPackageManager,MockResources
——?jiǎng)?chuàng)建模擬的系統(tǒng)對(duì)象的類。它們只暴露那些對(duì)對(duì)象的管理有用的方法。這些方法的默認(rèn)實(shí)現(xiàn)只是拋出異常。你需要繼承這些類并重寫這些方法。

Instrumentation TestRunner

Android
提供了自定義的運(yùn)行測(cè)試用例的類,叫做InstrumentationTestRunner。這個(gè)類控制應(yīng)用程序處于測(cè)試環(huán)境中,在同一個(gè)進(jìn)程中運(yùn)行測(cè)試
程序和主程序,并且將測(cè)試結(jié)果輸出到合適的地方。IntrumentationTestRunner在運(yùn)行時(shí)對(duì)整個(gè)測(cè)試環(huán)境的控制能力的關(guān)鍵是使用
Instrumentation。注意,如果你的測(cè)試類不使用Instrumentation的話,你也可以使用這個(gè)TestRunner。

當(dāng)
你運(yùn)行一個(gè)測(cè)試程序時(shí),首先會(huì)運(yùn)行一個(gè)系統(tǒng)工具叫做Activity Manager。Activity
Manager使用Instrumentation框架來啟動(dòng)和控制TestRunner,這個(gè)TestRunner反過來又使用
Intrumentation來關(guān)閉任何主程序的實(shí)例,然后啟動(dòng)測(cè)試程序及主程序(同一個(gè)進(jìn)程中)。這就能確保測(cè)試程序與主程序間的直接交互。

在測(cè)試環(huán)境中工作

對(duì)Android程序的測(cè)試都包含在一個(gè)測(cè)試程序里,它本身也是一個(gè)Android應(yīng)用程序。測(cè)試程序以單獨(dú)的Android工程存在,與正常的Android程序有著相同的文件和文件夾。測(cè)試工程通過在manifest文件中指定要測(cè)試的應(yīng)用程序。

每個(gè)測(cè)試程序包含一個(gè)或多個(gè)針對(duì)特定類型組件的測(cè)試用例。測(cè)試用例里定義了測(cè)試應(yīng)用程序某些部分的測(cè)試方法。當(dāng)你運(yùn)行測(cè)試程序,Android會(huì)在相同進(jìn)程里加載主程序,然后觸發(fā)每個(gè)測(cè)試用例里的測(cè)試方法。

測(cè)試工程

為了開始對(duì)一個(gè)Android程序測(cè)試,你需要使用Android工具創(chuàng)建一個(gè)測(cè)試工程。工具會(huì)創(chuàng)建工程文件夾、文件和所需的子文件夾。工具還會(huì)創(chuàng)建一個(gè)manifest文件,指定被測(cè)試的應(yīng)用程序。

測(cè)試用例

一個(gè)測(cè)試程序包含一個(gè)或多個(gè)測(cè)試用例,它們都繼承自Android TestCase類。選擇一個(gè)測(cè)試用例類取決于你要測(cè)試的Android組件的類型以及你要做什么樣的測(cè)試。一個(gè)測(cè)試程序可以測(cè)試不同的組件,但每個(gè)測(cè)試用例類設(shè)計(jì)時(shí)只能測(cè)試單一類型的組件。


些Android組件有多個(gè)關(guān)聯(lián)的測(cè)試用例類。在這種情況下,在可選擇的類間,你需要判斷你要進(jìn)行的測(cè)試類型。例如,對(duì)于Activity來說,你有兩個(gè)
選擇,ActivityInstrumentationTestCase2和ActivityUnitTestCase。

ActivityInstrumentationTestCase2設(shè)計(jì)用于進(jìn)行一些功能性的測(cè)試,因此,它在一個(gè)正常的系統(tǒng)環(huán)境中測(cè)試Activity。你可以注入模擬的Intent,但不能是模擬的Context。一般來說,你不能模擬Activity間的依賴關(guān)系。

相比而言,ActivityUnitTestCase設(shè)計(jì)用于單元測(cè)試,因此,它在一個(gè)孤立的系統(tǒng)環(huán)境中測(cè)試Activity。換句話說,當(dāng)你使用這個(gè)測(cè)試類時(shí),Activity不能與其它Activity交互。

作為一個(gè)經(jīng)驗(yàn)法則,如果你想測(cè)試Activity與Android的交互的話,使用ActivityInstrumentationTestCase2。如果你想對(duì)一個(gè)Activity做回歸測(cè)試的話,使用ActivityUnitTestCase。

測(cè)試方法


個(gè)測(cè)試用例類提供了可以建立測(cè)試環(huán)境和控制應(yīng)用程序的方法。例如,所有的測(cè)試用例類都提供了JUnit的setUp()方法來搭建測(cè)試環(huán)境。另外,你可以
添加方法來定義單獨(dú)的測(cè)試。當(dāng)你運(yùn)行測(cè)試程序時(shí),每個(gè)添加的方法都會(huì)運(yùn)行一次。如果你重寫了setUp()方法,它會(huì)在每個(gè)方法運(yùn)行前運(yùn)行。相似
的,tearDown()方法會(huì)在每個(gè)方法之后運(yùn)行。

測(cè)試用例類提供了大量的對(duì)組件啟動(dòng)和停止控制的方法。由于這個(gè)原因,在運(yùn)行測(cè)試之
前,你需要明確告訴Android啟動(dòng)一個(gè)組件。例如,你可以使用getActivity()來啟動(dòng)一個(gè)Activity。在整個(gè)測(cè)試用例期間,你只能調(diào)
用這個(gè)方法一次,或者每個(gè)測(cè)試方法一次。甚至你可以在單個(gè)測(cè)試方法中,調(diào)用它的finishing()來銷毀Activity,然后再調(diào)用
getActivity()重新啟動(dòng)一個(gè)。

運(yùn)行測(cè)試并查看結(jié)果

編譯完測(cè)試工程后,你就可以使用系統(tǒng)工具Activity
Manager來運(yùn)行測(cè)試程序。你給Activity
Manager提供了TestRunner的名(一般是InstrumentationTestRunner,在程序中指定);名包括被測(cè)試程序的包名和
TestRunner的名。Activity
Manager加載并啟動(dòng)你的測(cè)試程序,殺死主程序的任何實(shí)例,然后在測(cè)試程序的同一個(gè)進(jìn)程里加載主程序,然后傳遞測(cè)試程序的第一個(gè)測(cè)試用例。這個(gè)時(shí)
候,TestRunner會(huì)接管這些測(cè)試用例,運(yùn)行里面的每個(gè)測(cè)試方法,直到所有的方法運(yùn)行結(jié)束。

如果你使用Eclipse,結(jié)果會(huì)在JUnit的面板中顯示。如果你使用命令行,將輸出到STDOUT上。

測(cè)試什么?

除了一些功能測(cè)試外,這里還有一些你應(yīng)該考慮測(cè)試的內(nèi)容:

l  

Activity生命周期事件:你應(yīng)該測(cè)試Activity處理生命周期事件的正確性。例如,一個(gè)Activity應(yīng)該在pause或destroy事件
時(shí)保存它的狀態(tài)。記住一點(diǎn)的是屏幕方向的改變也會(huì)引發(fā)當(dāng)前Activity銷毀,因此,你需要測(cè)試這種偶然情況確保不會(huì)丟失應(yīng)用程序狀態(tài)。

l   數(shù)據(jù)庫操作:你應(yīng)該確保數(shù)據(jù)庫操作能正確處理應(yīng)用程序狀態(tài)的變化。使用android.test.mock中的模擬對(duì)象。

l   屏幕大小和分辨率:在發(fā)布程序之前,確保在所有要運(yùn)行的屏幕大小和分辨率上測(cè)試通過。你可以使用AVD來測(cè)試,或者使用真實(shí)的目標(biāo)設(shè)備進(jìn)行測(cè)試。

附加:UI測(cè)試

接下來的章節(jié)為應(yīng)用程序UI的測(cè)試提供了一些提示,特別是幫助你在UI線程里處理動(dòng)作,觸屏和按鍵事件,和鎖屏。

UI線程中測(cè)試

Activity運(yùn)行在程序的UI線程里。一旦UI初始化后,例如在Activity的onCreate()方法后,所有與UI的交互都必須運(yùn)行在UI線程里。當(dāng)你正常運(yùn)行程序時(shí),它有權(quán)限可以訪問這個(gè)線程,并且不會(huì)出現(xiàn)什么特別的事情。

當(dāng)
你運(yùn)行測(cè)試程序時(shí),這一點(diǎn)發(fā)生了變化。在帶有instrumentation的類里,你可以觸發(fā)方法在UI線程里運(yùn)行。其它的測(cè)試用例類不允許這么做。為
了一個(gè)完整的測(cè)試方法都在UI線程里運(yùn)行,你可以使用@UIThreadTest來聲明線程。注意,這將會(huì)在UI線程里運(yùn)行方法里所有的語句。不與UI交
互的方法不允許這么做;例如,你不能觸發(fā)Instrumentation.waitForIdleSync()。

如果讓方法中的一部分代碼運(yùn)行在UI線程的話,創(chuàng)建一個(gè)匿名的Runnable對(duì)象,把代碼放到run()方法中,然后把這個(gè)對(duì)象傳遞給appActivity.runOnUiThread(),在這里,appActivity就是你要測(cè)試的app對(duì)象。

例如,下面的代碼實(shí)例化了一個(gè)要測(cè)試的Activity,為Spinner請(qǐng)求焦點(diǎn),然后發(fā)送一個(gè)按鍵給它。注意:waitForIdleSync和sendKeys不允許在UI線程里運(yùn)行:

  private MyActivity mActivity; // MyActivity is the class name of the app under test

  private Spinner mSpinner;



  ...



  protected void setUp() throws Exception {

      super.setUp();

      mInstrumentation = getInstrumentation();



      mActivity = getActivity(); // get a references to the app under test



      /*

       * Get a reference to the main widget of the app under test, a Spinner

       */

      mSpinner = (Spinner) mActivity.findViewById(com.android.demo.myactivity.R.id.Spinner01);



  ...



  public void aTest() {

      /*

       * request focus for the Spinner, so that the test can send key events to it

       * This request must be run on the UI thread. To do this, use the runOnUiThread method

       * and pass it a Runnable that contains a call to requestFocus on the Spinner.

       */

      mActivity.runOnUiThread(new Runnable() {

          public void run() {

              mSpinner.requestFocus();

          }

      });



      mInstrumentation.waitForIdleSync();



      this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);



關(guān)閉觸屏模式

為了控制從測(cè)試程序中發(fā)送給模擬器或設(shè)備的按鍵事件,你必須關(guān)閉觸屏模式。如果你不這么做,按鍵事件將被忽略。

關(guān)
閉觸摸模式,你需要在調(diào)用getActivity()啟動(dòng)Activity之前調(diào)用
ActivityInstrumentationTestCase2.setActivityTouchMode(false)。你必須在非UI線程中運(yùn)
行這個(gè)調(diào)用。基于這個(gè)原因,你不能在聲明有@UIThread的測(cè)試方法調(diào)用??梢栽趕etUp()中調(diào)用。

模擬器或設(shè)備的解鎖

你可能已經(jīng)發(fā)現(xiàn),如果模擬器或設(shè)備的鍵盤保護(hù)模式使得HOME畫面不可用時(shí),UI測(cè)試不能正常工作。這是因?yàn)閼?yīng)用程序不能接收sendKeys()的事件。避免這種情況最好的方式是在啟動(dòng)模擬器或設(shè)備時(shí)關(guān)閉鍵盤保護(hù)模式。

你還可以顯式地關(guān)閉鍵盤保護(hù)。這需要在manifest文件中添加一個(gè)權(quán)限,然后就能在程序中關(guān)閉鍵盤保護(hù)。注意,你必須在發(fā)布程序之前移除這個(gè),或者在發(fā)布的程序中禁用這個(gè)功能。

在<manifest>
元素下添加<uses-permission
android:name=”androd.permission.DISABLE_KEYGUARD”/>。為了關(guān)閉鍵盤保護(hù),在你測(cè)試的
Activity的onCreate()方法中添加以下代碼:

  mKeyGuardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);

  mLock = mKeyGuardManager.newKeyguardLock("activity_classname");

  mLock.disableKeyguard();

這里,activity_classname是Activity的類名。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android開機(jī)自啟動(dòng)程序設(shè)置及控制方法
Android 四大組件 簡介
Intent Android 詳解
Android文檔閱讀02—解析Android程序
android生命周期
Android 應(yīng)用點(diǎn)擊圖標(biāo)到Activity界面顯示的過程分析
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服