Instrumentation類——Android自動化測試學習歷程

這裏須要把Instrumentation類的視頻的上、中、下三集一塊兒看,把內容總結一下。。。java

視頻地址:android

http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=881433&courseId=712011面試

http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=878104&courseId=712011正則表達式

http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877119&courseId=712011windows

1、引子(面試題)微信

如何在一個app中作event事件?(touch、滑動和按鍵等)app

答:框架

一、Device.touch(x,y)          //monkeyrunner的方法less

二、solo.clickOnView(String id)        //Robotium的方法eclipse

三、driver.findElement(By.name("xxx")).click()             //Selenium的方法

四、不採用任何開源或非開源的測試框架(monkeyrunner、robotium、appium、selenium、Androiddriver、uiautomator等都不準用)

此時就須要用google提供的基礎測試類Instrumentation

注:Robotium就是基於Instrumentation的二次封裝,因此理解Robotium的原理還在於Instrumentation

問題:

一、Robotium的運行原理是什麼?

答:Robotium是經過對instrumentation的注入事件(sendKeyDownUpSync、sendPointerSync)的封裝、以及經過調用instrumentation的runOnMainSync、runOnUiThread等來完成對控件的操做,讓用戶能夠直接調用一個solo.clickOnText等方法,就可以完成操做,而不用本身去寫一堆找到控件,而後再點擊觸發等方法

二、爲何Robotium的testcase須要一個setup方法和一個teardown方法

答:分析Instrumentation的原理,InstrumentationTestCase或者InstrumentationTestCase2都須要有一個setUp和tearDown方法,一個用來進行前期準備,獲取全部須要的東西,好比說主Activity,好比說獲取到全部的控件ID,而後在下面的test方法中才能用這些ID進行相應測試的操做。

根本緣由是由於:setup和teardown是junit必須執行的生命週期函數,全部的Test類都是基於這個作的,因此必需要有這兩個方法才行。

三、Robotium的AndroidManifest.xml中配置的節點<Instrumentation>又是什麼含義?不導入jnuit-report.jar包的時候,Instrumentation中配置的 android:name="android.test.InstrumentationTestRunner",若是用了這個jnuit-report.jar包以後,就須要修改Instrumenation的節點配置爲android:name="com.zutubi.android.junitreport.JUnitReportTestRunner"?

答:按照理解,這個配置的Instrumentation節點的anroid:name指的就是用以啓動的TestRuner的名,只有配置了這個以後,測試程序纔可以啓動起來,這個啓動過程應該又回到上一篇Robotium裏面記錄的那樣了,運行一個測試程序,會先運行一個系統工具Activity Manager,而後Activity Manager經過Instrumentation框架來啓動和控制TestRunner,可是你須要給Activity Manager提供TestRuner的名,就是指的這裏配置的android:name

 

Instrumentation的這個AndroidManifest.xml的標籤中的配置(該標籤位於Application標籤的外面):

<instrumentation

android:name="android.test.InstrumentationTestRunner"

android:targetPackage="xxx.xxx.xxx"/>

android:name指定TestRunner,這就是導入了一個命名空間,一個包名,就是android.test.Instrumentation,這個標籤一導入,系統就知道你要應用Instrumentation測試框架了

 

2、萬能的Instrumentation類

 First:what is Instrumentation?

答:

Instrumentation是執行Application Instrumentation代碼的基類,當應用程序運行的時候Instrumentation處於開啓(備註:須要瞭解應用程序運行以前就已經開啓哪些東西?),Instrumentation將在任何應用程序運行前初始化,能夠經過它監測系統與應用程序之間的交互。

Second:how to implement the Instrumentation?

答:

Instrumentation的實現是經過在AndroidManifext.xml中加一個<Instrumentation>的標籤,具體以下:

Third:how to understand the Instrumentation?

答:

Instrumentaion比較像Windows裏面的鉤子(Hook),在系統和應用程序之間裝了一個特殊裝置用以進行監聽

 

作自動化測試的時候用到的類是:InstrumetationTestCase類,(Instrumentation是一個測試基類,InstrumentationTestCase是一個測試框架,那麼具體Android自己官方提供的多個測試類之間是個啥樣的關係呢??

 

Robotium是對InsttumentationTestCase2的二次封裝,這個InstrumentationTestCase其實跟InstrumenatationTestCase2已經有點差異了,InstrumentationTestCase2已經對InstrumentationTestCase作了一個簡化處理,好比增長了public方法getActivity(),就能夠直接得到當前被測對象的Activity,而不用像在InstrumentationTestCase裏面那樣,經過getInstrumentation().startActivitySync(intent)方法來獲取Activity了。。。

 

3、實現touch、keyEvent等事件

一、準備安卓的環境(java環境、eclipse、環境變量配置)

二、寫一個安卓的app(被測app)

三、開始寫測試框架代碼

 測試必需要保證測試app和被測程序簽名一致,既然是本身寫的,那麼確定是用debug簽名比較方便,這樣被測代碼和測試代碼在不一樣的包中,可是在同一個工程裏,簽名確定一致;若是沒有源碼的話,也須要簽名一致,就須要進行重簽名了。

具體的代碼就是,建一個包名來建立app,而後一個待測程序創建一個包,一個測試程序創建一個包。

Instrumentation對安卓操做系統的版本沒有要求,這個是特別好的

 

demo1:實現對一個button的點擊操做

具體代碼內容詳解:

一、Intent.setClassName(packageName, MainActivity.class.getName)方法

二、startActivitySync(Intent intent)方法:

Intent是一個意圖,在安卓開發裏面能夠經過Intent.setClass,以後用this.startActivity(Intent intent)就能夠跳轉到你想要去的那個Activity

startActivitySync的這個方法,在啓動了這個APP以後,將這個Intent傳遞給他,而後它就可以給你返回當前的MainActivity

三、Junit4的assertEquals和robotium的searchText

assertEquals方法須要輸入expected string和actual string,而後二者進行比較,返回是否相等,用此來作校驗;

serchText方法是將全部的TextView所有找到,放到一個集合中,而後去作對比(經過正則表達式)

 

Instrumentation是怎麼跟robotium對應上的???其實直接看InstrumenetationTestCase2,會更加清晰,因此Robotium是須要extends InstrumentationTestCase2的。其實東西都是同樣的,就是你要知道包名,而後知道類名,而後經過這個類名去findViewById來獲取到你須要的控件ID,以後調用方法對這個控件進行操做(包括sendPointSync等注入事件、runOnMainSync、runOnUiThread方法等來操做控件),以後根據當前控件的狀態,與你預期想要的狀態作一個對比,就能夠知道是否達到了想到的結果。另外,還須要在AndroidManifest.xml中進行<Instrumentation>節點的配置,用以告訴ActivityManager要用什麼TestRunner。

 

demo2和demo3: 

instrumentation.sendKeyDownUPSync詳解

sendPointerSync方法(可以產生手指操做控件的響應效果)

MotionEvent

一個Error的處理:java.lang.SecurityException:Injecting to another application requires INJECT_EVENT permission

解決方案:直接在AndroidManifest.xml中進行配置,若是出現相似的這種涉及到perssion的問題,也是相似,直接在Manifest.xml中配置便可,應該都能解決。

 

4、Instrumentation類API基礎

一、callActivityOnCreate(Activity activity, Bundle icicle)

說明:Perform calling of an activity's onCreate(Bundle) method

一個activity的onCreate(Bundle savedInstanceState)方法,這個Bundle對象是用來存儲Activity的狀態,好比Activity被stop但不是destory時,這個對象就用上了,以後再resume回來時,就要用到這個Bundle對象來恢復以前的狀態,比較像遞歸裏面的堆棧信息的存儲

二、getContext()

說明:獲得上下文的一個引用,就能夠進一步獲得view、windows、控件

三、startActivitySync()

說明:以同步方式start一個Activity,即這是一個阻塞性的方法,必需要start起這個Activity以後,返回告終果,而後程序才能繼續往下走

所謂同步:就是發出一個請求後什麼事都不作,一直等待請求返回後纔會繼續作事;

所謂異步:就是發出請求後繼續去作其餘事,這個請求處理完成後會通知你,這時候就能夠處理這個迴應了。

四、sendKeyDownUpSync(int key)

downup的點擊事件,經過對一些系統按鍵的操做來完成。好比KeyEvent.KEYCODE_MENU、KeyEvent.KEYCODE_HOME等

五、sendPointerSync(MotionEvent event)

發送一個具體的點觸事件,MotionEvent有obtain方法,能夠針對具體的Down或者UP事件進行操做,在某一個特定的座標位置,經過這個可以看到測試case時,程序上會出現被點擊選中的陰影效果,而直接調用button.performClick()方法是沒有這個效果的。

金陽光測試

新浪微博:金陽光woody

         

          網站地址

一、百度搜:金陽光測試

二、官網:www.goldensunshine.cc

 

 

微信公衆號

相關文章
相關標籤/搜索