ATX 安卓设备集群管理 atx-server

codeskyblue · 发布于 2018年01月07日 · 最后由 codeskyblue 回复于 2018年01月15日 · 2001 次阅读
本帖已被设为精华帖!

背景介绍

众所周知,安卓单台设备的UI自动化测试已经比较完善了,有数不清的自动化框架或者工具。但是介绍多设备管理的内容并不多,当手里的手机多了之后,要做自动化测试平台,这块的东西又不得不碰。我是一位比较喜欢实践的人,和同事在一起开发过简单的多设备管理系统,也用过开源的,后来又自己开发过。前前后后大概经历了4个不同的版本。

  • 第一个版本是是将adb的服务封装成HTTP接口,可以调用adb forward,install,并且利用screencap和input keyevent这些基本命令实现了一个简单的远程控制界面(速度很慢,但是基本能用)。为了解决截图慢的问题,我还买过两个摄像头。
  • 第二版版本是直接改造的openstf,本来第一个版本还在开发中,突然有同事对我说:“哎,你有没有见过这个项目呀openstf,好像跟你们最近开发的项目挺像的”,还发了一个链接过来。我当时就看了不超过10分钟,我就决定把第一个版本给废掉了。然后花了两个星期的时间把openstf的每一行代码都读了一遍(实际时间更长,因为读了很多遍)。后来在openstf上也加了不少功能,翻翻openstf的pr历史,也可以看到很多我的提交。这个项目教会了我很多,让我重新认识了nodejs,让我了解了rethinkdb
  • 第三个版本出来的很意外,原来是试试看的项目,就是用Go语言重写openstf,写了一个多星期,发现改造起来也不是很难嘛,而且还让openstf的架构变简单了很多(openstf的搭建比较头疼),之后内部组织重组,各种变动,从最开始最多5个人开发,到现在又是我一个人开发,实在应了那句话“计划赶不上变化”。人多的时候架子铺的太大,坑挖的有点多,代码维护起来也很累,过了一段时间实在不想管这个项目了。
  • 第四个版本:虽然我不想管第三个版本了,但是多设备管理的需求还是没消失,还是要硬着头皮维护下去。某个清空万里的好日子,突然灵机一动,把atx-agent给写了出来。这才意思到,就算没有数据线,就算没有adb,也是可以做设备自动化的嘛。关于atx-agent的介绍在杭州第三期沙龙分享过一次。基于atx-agent带来的无线连接技术,设备管理平台的硬件管理一下子就方便了好多好多,再也不用弄那些树莓派了,拉网线,还要烧代码provider代码的sd卡了。现在只要给保证手机是有电的就OK。软件层面实现一个atx-server管理一下众多的atx-agent就足够了。然后把openstf中的minicap和minitouch整合进atx-agent里面,远程控制功能就也有了。UI自动化则是使用了基于atx-agent的python uiautomator2,虽没有appium这么庞大和NB,但是麻雀虽小五脏俱全,只要你会python,各种UI自动化都能搞定。

基本架构图

             +--------------+
             |              |
             |  atx-server  |
             |              |
             +--+-------+--++
                |       |  |
                |       |  +--------------------------+
            +---+       +-------+                     |
            |                   |                     |
            |                   |                     |
+-----------v----+       +------v---------+       +---v------------+
| Android        |       | Android        |       | Android        |
|                |       |                |       |                |
|      +---------+       |      +---------+       |      +---------+
|      |atx-agent|       |      |atx-agent|       |      |atx-agent|
|      |         |       |      |         |       |      |         |
+------+---------+       +------+---------+       +------+---------+

atx-agent运行在手机的内部,为手机增加了远程控制,自动化的功能。atx-server最重要的功能,是将atx-agent汇总到一个网页上展示,并提供一个API可以获取所有设备的列表。

点击设备最右侧的那个眼睛图标,就可以进入远程控制界面。功能比较简单,但是基本功能够用了。

目前只试过80台设备,更多的设备应该也不成问题,不知道上限是多少,手机多的可以帮我测试下。

关于UI自动化, uiautomator2这个项目只需要知道设备的ip就可以运行自动化了,包括安装运行,推送文件,各种功能都有。在这个项目之上外加一个Jenkins之类的运行脚本的服务,稍加处理就是一个自动化测试平台了。美滋滋

辛辛苦苦终于写完了,希望看文章的人多思考思考,笔者非常期待思维的碰撞,欢迎留言。

项目地址: https://github.com/openatx/atx-server

附上cynic的实践文章:atx 安卓集群管理 安装运行及自动化的实践

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 38 条回复
14281

手动点赞

605

赞呀!后面抽空试用下~

9260

相当赞

605 chenhengjie123 将本帖设为了精华贴 01月08日 07:32
5512

NB,在上家公司OPENSTF我都还没看完代码就匆匆的离职了。能读完STF的所有代码收获肯定不少吧。

6853
55120x88 回复

是呀,刷新了我的代码观

6678

厉害了

2183

厉害了我的哥

114

厉害了...回头马上试用一下。

2da7c7

回头学习下,给大佬点赞👏

7313

厉害了,我的哥!

104

我最近也在想让AppCrawler绕过appium直接支持你的atx-server。目前的需求还是以设备管理为主,把adb做成service就可以了。这样架构就可以简单了。基于这个基础,甚至都可以搞个众测设备的公有云服务了

6853
104seveniruby 回复

如果需要接入用户的设备的话还需要弄个隧道代理

104
6853codeskyblue 回复

是的,我想个社区的移动设备共享平台,各家公司共享富余的设备

6853
104seveniruby 回复

需要把交易系统弄好才行,还有网络的优化。现在这个系统就只支持局域网的

6853

哈哈,我又有时间折腾了

2699ae
6853codeskyblue 回复

好想跟着大佬一块折腾

6853
2699aellliuyx 回复

可以提pr 我给你review

2699ae
6853codeskyblue 回复

先熟悉一下你的代码,现在工作的工作都没有用到呢 就一年前研究过xiaocong 的uiautomator

7575

```Fetching https://golang.org/x/net/context?go-get=1
https fetch failed: Get https://golang.org/x/net/context?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

我翻墙和不翻墙都下载不下来,不知道咋回事
6233

agent 是个app吗?怎么启动?

14281 cynic atx 安卓集群管理 安装运行及自动化的实践 中提及了此贴 01月10日 15:31
6853
7575jphtmt 回复

翻墙就可以,你这个是翻墙没成功。@dongdong, agent是一个二进制程序

7575
6853codeskyblue 回复

我都能上google啊,这还不算翻墙成功?

6853
7575jphtmt 回复

命令行翻墙需要配置一下 HTTP_PROXY

7575
6853codeskyblue 回复

已经搞定,但是有个问题,我现在有多个设备,然后选择一台设备进行锁屏或者解锁操作时,其他设备也会有反应

6853
7575jphtmt 回复

左侧的选择框代表的是设备是否可用来测试的状态

7575


我选择了第三个,进行解锁操作,然后第二个设备解锁了,第三个没解锁

6916

手动点赞👍

2106

手动点赞👏 👍

6233
6853codeskyblue 回复

我是说这个agent 第一次 启动怎么做?usb 命令行?

Dd68af

已使用,超赞👍 请大神收下我的膝盖

6853
6233dongdong 回复

adb shell

Bd53ca

执行go get -v github.com/openatx/atx-server的过程中一直有下面的提示:
go\src\github.com\openatx\atx-server\database.go:12:2: no Go files in C:\Users\用户名\go\src\gopkg.in\gorethink\gorethink.v4

单独去go get只能取到gorethink.v3;go get v4的话会提示:
can't load package: package gopkg.in/gorethink/gorethink.v4: no Go files in C:\Users\用户名\go\src\gopkg.in\gorethink\gorethink.v4

1975

@codeskyblue 请问为啥我的远程控制界面是一直都是灰的

6853
1975woshizh 回复

可以打开开发者选项看看有什么日志不,不过总会有部分手机不支持的

1975
6853codeskyblue 回复

手机是红米4,版本是MIUI9.2,安卓版本是6.0.1,用的浏览器是ubuntu 16.04的firefox。开了好像没什么日志,logcat的这个不知道有没有用
1 EsService2 W loaded /system/lib/egl/libEGL_adreno200.so
1 EsService2 W loaded /system/lib/egl/libEGL_adreno200.so
2000 EsService I readResults: read results: 32, lastRequestId: 330
2000 I Kgd.KeyguardUpdateMonitor: mTimeTickBroadcastReceiver current state is mBootCompleted=true mDeviceProvisioned=true mPhoneState=0 Keyguard.isShowing = false Keyguard.isOccluded = false mScreenOn=true
2000 libEGL D loaded /system/lib/egl/libEGL_adreno200.so

10666

已经使用,感谢大佬的分享,不过在使用的过程中,发现web端的手机屏幕截图刷新很慢哦

6853
10666harmo 回复

 很快就更新了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册