一、原理
1.UiAutomator——基於UIAutomation的用戶界面自動化測試框架,可以跨應用工作,谷歌親生的。
UIAutomation在Android4.3發布時有了新版本,官方簡介:http://blog.csdn.net/zhubaitian/article/details/40504827。
Android4.3之前:使用inputManager或者更早的WindowsManager來注入KeyEvent
Android4.3之后:使用Accessibility APIs來注入事件。(AccessibilityService本來是做一些輔助功能的,提供了一系列的事件回調,幫助我們指示一些用戶及界面的狀態變化,主要給殘障人群提供幫助。)
2.Robotium——基於Instrumentation開發出來的一套測試框架
Instrumentation的官方簡介:http://blog.csdn.net/zhubaitian/article/details/39578915
Instrumentation可以把測試包和目標測試應用加載到同一個進程中進行。既然各個控件和測試代碼都運行在同一個進程中了,測試代碼當然就可以調用這些控件的方法了,同時修改和驗證這些控件的一些項就不在話下了。
Instrumentation的運行原理:InstrumentationTestRunner會在目標應用代碼運行之前調用onCreate方法建立一個新的線程並為這個線程添加一個消息隊列,這個線程循環處理其他線程發過來的消息事件,並與之進行交互。
跨應用:Android4.3之后Instrumentation引入了getUiAutomation接口的實例進行跨應用測試。
3.Appium——跨平台,允許采用同一套API在不同的平台(IOS,Android)上編寫測試代碼,讓測試套件在IOS和Android平台上實現代碼復用成為可能。
Appium的核心是一個暴露了REST API的網絡服務器。這個服務器接收客戶端過來的連接,監聽客戶端過來的命令,在移動設備上運行命令,然后把代表命令運行結果的HTTP響應包發送回客戶端。
二、優缺點對比
|
UiAutomator
|
Robotium
|
Appium
|
---|---|---|---|
是否支持設備無源碼測試(黑盒測試) | 是 | 是 | 是 |
能否進行跨應用測試 | 能 | 不能 | 能 |
是否是谷歌原生 | 是 | 不是 | 不是 |
支持編程語言 | Java | Java | 幾乎所有語言 |
是否有簽名一致的問題 | 否 | 是 | 否 |
是否需要解決中文輸入問題 | 是 | 否 | 是 |
建議開發團隊增加的控件信息 | Content Description | resource-id | Content Description |
是否需要API17及以上 | 是 | 否 | 否 |
Junit支持版本 | Junit4 | Junit3 | Junit3/Junit4 |
是否支持webview | 否 | 是 | 是 |
支持平台 | Android | Android | IOS |
三、補充內容——Android三種注入事件的方式
1、使用內部APIs(內部API是谷歌沒有對外開放的代碼,存在一定的風險)
通過獲得WindowManager的一個實例來訪問injectKeyEvent/injectPointerEvent這兩個事件注入方法。
在應用內可正常工作,在應用外不能正常工作(INJECT_EVENTS是需要系統權限的)。
2、使用instrumentation對象(開放的API,比內部API干凈)
通過instrumentation的一個實例來訪問injectEvent,同上面的內部APIs的方法。
所以在應用內部可以正常的工作,在應用外部不嫩正常的工作。
3、直接注入事件到設備 /dev/input/eventX
linux以系統設備的方式向用戶暴露了一套統一的事件注入接口 /dev/input/eventX(其中X代表一個整數)。我們可以直接調用。
需要rooted過的設備,如:
adb shell
su
chmod 666 /dev/input/event3