前言

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时有反应,随后报错,关闭纯净模式仍存在);

更多测试开发实战干货,欢迎扫码关注,一起交流、学习!

开源云真机平台-Sonic应用实践的更多相关文章

  1. 《开源安全运维平台OSSIM最佳实践》

    <开源安全运维平台OSSIM最佳实践> 经多年潜心研究开源技术,历时三年创作的<开源安全运维平台OSSIM最佳实践>一书即将出版.该书用80多万字记录了,作者10多年的IT行业 ...

  2. Hi,WeTest限免开放Android Oreo云真机,Android 8.1可开测!

    2017年末,谷歌在印度正式发布 Android Oreo 8.1,向实现"为所有人打造由 AI 驱动的全覆盖移动平台"这一愿景迈进.Android 8.1在引入对 Android ...

  3. 云真机兼容性自动化工具测试解决方案_www.alltesting.cn

    问题和背景 不同类型的品牌和硬件环境.不同版本的android操作系统.IO操作系统,以及不同的分辨率,造成相同的APP在不同的设备可能存在缺陷. 兼容性测试,就是让APP.小程序.H5程序,在所有的 ...

  4. 真香!iOS云真机全新上线!

    WeTest 导读 众多开发者已经渐渐适应通过调用线上的安卓真机进行远程调试,但是针对iOS设备,则依然存在“iOS设备昂贵”“无法及时采购iOS最新设备”“无法复现iOS历史系统版本”等问题. 为了 ...

  5. WeTest功能优化第3期:业内首创,有声音的云真机

    第3期功能优化目录 [云真机远程调试]音频同步传输实现测试有声 [兼容性测试报告]新增视频助力动态定位问题 [云真机远程调试]菜单栏优化助力机型选择 本期介绍的新功能,秉承创造用户需求的理念,在云真机 ...

  6. WeTest功能优化第1期:截图960px,云真机映射功能了解

    第1期功能优化目录 [全线产品测试截图优化]安卓机型测试截图分辨率上升至960px [云真机新增Android 9]最新安卓系统,等你pick [云真机新增键盘映射功能]电脑键盘码字,云真机同步显示  ...

  7. 宜信开源|微服务任务调度平台SIA-TASK入手实践

    引言 最近宜信开源微服务任务调度平台SIA-TASK,SIA-TASK属于分布式的任务调度平台,使用起来简单方便,非常容易入手,部署搭建好SIA-TASK任务调度平台之后,编写TASK后配置JOB进行 ...

  8. Android+Chrome 真机调试H5页面实践

    前言 使用weinre在真机上调试H5页面,有一个突出的缺点,就是无法调试真机上的样式,真机上页面动态创建的dom在weinre的Elements面板显示不出来,所以调试真机上的页面样式也就无从谈起. ...

  9. 终极套娃 2.0|云原生 PaaS 平台的可观测性实践分享

    某个周一上午,小涛像往常一样泡上一杯热咖啡 ️,准备打开项目协同开始新一天的工作,突然隔壁的小文喊道:"快看,用户支持群里炸锅了 -" 用户 A:"Git 服务有点问题, ...

随机推荐

  1. 论文解读(AGE)《Adaptive Graph Encoder for Attributed Graph Embedding》

    论文信息 论文标题:Adaptive Graph Encoder for Attributed Graph Embedding论文作者:Gayan K. Kulatilleke, Marius Por ...

  2. 2.26NK周赛

    这场打的很烂,说明我对组合数学的掌握(二项式定理,以及递推式的思考方向)都不太好.而且,我做题的思路也很有问题.就是完全凭借灵感,自己没有脑子一样思路就被题目带跑了,根本跳不出来,看到题目也不会分析, ...

  3. Redis - 读写模式 - 缓存一致性

    Cache Aside Pattern(旁路缓存模式) 读:从cache中读取数据,若读取到则直接返回:cache中不存在则去database中读取,然后更新到cache. 写:先更新database ...

  4. element-ui table组件使用v-if时的问题

    element-ui项目中经常遇到需要使用v-if指令来根据情况动态显示隐藏某些列情况,这时就会出现滚动条样式异常.列错乱.列宽错乱等问题 解决办法:在el-table上添加:key="Ma ...

  5. MAUI模板项目闪退问题

    MAUI模板项目闪退问题 在MAUI最初发布的时候就曾创建过几个模板项目进行体验过,没遇到什么坑.由于最近需要开发针对餐饮行业的收银机(安卓系统)开发一款应用,这种收银机一般配置不咋滴,系统版本和性能 ...

  6. 【Redis】哨兵初始化和主观下线

    在的redis启动函数main(server.c文件)中,对哨兵模式进行了检查,如果是哨兵模式,将调用initSentinelConfig和initSentinel进行初始化,initServer函数 ...

  7. python中 OS模块中 os.path.join() 函数用法简介

    基础用法 os.path.join() 用于拼接文件的路径,可以传入多个待拼接的路径 若各个路径之间不存在 " / ", 则其会自动为各个路径之间增加连接符 " / &q ...

  8. WPF开发随笔收录-DrawingVisual绘制高性能曲线图

    一.前言 项目中涉及到了心率监测,而且数据量达到了百万级别,通过WPF实现大数据曲线图时,尝试过最基础的Canvas来实现,但是性能堪忧,而且全部画出来也不实际.同时也尝试过找第三方的开源库,但是因为 ...

  9. SpringBoot配置多环境下的properties配置文件

    1.新建SpringBoot项目之后,再另外创建两个properties文件 2.配置详情 主文件 dev和test文件 两者只是里面的配置信息有所不同而已,比如mysql, redis, nacos ...

  10. React技巧之中断map循环

    正文从这开始~ 总览 在React中,中断map()循环: 在数组上调用slice()方法,来得到数组的一部分. 在部分数组上调用map()方法. 遍历部分数组. export default fun ...