開源雲真機平台-Sonic應用實踐

語言: CN / TW / HK

前言

Sonic是一款開源、支持分佈式部署、在線自動化測試的私有云真機平台。偶然接觸到這個平台是源於蟲師的一篇公眾號文章《​ ​基於Linux 部署 Sonic​ ​》,於是結合文章內容和官網嘗試搭建了一套,並試用了一番,直到現在也一直在用。後來陸續也加了作者的微信號、粉絲羣,對於部署和使用過程中的一些問題和建議,作者和粉絲羣中的小夥伴都能及時給予解答,整體體驗很不錯,遂決定寫一篇總結分享。

一、雲真機平台

1.雲真機平台對比

目前市面上常見的雲真機平台有兩種,一種是各大服務商如阿里、騰訊、百度推出的公共雲真機平台,如:WeTest、EMAS,除了收費高點其他好像沒什麼缺點;一種是網上各種開源雲真機平台,支持私有化部署,如:Sonic、STF,這類平台的特點是免費、支持二次開發,缺點是功能支持相對薄弱(如自動化、性能)、真機採購成本高(當然,這並不是平台的缺點,如果你司有足夠的測試機資源的話,而且也不是每個企業都有全面的兼容性測試需求,你也可以選擇接入少量真機)。

公共

私有

平台

testin雲測、Testbird、騰訊的WeTest、優測、阿里的EMAS、百度MTC

Sonic、ATX-Server2、STF

特點

面向各大企業或個人

私有化部署、面向企業內部

優點

機型覆蓋全,功能豐富,如:APP性能監控、自動化測試

開源、免費

缺點

收費高

自建成本高,尤其是真機採購費用

2.雲真機平台能夠解決的問題

  • 兼容性測試:需接入一定數量、具有代表性的測試機資源;
  • 自動化測試:平台本身自帶自動化測試能力,也可以自己寫代碼、連接真機運行測試;
  • 測試機資源緊張:雲真機平台都秉承着用完即走的設計理念,因此使用完退出後,下一個登錄用户可以接着使用,一定程度上能夠解決研發團隊內測試機資源緊張的問題;
  • 遠程演示:如驗收測試或是客户演示過程中,手機和電腦無法實時投屏在同一個顯示器或電視等外接設備,這是隻需要在已投屏的電腦上登錄遠程真機地址即可實時訪問,方便同步觀看;
  • 測試數據共享不便問題:測試過程中,有時需要在一個歷史版本上驗證回溯問題,雲真機可以安裝歷史版本的APP,並提前預置好測試數據,以便共享使用;

二、sonic介紹

1.關於Sonic

Sonic,一站式開源分佈式集羣雲真機測試平台,致力服務於中小企業的客户端UI測試。 Sonic當前的願景是能幫助中小型企業解決在客户端自動化或遠控方面缺少工具和測試手段的問題。

官網:​ ​http://sonic-cloud.gitee.io/#/Home​

github: ​ ​http://github.com/SonicCloudOrg​

Testhome:​ ​http://testerhome.com/opensource_projects/sonic​

2.功能特性

3.Sonic架構

架構介紹:​ ​http://testerhome.com/opensource_projects/sonic​

三、Sonic環境搭建(docker-compose)

1.前置環境準備

硬件環境主要就是手機和Linux服務器一台(CentOS或Ubuntu均可,以下部署以CentOS系統為例),這個沒什麼好説的,主要説一下軟件環境,Linux需安裝:

  • Docker、docker-compose:網上有很多教程,可以自行搜索安裝,在此不過多贅述;
  • MySQL:可以接入現有的同一內網環境下的MySQL,也可以使用Docker快速安裝部署:
docker run -it -d -e MYSQL_ROOT_PASSWORD=123456 --name=mymysql -p 3307:3306 mysql

2.下載依賴文件

部署文檔:​ ​http://sonic-cloud.gitee.io/#/Deploy​

wget http://github.com/SonicCloudOrg/sonic-server-simple/archive/refs/tags/v1.3.2-release.tar.gz    # 下載壓縮包
tar -zxvf v1.3.2-release.tar.gz   # 解壓後會得到docker-compose.yml  LICENSE  pom.xml  README_CN.md  README.md  src

3.編輯配置文件

vi docker-compose.yml,可以對照如下內容進行修改:

version: '3'
services:
  sonic-server-simple:
    image: "sonicorg/sonic-server-simple:v1.3.2-release"
    environment:
      # 以下為MySql配置,localhost請替換為自己MySql服務的ipv4地址
      - MYSQL_HOST=192.168.1.122  # MySQL主機地址
      - MYSQL_PORT=3308  # MySQL端口號
      - MYSQL_DATABASE=sonic  # MySQL為sonic單獨創建一個數據庫-sonic
      - MYSQL_USERNAME=root  # MySQL登錄用户名
      - MYSQL_PASSWORD=123456  # MySQL登錄密碼
      # 在服務器部署的話,localhost改為服務器ip
      # port更改為sonic-server-simple暴露的port(一般不變)
      - SONIC_API_HOST=192.168.1.122
      - SONIC_API_PORT=8094
      - SONIC_NETTY_PORT=8095
      # token加密的key值
      - SECRET_KEY=sonic
      # 身份驗證token有效天數
      - EXPIRE_DAY=150
      # 前端頁面訪問地址,不填默認為http://localhost:3000
      - CLIENT_HOST=http://192.168.1.122:3000
      # 文件保留天數(指測試過程產生的文件,包括圖片、錄像等等)
      - FILE_KEEP_DAY=60
      # 測試結果保留天數
      - RESULT_KEEP_DAY=60
      # 以下均為Cron表達式
      # 清理文件定時任務
      - FILE_CRON=0 0 12 * * ?
      # 清理測試結果定時任務
      - RESULT_CRON=0 0 12 * * ?
      # 發送日報定時任務
      - DAY_CRON=0 0 10 * * ?
      # 發送週報定時任務
      - WEEK_CRON=0 0 10 ? * Mon
    networks:
      - sonic-network
    # 數據卷
    volumes:
      - files:/keepFiles/
      - files:/imageFiles/
      - files:/recordFiles/
      - files:/packageFiles/
      - files:/logs/
    # 端口映射
    ports:
      - "8094:8094"
      - "8095:8095"
  sonic-client-web:
    image: "sonicorg/sonic-client-web:v1.3.2-release"
    environment:
      #192.168.1.1改為你的ipv4,port更改為sonic-server-simple暴露的port(一般不變)
      - SONIC_API_HOST=192.168.1.122
      - SONIC_API_PORT=8094
    networks:
      - sonic-network
    # 端口映射
    ports:
      - "3000:80"

volumes:
  files:

networks:
  sonic-network:
    driver: bridge

4.啟動容器

docker-compose up -d

執行上述命令會按照先後順序自動執行以下過程:

  1. 先拉取鏡像
  2. 創建容器
  3. 啟動容器

通過上圖可以看出sonic自動創建了兩個容器:

  • sonic-server-simple-132-release_sonic-client-web_1:前端相關容器
  • sonic-server-simple-132-release_sonic-server-simple_1:服務端相關容器

四、創建Sonic項目

1.註冊賬號

前台訪問地址:​ ​http://192.168.1.122:3000/​

2.創建項目

填寫項目信息

3.創建agent

填寫agent名稱即可自動創建agent,下圖為agent詳情,記住AgentKey,後續部署sonic agent的時候會用到

五、部署Agent

1.下載agent相關資源

wget http://github.com/SonicCloudOrg/sonic-agent/releases/download/v1.3.2-release/docker-compose.yml

2.修改配置文件

編譯sonic-agent的配置文件docker-compose.yml

version: '3'
services:
  sonic-agent:
    #下方為Docker Hub鏡像,推薦海外用户使用,默認使用國內加速鏡像
#    image: "sonicorg/sonic-agent-linux:v1.3.2-release"
    image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-agent-linux:v1.3.2-release"
    environment:
      # 替換為部署Agent機器的ipv4
      - AGENT_HOST=192.168.1.122
      # 替換為Agent服務的端口,可以自行更改
      - AGENT_PORT=7777
      # 替換為前面新增Agent生成的key
      - AGENT_KEY=828aa5a4-ce30-4ebb-9f9b-5a01bbe5ea5e
      # 後端的host
      - SERVER_HOST=192.168.1.122
      # 這個port改成後端文件中心的port(一般不變)
      - SERVER_FOLDER_PORT=8094
      # 這個port改成後端傳輸中心的port(一般不變)
      - SERVER_TRANSPORT_PORT=8095
      # 是否使用安卓模塊
      - ANDROID_ENABLE=true
      # 是否開啟遠程adb調試功能
      - USE_ADBKIT=true
      # 是否使用iOS模塊
      - IOS_ENABLE=true
      # 替換為你自己使用的wda的bundleId,如果沒有.xctrunner後綴會自動補全,建議使用公司的開發者證書
      - WDA_BUNDLE_ID=com.facebook.WebDriverAgentRunner.xctrunner
      # 是否啟用Appium
      - APPIUM_ENABLE=true
      # 默認為0會自動尋找隨機端口啟動,如果需要指定appium server端口,請在這裏設置
      - APPIUM_PORT=0
      # 是否啟用webview調試功能
      - WEBVIEW_ENABLE=true
      # 谷歌調試端口,一般不需要修改(默認0使用隨機端口,如果需要開啟防火牆給外部使用,請設置固定端口如7778)
      - CHROME_DRIVER_PORT=0
    network_mode: "host"
    privileged: true
    # 數據卷
    volumes:
      - /dev/bus/usb:/dev/bus/usb
      - /var/run/usbmuxd:/var/run/usbmuxd

3.啟動容器

docker-compose up -d

同前面部署sonic一樣,執行上述命令部署agent,會按照先後順序自動執行以下過程:

  1. 先拉取鏡像
  2. 創建容器
  3. 啟動容器

4.查看容器相關信息

docker ps -a | grep sonic

通過上圖可以看出:

  • sonic一共3個相關容器,分別為agent相關容器、前端相關容器、服務端相關容器;
  • 前端訪問的80端口被映射到了3000端口,與docker-compose.yml中配置的一致;
  • 後端服務相關的8094、8095分別映射8094、8095,與docker-compose.yml中配置的一致;

六、Sonic使用

1.接入設備

以Android設備為例,Android設備需開啟USB調試權限,並在插入服務器主機後、手機頁面彈出的“是否允許USB調試本台設備”的選項中選擇“是”。

接入設備後的頁面:

2.使用設備

首次進入設備系統會初始化設備連接,可能需要等待幾秒。

3.連接adb

同Windows電腦本地連接Android一樣,Windows也可以通過adb遠程連接sonic上的設備(進入設備頁面,遠程ADB窗口會顯示一串連接命令“adb connect 192.168.1.122:37345”)。連接完adb後,就可以當做本地設備進行自動化測試等操作了。

adb connect 192.168.1.122:37345

4.自動化測試效果

小結

1.部署感受

總體來説,部署過程比較流暢,除了sib工具、 iOS配置WebDrierAgent由於資源限制,暫未嘗試外,其他沒有遇到什麼卡住的點,對於初學者來説,需要:

  • 熟練使用Linux常用操作命令;
  • docker相關知識、docker-compose文件定義規範等;
  • MySQL相關技能,如創建用户、創建數據庫、用户賦予數據庫權限等,當然也可以藉助工具實現;

2.使用感受

無論是界面體驗、流暢度、還是UI自動化測試功能,都非常不錯,粉絲羣內對於反饋的問題也能及時指導解決,唯一美中不足之處就是:

  • 手機屏幕展示框首次未自適應顯示,需要左右拖動屏幕右側框條才能看到整個屏幕,也可以通過放大瀏覽器頁面比例來達到查看整個手機屏幕的目的,但此時,其他區域也同樣會被放大;

3.避坑指南

  • 推薦使用Chrome瀏覽器,切勿使用火狐瀏覽器;
  • 需在手機系統設置-輸入法設置中,關閉安全鍵盤,否則會在調起鍵盤、輸入字符時黑屏或無法輸入;
  • 如果進入手機頁面,顯示準備圖像中,但手機端沒安裝sonic助手之類的APP,可以嘗試重啟agent容器、再重新插拔手機;
  • 如果是小米手機連接,需要關閉MIUI優化;
  • 目前在遠程連接鴻蒙系統設備、執行uiautomator2自動化腳本過程中會報錯“GatewayError”(剛開始初始化設備連接、啟動APP時有反應,隨後報錯,關閉純淨模式仍存在);

更多測試開發實戰乾貨,歡迎掃碼關注,一起交流、學習!