自動化測試框架對比(UIAutomator、Appium、Robotium)
一、原理
1.UiAutomator——基於UIAutomation的使用者介面自動化測試框架,可以跨應用工作,谷歌親生的。
Android4.3之前:使用inputManager或者更早的WindowsManager來注入KeyEvent
Android4.3之後:使用Accessibility APIs來注入事件。(AccessibilityService本來是做一些輔助功能的,提供了一系列的事件回撥,幫助我們指示一些使用者及介面的狀態變化,主要給殘障人群提供幫助。)
2.Robotium——基於Instrumentation開發出來的一套測試框架
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