溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

android基礎(chǔ)知識12:android自動化測試06—Instrumentation 04 解析

發(fā)布時間:2020-07-20 15:52:34 來源:網(wǎng)絡(luò) 閱讀:375 作者:zhukev 欄目:移動開發(fā)

轉(zhuǎn)載處(找到不原文出處,作者請指正):http://blog.csdn.net/xianming01/article/details/7893505

已經(jīng)在Android SDK中學(xué)習(xí)了很多關(guān)于JUnit的內(nèi)容,但是感覺一直有幾個問題沒有解決(不知道大家是否有同樣的感受)JUnit的測試都自動化的,完全是不需要任何操作的,有2個問題我一直都還沒有找到答案,這2個問題如下:
       JUnit可以用來測試Android的基本組成元素:Activity、Service、Provider,那么我們?nèi)绾慰刂七@些基本元素運行的,這需要Android系統(tǒng)提供一些底層操作的接口才可以做到。
如何模擬界面操作,比如說:單擊界面上的按鈕、選擇菜單等。
       對于第二個問題,我在Cview中似乎找到了答案,Cview中提供一些界面操作的函數(shù),例如:performClick(),看來Android SDK還是提供了一些這方面的函數(shù)來模擬各種操作。對于第一個問題,本篇對這個問題幅詳細(xì)說明下。

        首先我們先想下,如果要實現(xiàn)對Activity的測試需要些什么?首先需要創(chuàng)建Activity(這個Android SDK中已經(jīng)提供了),然后可以控制Activity的生命周期,這些是最基本的。在Android SDK中說明過Activity的創(chuàng)建是異步的,也就是說當(dāng)我們調(diào)用startActivty()后,這個函數(shù)立刻返回,而不是等待Activity創(chuàng)建好后才返回,這就需要一些同步方面的操作。將前面的概括起來就是2個方面:控制Activity的生命周期與同步方面的問題。Android SDK為我們提供了 instrument,在android.test包中InstrumentationTestCase 類有個函數(shù)getInstrumentation()以及通過adb shell am instrument啟動測試?yán)拥姆椒ㄖ?,都提到了instrument,下面就對instrumentation詳細(xì)說明。

什么是Instrumentation?

        Instrumentation是執(zhí)行application instrumentation代碼的基類。當(dāng)應(yīng)用程序運行的時候instrumentation處于開啟,Instrumentation將在任何應(yīng)用程序運行前初始化,可以通過它監(jiān)測系統(tǒng)與應(yīng)用程序之間的交互。Instrumentation implementation通過的AndroidManifest.xml中的<instrumentation>標(biāo)簽進(jìn)行描述。
       Instrumentation似乎有些類似與window中的“鉤子(Hook)函數(shù)”,在系統(tǒng)與應(yīng)用程序之間安裝了個“竊聽器”。

android.app包中Instrumentation類結(jié)構(gòu),如下圖所示

android基礎(chǔ)知識12:android自動化測試06—Instrumentation 04 解析

其包含有2個內(nèi)部類:ActivityMoniter、ActivityResult

  • ActivityMoniter:有關(guān)特定的Intent的監(jiān)視。一個ActivityMoniter類的實例通過函數(shù)addMonitor(Instrumentation.ActivityMonitor)添加到當(dāng)前instrumentation中,一旦添加后,每當(dāng)啟動一個新的Activity,ActivityMoniter就會檢測,如果匹配,其hit count計數(shù)更新等其他操作。 一個ActivityMonitor也可以用來尋找一個Activity,通過waitForActivity()方法,這個函數(shù)將返直到匹配的活動被創(chuàng)建。
  • ActivityResult:一個活動執(zhí)行的結(jié)果說明,返回到原來的活動。

然后我們看下Instrumentation類的函數(shù),列舉其主要函數(shù)如下:

  • 添加、刪除ActivityMoniter;

android基礎(chǔ)知識12:android自動化測試06—Instrumentation 04 解析

  • Application、Activity的創(chuàng)建與生命周期的控制;

android基礎(chǔ)知識12:android自動化測試06—Instrumentation 04 解析

  • 控制Instrumentation的運行;

android基礎(chǔ)知識12:android自動化測試06—Instrumentation 04 解析

  • 發(fā)送按鍵、滾動球等事件消息到當(dāng)前窗口;

android基礎(chǔ)知識12:android自動化測試06—Instrumentation 04 解析

  • 同步方面的操作;
  1. 創(chuàng)建一個Activity直到Activity開始運行;
  2. 在主線程中執(zhí)行一個調(diào)用,主線程被阻滯直到調(diào)用結(jié)束 ;
  3. 當(dāng)主線程空閑的時候(沒有消息等待處理)執(zhí)行一個調(diào)用;
  4. 同步等待主線程處于空閑期

android基礎(chǔ)知識12:android自動化測試06—Instrumentation 04 解析

        看了這些,我們在結(jié)合前面說的2個方面:制Activity的生命周期與同步方面的問題,在Instrumentation類中都實現(xiàn)了,尤其是些同步操作方面的。
Instrumentation簡單使用的例子

[java] view plaincopy
  1. public class HelloTest extends InstrumentationTestCase  
  2. {  
  3. Hello mActivityTested;  
  4. public HelloTest() {}  
  5. //@Override  
  6. protected void setUp() throws Exception  
  7. {  
  8. super.setUp();  
  9. Intent intent = new Intent();  
  10. intent.setClassName(“com.xmobileapp.hello”, Hello.class.getName());  
  11. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  12. mActivityTested = (Hello) getInstrumentation().startActivitySync(intent);  
  13. }  
  14. //@Override  
  15. protected void tearDown() throws Exception  
  16. {  
  17. mActivityTested.finish();  
  18. super.tearDown();  
  19. }  
  20. }  
         在這里我們使用InstrumentationTestCase類的getInstrumentation()函數(shù)獲取Instrumentation對象,通過Instrumentation的startActivitySync()函數(shù)啟動一個Activity,直到Avtivity啟動后返回。

AndroidManifest.xml中的<instrumentation>標(biāo)簽說明

打開AndroidManifest.xml文件后,將會看到AndroidManifest.xml編輯工具,通過這個工具我們可以很方面的在AndroidManifest.xml添加元素

android基礎(chǔ)知識12:android自動化測試06—Instrumentation 04 解析

選擇Instrumentation面板后,我們就可以編輯Instrumentation標(biāo)簽了,界面如何操作在這里就不說明了,主要說明屬性值的意義:

android基礎(chǔ)知識12:android自動化測試06—Instrumentation 04 解析

總結(jié)說明
         學(xué)習(xí)完了Instrumentation,心中的很多問題都沒有了,還需要到Android SDK中去深入的學(xué)習(xí)這個類,才能更好的測試Activity對象。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI