Android 应用的自动遍历,能够全自动的走遍整个被测试应用的所有层级页面,在一定程度上做到取代手动点击测试。但是在自动遍历的过程中,收集到的数据十分有限。
如果结合自动遍历与监控,同时多台设备多次遍历,就能够收集到海量的数据,包括 App 图片解码速度,各个页面的流量开销,CPU 和堆内存占用等,对这些信息进行过滤,可以得到有价值的性能分析报告。
本文对开源 bilibili 客户端进行测试,该客户端使用了 retrofit,Rx 系列,butterknife 等热门三方库,能够正常播放 Bilibili 主站视频,还包括一些功能性页面,是一个和商用 App 接近的开源项目。
字节码插桩监控工具使用了 Appetizer 质量监控,使用 Appetizer 上传 bilibili 客户端的 APK 文件,在服务端进行字节码插桩后,下载到本地,在手机上安装。
自动遍历使用了 AppCrawler,配置文件中对 bilibili 的登录页面进行简单的配置后,便可以自动化的遍历整个 App。
Appetizer 插桩质量监控基本流程如下图:
在自动测试流程中使用 AppCrawler,在自动化遍历的同时,扩展出了自动截图功能,结合底层数据和 UI 截图,能获取更多信息。
参考该教程。打开 Appetizer 客户端,登录后选择 “质量监控”,点击 “插桩 APK 文件”,等待被插桩的 APK 文件下载到本地。
或者使用命令行版的 Appetizer 质量监控客户端,依次执行 login, process 操作得到被插桩的 APK 文件。
根据 AppCrawler 的教程,安装好相关的依赖。由于 bilibili 客户端的第一个页面是登录页面,无法通过自动遍历跳过,需要单独配置,剩余页面都可以自动遍历。
triggerActions:
- action: "azard"
xpath: "//*[@contains(name(), "请输入您的哔哩哔哩账号")]"
times: 0
- action: "xxx"
xpath: "//*[@contains(name(), "请输入您的密码")]"
times: 0
- action: "click"
xpath: "//*[@contains(name(), "登录")]"
times: 0
=============一台古老 Nexus5 自动遍历 20 分钟的分割线=============
=============一台古老 Nexus5 自动遍历 20 分钟的分割线=============
=============一台古老 Nexus5 自动遍历 20 分钟的分割线=============
AppCrawler 在自动遍历结束后会得到一个文件夹,有一个网页可视化的报表。从报表上可以看到一台设备运行了 108 个 Activity 页面,实测大概 20 分钟左右,H5 页面也会进行一定程度的遍历但报表不会抓取具体信息。
同时,AppCrawler 在每次点击操作前后都会进行截图,方便查看具体渲染的行为状态。
在自动化遍历结束后,通过 Appetizer 客户端或 Appetizer 质量监控命令行客户端,将设备上的质量监控 log 上传服务端进行深度分析,得到 json 格式的报表,报表可以使用 Appetizer 客户端打开进行可视化。
可以看到 Appetizer 质量监控抓取到了若干问题,包括数个高延迟,可缓存的建议,一个 HTTP 错误,若干耗时操作和性能问题。
点击HTTP 错误,可以看到具体的 HTTP 错误内容,以及调用该 HTTP 请求时的函数堆栈。
在笔者实战测试的过程中,抓取到一个控指针错误并导致 bilibili 客户端崩溃,Appetizer 质量监控抓取到了该错误,并且包含函数堆栈和当前时刻的内存占用。
点击分享按钮可以自动将问题生成 markdown 格式的 issue,发布到 GitHub 上。
该 issue 得到了开发者的确认,是由于 HTTP 调用可能返回空数据,导致渲染出错造成的。
通过结合 Appetizer 质量监控插桩,和 AppCrawler 自动化遍历,可以大幅度减少手动测试的工作量,并且抓取到需要底层数据,实现对 App 更深度的测试分析。