ATX WiFi 无线拉起执行 APP 稳定性 / 压力测试,免 USB 连线

AppetizerIO for AppetizerIO · 2018年12月07日 · 最后由 轩天 回复于 2022年02月11日 · 10144 次阅读
本帖已被设为精华帖!

在不插 USB 的情况下对设备远程操作/启动测试任务一直是一个非常有用的功能,因为公司里的测试设备总是分散的,而且一堆 USB 线连测试设备总是非常麻烦。ATX 项目组提供的 uiautomator2 借助了一系列的工具,使得能够用 Python 编写自动化脚本,同时可以脚本可以通过 WiFi 直接操控同 WiFi 下的设备。另一方面 Maxim 提供了一个非常稳定而且高效的 UI 全自动话压力/稳定性/遍历测试。两者如果能结合,效果可观。作为同时两个项目的贡献者,分享调和两者的成果以及方案。

背景介绍

uiautomator2 有如下组件:

  • PC 端运行的 Python 框架库 uiautomator2,写自动化脚本用的,通过 HTTP(同网段 WiFi)请求让设备端实际执行自动化操作
  • 设备端 atx-agent,一个用 Go 开发的 ARM 程序,运行在设备上,进程是 adb shell 权限,守护其他所有设备端的相关服务进程
  • 设备端 android-uiautomator-server,fork 自 xiaocong,运行在设备上,通过am instrument启动的一个安卓进程,拥有 adb shell 权限,长连系统的 AccessibilityService,并负责自动化操作(基于 selector 的点击、按钮、输入等);因为是 adb shell 权限,所以才得以可以操作其他 APP(待测 APP)
  • 设备端 minicap(可选),来自 openstf,通过 websocket 协议提供设备实时的屏幕图像
  • 设备端 minitouch(可选),来自 openstf,通过 websocket 可以实时向 Android 注入屏幕触屏事件(支持复杂路径,多点触摸等)

设备端大管家是 atx-agent,必须有 adb shell 运行权限,保活其他三个,同时是设备端 HTTP 服务器入口,负责路由 HTTP 请求给另外三个部件

Maxim 有两个组件framework.jarmonkey.jar,都是设备端的,其中framework.jar是一个定制的 AccessibilityService,而monkey.jar大改自 Google 原生 monkey,实现遍历逻辑等。一般通过 adb shell 命令行启动,必须有 adb shell(同 android-uiautomator-server,这样才能操作其他 APP),可以脱机运行(类似 nohup),即启动后可以关掉命令行进程不会被杀直到运行完成。

结合方案设计

矛盾点: uiautomator2 和 Maxim 工作时都需要连接系统的 AccessibilityService,而 AccessibilityService 只能单连接;所以启动了 uiautomator2 才有免 USB 操作的能力,但是占用了 AccessibilityService,如果通过 uiautomator2 启动 Maxim 会挂。

经过研究,android-uiautomator-server 只是 uiautomator2 中与 selector,click 等相关的服务;atx-agent 提供执行设备端 shell 命令的功能(fork,执行,因为 fork 自 atx-agent 所以有 adb shell 权限),所以可以首先启动所有 uiautomator2 组件待 WiFi 无线操作可用后,暂时关闭 android-uiautomator-server,然后通过 atx-agent 启动 Maxim,执行完成后再通过 atx-agent 重新拉活 android-uiautomator-server 恢复 uiautomator2 的功能,相关片段整理如下:

import uiautomator2 as u2

d = u2.connect('192.168.0.149') # 连接设备
print(d.info)
# 启动前关闭atx-agent守护的uiautomator-server进程
d.service('uiautomator').stop()
# Maxim正常运行
task = d.shell("CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.hotbitmapgg.ohmybilibili --running-minutes 2 --throttle 1500 --uiautomatormix --output-directory /sdcard/max-output", stream=True) # stream模式,保证不会timeout导致杀掉,底层上是一个requests库提供的streaming 模式的response
try:
    for line in task.iter_lines():
        print(line)
finally:
    task.close()
print('Done')
# 重新让atx-agent拉活uiautomator-server进程,或者执行下一条需要uiautomator-server的命令也会自行拉活
d.service('uiautomator').start()
d.press('home')
  • 注意:有时候 Maxim 会跑非常久,并不能保证这个 streaming response 一直有,所以在实际使用中可以考虑让 Maxim 跑着,不要求总是获取 log 输出,然后脚本本身等待或者隔段时间去判断 Maxim 进程是否结束了

贡献者招募

  • 开源,不是喊一声大神,大神给你免费开放用自己开发的框架,然后要从安装开始教你,Fix 你特殊设备的 Bug,完成你提的这个那个需求,还给你写文档,完了你就去交 KPI 了;这不是开源,这是抢劫
  • Maxim 作者聊到过,iOS 端开源了 1 年多,没有人贡献过
  • Appium 作者来华私聊到,从流量上看到大量中国人在用 Appium,但是却没有看到过 PR,这是为什么
  • 我们 AppetizerIO 作为一个使用开源项目的商业产品,取之于社区,还之于社区:用开源工具充实我们的同时,为开源项目 1. 写文档 2. 做 GUI 配给,集成,项目调和 3. 回答问题处理 issue 4. Bugfix, 新 feature
  • 独乐了不如众乐乐,开源是精神,不是形式,不是收费就不是开源
    • 大神这个能不能加上 -> 大神我加了个这个,PR review一下
    • 大神没找到文档啊 -> 大神我把xxx这里写了一下,PR了合并一下吧
    • 大神我这个手机上跑不了 -> 大神,我适配了xxx,PR合并一下吧
    • 大神我是小白,这个怎么用啊 -> 大神我是小白看了文档试用了一下,这个是我在TesterHome分享的踩坑贴,有些可以并到README
    • 大神这个是不是一直免费啊 -> 大神我能做什么
  • 最后,感谢我们的贡献者,期待更多真的开源人加入 @codeskyblue @zhangzhao_lenovo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 20 条回复 时间 点赞

结尾说的挺好

先 mark 抽空试试

开源,不是喊一声大神,大神给你免费开放用自己开发的框架,然后要从安装开始教你,Fix 你特殊设备的 Bug,完成你提的这个那个需求,还给你写文档,完了你就去交 KPI 了;这不是开源,这是抢劫
Maxim 作者聊到过,iOS 端开源了 1 年多,没有人贡献过
Appium 作者来华私聊到,从流量上看到大量中国人在用 Appium,但是却没有看到过 PR,这是为什么
我们 AppetizerIO 作为一个使用开源项目的商业产品,取之于社区,还之于社区:用开源工具充实我们的同时,为开源项目 1. 写文档 2. 做 GUI 配给,集成,项目调和 3. 回答问题处理 issue 4. Bugfix, 新 feature
独乐了不如众乐乐,开源是精神,不是形式,不是收费就不是开源
大神这个能不能加上 -> 大神我加了个这个,PR review 一下
大神没找到文档啊 -> 大神我把 xxx 这里写了一下,PR 了合并一下吧
大神我这个手机上跑不了 -> 大神,我适配了 xxx,PR 合并一下吧
大神我是小白,这个怎么用啊 -> 大神我是小白看了文档试用了一下,这个是我在 TesterHome 分享的踩坑贴,有些可以并到 README
大神这个是不是一直免费啊 -> 大神我能做什么

😆 😂 😂 😂 😂 😂

就是这么个理儿....
不过 大神都被 BAT 360 大厂挖走了 小公司成测开规模上 3 人规模的都很少....
拿来主义盛行,也是没办法的事....

最后上一图 大家笑笑

做测开好的都去了 BAT 要做 API UI 测开 就要用那些技能稍微不好的 ,但弄的好不好不重要,重要的通过 UI API 来找手工业务测试新韭菜!!

思寒_seveniruby 将本帖设为了精华贴 12月07日 16:30

maxim 确实挺不错的,作者也一直在互动更新,答疑解惑。appetizer.io 做的东西也很棒,唯一的担心是黑盒使用,对于代码安全性问题有些担心

simple 回复

对 所以 这些云测平台 appetizer 也好 领导们 都担心安全和 user infomation 问题

所以有私有化部署的商业服务在此😁

设备端 atx-agent 真有必要?shell 脚本后台执行也可以解决同样的需求,网络 adb 下起后台脚本管理测试执行的过程和具体的调用,shell 脚本还能额外开发功能能力。

太棒了,前天刚聊完文章就出来了!!

浮云 回复

当然,1. 守护,保活 2. 反向代理多个 daemon 服务,不可能每个 service 一个 port/unixsocket;atx-agent 也暴露全功能 tty shell,脚本照旧;adb over TCP 方案开启也挺麻烦的

thanksdanny 回复

基本就是之前讨论的,重点就是启动前关掉 uiautomator-server,上次卡在怕 server 关了 shell 就没了,结果幸运是 atxagent 提供的。这脚本是我跑过 PoC 可用的,正好有时间写了下

AppetizerIO 回复

对,我看你的 demo 代码也发现了。现在这样就更完美,看来之前的担心会断掉 shell 是多余哈哈

点赞支持一下,很受用👍

写的很好,点赞👏

simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44

很想贡献一些力量,但是感觉自己能力所限。

ivy520 [该话题已被删除] 中提及了此贴 12月16日 22:55
ivy520 [该话题已被删除] 中提及了此贴 12月16日 23:53

考虑开源?还是商用?

安涛 [该话题已被删除] 中提及了此贴 12月21日 16:29
simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08

学习中

我读测试专业的,在学校没有接触辣么多,工作了反而知道得更多。谢谢作者的贡献

同样的体会,以前的同事朋友看到我的测试平台做好了,上来就是拿给我用用啊!用着用着就成自己写嗯了,github 也不帮忙点星!

这个真的是一个现实,有部分原因是不知道如何去参与这个。其实个人都是希望去参与的。

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