利用Selenium Grid + Appium 來執行 Android 分散式測試
前言
在web或app開發,若是有導入自動化測試的設置時,有時候可能會需要利用各種裝置或者軟體來進行自動化測試,
像是app開發也許就會需要到不同作業系統版本的裝置 (Ex: Android 9、Android 10...),
又或者需要用到不同版本的Webview來進行測試,
所以我們也可以利用 Selenium Grid 結合 appium 來進行分散式測試,並且方便管理我們現有的測試裝置。
本次會使用到的工具有:
1. Selenium Server (Grid) (Ver. 3.14)
2. Appium Desktop
3. Genymotion
4. node.js
1.啟動Selenium Server Grid (Hub)
由於Appium本身可以結合Selenium Grid的使用,因此我們可以將利用Selenium擔任Hub提供後續Appium Server來註冊,
所以我們先使用command 執行 java -jar selenium-server-standalone-<< Version >>.jar -role hub 來啟動
在啟動後我們可以看到訊息中有顯示,
node必須於 http://192.168.99.1:4444/grid/register 註冊,
以及client端需要連線至 http://192.168.99.1:4444/wd/hub
這些設置會在後面使用到,可以稍微紀錄一下。
執行後可以利用 http:// << host : port >> /grid/console 看看有沒有成功啟動
2. 將node註冊至Selenium Grid
要將appium Server及裝置註冊至Selenium Grid,會需要使用到json格式的config檔,
在Appium官方文件中也有範例可以參考
{
"capabilities":
[
{
"deviceName": "192.168.19.103:5555", # 利用adb devices 查詢的裝置資訊
"version":"9", # 裝置系統版本
"maxInstances": 1, # 最大實例數
"platform":"ANDROID" # 作業系統名稱
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://127.0.0.1:4724/wd/hub", # Appium Server 的接口位址
"host": "127.0.0.1", # Appium Server 的 Host
"port": 4724, # Appium Server 的 Port
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hub":"192.168.99.1:4444/grid/register/", # Selenium Grid 的註冊位址nt連線位址
"hubHost": "192.168.99.1", # selenium Grid 的Host
"hubPort": 4444, # selenium Grid 的Port
"hubProtocol": "http" # selenium Grid 的通訊協定
}
}
在設置文件中的deviceName是需要利用command指令來查詢與當前設備有連接的裝置資訊,
可以利用 adb devices 來查詢
在設定檔準備完成後,
我們利用文件中提到的 running from source的方式註冊appium節點至hub上,
因此需要找到Appium Desktop的main.js所在位置,
預設的安裝位置應該會在
C:\Users\<<使用者>>\AppData\Local\Programs\Appium\resources\app\node_modules\appium\build\lib\
在找到main.js的位置之後,利用command指令啟動Appium Desktop
node main.js --nodeconfig <<設定檔json所在位置>>
另外,啟動也可以利用-a 、 -p 、 -bp 、 -U 等等參數進行額外設定,其他參數可以用 node main.js --help 查詢
這裡主要會用到的有
-a Appium Server 的 host (與文件中相同即可)
-p Appium Server 的 port (與文件中相同即可)
-bp bootstrap 的監聽端口
-U Appium連結的裝置的UDID (與文件中相同即可)
--nodeconfig 註冊的json文件設定檔位置
node main.js -a 127.0.0.1 -p 4723 -bp 4725 -U 192.168.19.102:5555 --nodeconfig d:/appium/102.json
執行command指令後可以看到相關的設定資訊,並且成功註冊到grid上,也可以在grid/console上面看到註冊的裝置訊息
目前這種設定方式有個缺點是,若要設定多個裝置時,會需要利用多個json檔及appium server來進行設定及管理,
成功啟動多個裝置之後,grid的畫面上也可以看到多個設備的資訊
到這邊我們就已經將hub以及node都設置完畢了,接下來就可以利用Appium的測試腳本來進行測試,
Appium的腳本除了自行手動撰寫之外,也可以利用Appium Desktop來進行錄製。
3. 測試腳本撰寫/錄製
啟動Appium Desktop時,可以利用右上角的放大鏡 (Start inspector session) 開啟視窗
platformName : 裝置平台名稱 / 作業系統名稱
deviceName : 透過adb devices 查詢到的裝置資訊
automationName : Testing framework的名稱,這裡使用UiAutomator2
autoGrantPermissions : 自動同意系統權限
簡易設置相關的裝置資訊以及測試框架的資訊後,點選右下角的Start Session進行錄製
點選錄製按鈕之後,在右方也可以選擇Export的腳本所使用的語言,這邊使用的是JS-WD,
Export出來後的腳本大致上會長這樣
簡單的調整腳本內容,改為利用selenium grid的hub去驅動兩個裝置進行測試,並且讓腳本可以一口氣利用這兩個裝置進行測試
最後在利用node.js執行 test script,就可以看到selenium Grid (hub) 去驅動 appium server 進而呼叫測試裝置進行腳本測試
但是這個做法 Appium 雖然可以分散配置測試裝置,但是在測試過程中依然是一個一個進行,
若是想要進行併行測試的話,也可以參考appium的相關文件
Appium #parallel-android-tests
總結
在簡單透過Selenium Grid + Appium 的結合,雖然可以透過Selenium Grid的console頁面看到目前所註冊的裝置資訊,
但是在設定及config檔管理上還是相當的麻煩,
另外也有其他開發人員提到這種做法 無法自動排除故障、需要準確的設定文件及指令參數以及需要啟用多個appium server等等,
也還有許多其他的設定方式,可以讓自動化測試更加的便利,開發過程也更加的快速。