開源雲真機平臺-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當前的願景是能幫助中小型企業解決在客戶端自動化或遠控方面缺少工具和測試手段的問題。

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

github: ​ ​https://github.com/SonicCloudOrg​

Testhome:​ ​https://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.下載依賴檔案

部署文件:​ ​https://sonic-cloud.gitee.io/#/Deploy​

wget https://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 https://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時有反應,隨後報錯,關閉純淨模式仍存在);

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