背景

AndroidAPP自动化测试目前包括很多测试专项,每一个专项都有很多创新内容,包括功能自动化测试、稳定性自动化测试以及性能自动化测试等,在日常的测试过程中以上的测试技术或者服务均会发现一些问题。

传统的稳定性自动化测试(Monkey测试)主要是通过任意的点击、滑动等操作模拟用户行为,但存在覆盖率低、执行效率低的问题。性能自动化测试往往局限于固定的测试场景,无法捕捉固定场景外的内存泄漏问题。另外兼容性测试仍然依赖于人工手动测试来覆盖多系统版本、多机型的方式,并且需要尽可能保证APP在不同设备上的功能可用性,但是这种人工测试很难完全覆盖市场上主流的安卓机型。

对于快速迭代的新业务团队而言,功能自动化case脚本的维护成本较高,且人力投入资源也不多,尽管通过配置化或者AI技术等手段的介入,自动化测试技术产生的收益还是不够理想。因此希望能够降低脚本编写成本和脚本的复杂度,减少脚本维护内容,让尽可能多的遍历交给服务来执行,同时也能发现更多的问题。

为了达到这样一个目标,爱奇艺测试团队提出了一种轻量、简单、通用的APP一键体检方案,用户只需提交一个APP地址,就可以给APP一个多维度的健康体检,包括【APP安全校验】、【UI异常检测】、【性能数据分析】、【Crash和ANR检测】等核心内容。

解决方案

方案主要通过开源工具ATX作为遍历引擎,集成web端的录制回放工具将定制化脚本无线方式分发到租赁的真机设备群,定向遍历基础上进行相关的控件遍历;从APP安装开始到最终遍历结束,最后自动卸载,时间段内任务完成。

任务分为4个阶段(安装、初始化、遍历、卸载),整个过程期间包含对日志采集、图片采集、视频录制、ANR和Crash监听采集和过滤,服务端进行相关日志分析,数据聚合等处理。针对过程又加入丰富了对APP自动安装成功率的优化、启动耗时的度量方案、问题的Bug自动上报、UI异常校验以及安全扫描等内容。

整体框架
一键体检整体功能由手机云后端服务、场景服务、Worker服务、分析监控服务四个模块组成。任务启动后,首先从移动真机设备资源池中租赁一部分设备或者指定设备,远程挂载到Worker中。如果Worker不够用则自动扩展再次挂载,当对应Worker收到任务消息后就进行任务下发,分配到这些设备中,下发任务根据定向脚本数和设备数进行匹配,初始化结束后就开启安全检测、APP通用安装、执行遍历、数据抓取、图片抓取以及视频录制等服务,相关数据文件等按照结构化格式传输到日志服务平台。

一键体检整体框架

驱动内核

传统的功能自动化测试通常使用Uiautomator2框架编写Android脚本,然后打包作为一个APP安装到手机上,实现APP UI驱动。该框架可对控件进行遍历,也可定向运行指定功能测试,但是在公共统一设备资源池情况下,多团队租赁设备后就需要在手机上安装集成测试脚本的APP,这样需要安装的APP就变得多了起来。

此外打包安装测试APP到运行任务,整个测试开发效率是非常低的。为了克服这样的问题,团队采用通过http方式,将执行的动作脚本传输到对应手机设备,实现无线遍历的方法。这样的好处是可以灵活实现定向遍历,手机端也无需再打包安装驱动引擎或者驱动测试APP。团队使用的内部框架主要是基于开源项目ATX二次开发实现,包括对设备端的atx-agent稳定性升级,支持添加ATX的录屏,以及内部日志优化的处理等。

如下图,可以看到py代码可以转换成以http方式传输到手机端形成相应的指令,来执行相关的驱动目的。

* 说明:

atx-agent】是一个Go编写的ARM程序,需要adb shell方式开启,收集来自客户端的http请求指令,分别分发到不同组件模块中对应执行。

android-uiautomator-server】是github开源的一个项目被集成到了ATX中负责自动化操作比如点击,输入,滑动等的执行引擎。

minicap】和【minitouch】分别是开源框架open-stf的设备实时屏幕图像和触屏事件的两个服务。如果设备安装ATX app的话这些组件内就会被自动推送过去。

Python框架库里面有个uiautomator2,引入后就可以像上图一样通过自动化脚本无线请求到设备执行自动化操作。

设备资源池

目前整个Android设备资源池通过open-stf框架已经成功搭建且有效运行,服务于公司多条业务线的测试和开发调试。现有近100台设备集中管理在实验室,通过provider实现PC托管多设备。由于地域设备管理和上层应用的技术发展需要,考虑一键APP体检本身的场景特殊,爱奇艺测试团队将其与底层设备的连接去USB化。

这里去USB化是要说明ATX首先需要获取adbshell权限,如果去USB连接,那么就需要adbconnect方式,才能无线挂载设备进行ATX初始化,当atx-agent被adb启动后驱动脚本就可以通过http方式定向指定,动态下发到设备中,对于其他的日志比如性能日志也就可以用adb shell相关的指令去获取。移动实验室提供了这样的基本租赁接口能力,同时分配端口和provider机器的IP。

如下图,当然有特定的接口支持非ui形式,这里标记出来仅作直观说明。这样就可以解耦,供上层的技术实现特殊的应用场景,进行设备远程挂载。

APP通用安装

Android应用一键体检的第一步就是APP安装,但是目前市面上的手机安装过程并不一致,尤其是vivo、OPPO等品牌必须要输入密码并依次完成按钮的点击操作才能完成。

如上图,通过传统的控件找元素方式是很难点击到“安装”按钮的。因为安装和取消按钮实际是一张图片。

通过仔细可以观察发现所有机型安装过程中其实涉及到的关键词是有限的,主要包括:安装、确定、下一步、确认等,其实只要能够找出这些关键词并点击相应位置就可以实现点击,这个时候使用OCR查找关键词位置是最合适的。这里爱奇艺测试团队提出了一种基于OCR技术的APP通用安装解决方案。在APP安装过程中进行截图,然后将截图上传给后端接口,后端调用爱奇艺OCR服务获取截图内文字分布及坐标区域后,与通用安装关键词库进行比对,后端将匹配成功的关键词(e.g.安装)及其中心点坐标返回给移动端,手机设备点击该坐标即可。

到这里或许有人会说很多公司都是采用这种方法,有些甚至还采用深度学习的方式来实现。那为什么我们没有采用深度学习能力赋能呢?原因如下:

  • 1)当多个关键词同时出现在截图中时,优先点击最靠画面底部的文字是考虑到弹窗可点击的引导按钮基本出现在偏下方且靠右边(当然也有靠左边的这类机型,过滤一下即可),以这样的策略选择唯一性文字坐标就可实现安装步骤的逐步点击。

  • 2)OPPP, vivo(以下简称OV)手机系统的密码输入时机:厂商出于安全考虑在密码输入弹框出现时候,截图功能是被禁止的。因此OCR的文字识别就会失效,就连普通控件识别也是无济于事。因此团队想到这样一种方案:通过机型判断,当安装任务被触发后,通过tab键、回车键对OV手机统一的用户名密码进行认证(注明:仅OV测试机器上授权可用),后续操作截图不受影响,安装流程同1)。

  • 3)截图以Minicap方式避免某些品牌如小米手机在安装时有倒计时的超时要求,adb shell的截图功能较耗时,会超过操作的超时要求。Minicap截图也有自身问题,间隔时间需要控制得当,比如进入了APP内的业务弹框、授权弹框等重叠弹框出现也是需要通过特定策略进行去除的,否则点击时候失效,目前是通过执行点击后进行OCR识别文案再次匹配的方式进行判断是否重复出现,后期会通过图片相似度进行对比去除。

目前通过以上的方式APP安装的成功率高于95%,基本满足了主流机型的APP安装自动化的要求。有些场景比如消息推送干扰,锁屏干扰,OV的用户认证的网络通畅要求等异常情况出现时,这方面的解决方案仍在寻找中。以下截图也会在一键体检中将安装过程的快照给用户呈现,以便在碰到上述异常时,可以临时人为去干预调整。目前自动化安装APP服务已提供给其他一些技术专项使用。

图为爱奇艺姜饼短视频APP自动安装过程

APP启动耗时

启动耗时数据采集:APP安装过程将会被记录安装耗时,APP启动也会采用屏幕录制功能进行记录,然后通过视频解析服务平台对图片RGB变化率绘制的波形图,找到匹配每个业务线提供的特征值计算耗时。

上图的st:(1,0,20)代表APP打开的起始计算点,从第1个波形图的左边起始点开始,20表示业务线设定的阈值,如超过阈值的数据表示一个波形。ed:APP首屏打开的终止点,特征值意思和st一致。

有了这样的后端视频解析服务平台,对于一键体检提供的视频就可以度量一个APP的启动耗时情况,另外需要说明的是视频的录制功能,团队使用传统的方案adbshell screenrecord, 但是华为手机不支持该adb命令,为了应对华为手机,在ATX APP中集成MediaRecorder,设置封装了对APP UI的起播停止操作的视频录制。

由于要标准地输出上面的类似波形图,尤其在st点保证第一个波形的第一个起始点就是APP启动的计时点,因此需要对录制好的视频文件,使用工具ffmpeg适配裁剪一段白屏内容, 因为MediaRecorder被调用时会有启动集成在ATX内的空白Activity,需要剔除这部分因工具产生的干扰因素。这样耗时统计测试是精准的,且投入的自动化方式也更稳定和通用。

UI的异常校验

本公众号之前的推送

APP安全校验

APP安全校验由爱奇艺安全云团队提供技术支持,目前主要通过两类分析引擎完成,分别是基于smali代码的漏洞规则匹配引擎,和基于FlowDroid的静态污点分析引擎。前者可以快速定位特征明显的API参数误用等漏洞。后者通过污点分析技术可以检查出更深层次的数据泄露以及权限泄露漏洞。

这里重点介绍一下静态污点分析引擎,在FlowDroid的基础上,增加了多种通用漏洞规则,修复了大量数据流处理的BUG,扩展了数据流追踪范围,同时增加了分析精准度。对于报告输出,提供了详细的漏洞位置或数据泄露路径相关代码,方便使用者对相关问题进行排查。

如上图,这里有基本安全风险以及Manifest权限分析,对于基本安全风险,如果要排查问题,可以点击查看定位到具体APP代码文件路径,非常方便。

组合事件驱动

一键体检中的遍历操作事件主要分为基础随机事件和操作场景事件,这两类事件相互补充,保证遍历操作可以覆盖用户的正常操作行为。基础随机操作里面的点击滑动类事件主要包括单击、长按、双击、全向滑动等,而操作场景事件里面添加了连击、点击等待、定向滑动、识别滑动等操作,在不同场景实现不同操作。除了普通的文本输入功能,操作场景事件涵盖了文本框识别、键盘呼出收起等功能。

手机的基本操作包括设备唤醒、点击home键、点击物理返回键等,这里为了适配爱奇艺播放器兼容性测试情况,加入了旋屏、半屏全屏切换等功能,有时为了防止遍历崩溃或者遍历走出业务线范围,也对应加入了对APP进行重启或者返回主动干预操作,并支持APP在前后台切换。

如上图,具体的遍历策略为,解析当前控件树xml文件,由控件树确定当前点击控件的坐标集,然后根据本次步骤获取的控件操作属性特点,来决定相应坐标的点击、长按、文本输入以及返回等可能的操作,考虑到需要控制一些遍历范围,方案会在任务触发的时候让业务线配置好业务的Activity白名单list,这样发生遍历外出就会监听到并及时返回矫正。

另外在遍历测试过程中,难免会遇到一些权限弹框、确认弹框、异常弹框等,在遍历运行过程中体检方案会进行弹窗的监听并做相应的点击处理,避免阻塞遍历运行。基于控件树本身还有自身缺陷,比如RN或者小程序 UI的识别,控件树缺失,这块目前已经有了方案还在升级优化。

场景定制化

一键体检支持定制化场景脚本执行,例如可实现:可配置支持登陆、特定垂线业务及小程序入口等。目前定制化场景任务脚本由各业务线自行维护,执行一键体检任务前如果需要指定前置场景的操作,则在通用安装模块运行结束后自动执行定制化脚本,到达指定入口,再进行相关的策略遍历。

另外,对于一些轻量的业务遍历需求,爱奇艺测试团队将脚本开发效率提升到录制回放层面,减轻业务线人员的技术投入,只要对APP进行相关的录制回放即可实现功能的自动化驱动。

如上图,通过web页面租赁到一台设备后,就可以进入这样的webIDE,实现针对手机端APP的录制回放,有点像airtest工具,不过这里是Web端的IDE, 爱奇艺测试团队开发这样的工具主要考虑用户在客户端需要配置大量的环境设置或者工具兼容性问题,避免导致维护成本较高或者开发效率较慢。目前支持python,脚本可提交到云端,后面集成到一键体检就可以实现多设备的批量回放了。如下图可以选择“前置任务名称”的脚本。

BUG提交上报

在遍历任务启动以后,体检方案会持续地监听安卓设备的logcat日志,并过滤出APP相关的Crash、ANR等关键错误信息日志。在捕捉到Crash、ANR相关关键词时,会取出发生问题前一段时间内的截图,并在截图上绘制行为轨迹图,把这部分作为上报Bug的一部分关键信息。除了行为轨迹图以外,在提交上报Bug单中会附上详细的设备日志信息、当前的测试包下载地址、当前测试包对应的mapping文件、全量logcat文件,且Bug的标题会取崩溃或者ANR的关键信息。

对于ANR错误,如果有权限抓取设备的traces文件,这时traces文件也会作为附件加入到Bug单中,但是目前很多设备不支持直接拉取traces文件,那么我们会获取Android提供的BugReport文件附于Bug单中,最大程度地为开发同学提供有效信息。

Bug信息中的对应行为轨迹图

另外需要特别指出的是,在提bug的过程中,可能会发现重复bug的问题,比如多次出现同样的crash。考虑到重复提bug的问题,在提bug的过程中进行了一次后端过滤,对于错误原因相同的bug,由后端判定这是一个重复的bug,将相关错误信息落库后,不再执行后面的bug上报流程。同时也会把之前产生的bug单再次在用户任务结束后附录告知,说明是有遍历出现了相同的问题,请及时修复。

具体判定规则为:需要统一剔除logcat中的字符【如下图日志红框标注】, 然后以统一版本维度将本次任务对比库存Bug内容,发现匹配后则认为有重复bug,不会再次提出相同的bug。

日志分析服务

一键体检的任务默认运行设备15台左右,时长默认为30分钟,并行多业务线。因此处理的数据量巨大,包括对性能数据,图片数据以及日志数据的处理,同时还包括问题定位数据间的关联处理等。后端日志分析如下:

这里介绍一下这几个部分:

  • 数据源:接入日志服务的数据,包括但不限于日志、图片数据、性能数据等,目前一键APP体检的数据产出主要包括这三个内容的业务形态。

  • 数据接入:按照约定好的数据格式和通讯协议将数据上传至日志服务。

  • 数据采集和存储:将数据采集、解析、存储,此时是一些原子的、结构化的数据

  • 数据计算:根据业务场景,将原子的数据进行加工、计算,并存储

  • 数据服务:提供开放接口,将数据输出

  • 数据应用:基于数据开发前端,供用户使用

实际效果图如下, 也即一个完整的报告,包括了上面介绍的一些内容。当然由于篇幅要求,部分情况未能介绍,如性能分析数据等是由后端测试团队性能分析平台进行科学化的去噪统计汇总给出的数据,集成到一键体检中提供更周详的参考内容。

结束语

一键体检目前已经用于爱奇艺内部很多APP的新产品和新业务线中,能帮助它们及早地、全面地发现线下问题,减少人力投入,减少对接使用的复杂度。只要一些简单的配置就可以触发多台设备执行,还可以对接到持续集成中。未来,除了在覆盖率上做优化外,还会丰富体检的其他专项指标,同时也会在遍历的场景多样化上做升级。

end

也许你还想看

扫一扫下方二维码,更多精彩内容陪伴你!

爱奇艺技术产品团队

简单想,简单做

效能篇 | 爱奇艺APP一键体检技术实践相关推荐

  1. Android篇 | 爱奇艺App启动优化实践分享

    导读 性能优化一直都是各个APP推进中的重点.难点,爱奇艺 App也不例外.在此之前,爱奇艺App Android 版的启动速度虽然一直处于同类App领先的水平,但优势距离其他同类的APP距离一直很小 ...

  2. 得到、微信、美团、爱奇艺APP组件化架构实践

    一.背景 随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多.此过程中,你是否有过以下烦恼? 项目模块多且复杂,编译一次要5分钟甚至10分钟?太慢不能忍? 改了一行代码 或只调 ...

  3. 爱奇艺APP的自动化录制回放系统 全云化处理新体验

    在面对大量的APP功能用例回归测试的时候,测试开发工程师最头痛的问题之一便是新功能交付时间紧迫,原有功能回归测试耗时长,自动化脚本都没时间跟进补齐测试用例.导致核心功能回归遗漏,新功能测试质量也得不到 ...

  4. 二维码扫描优化及爱奇艺App的实践

    写在前面 二维码是一个近几年来移动设备上超流行的一种编码方式(又称二维条码,QR Code,QR全称QuickResponse),它比传统的条形码(Bar Code)能存更多的信息,也能表示更多的数据 ...

  5. 腾讯技术团队人手一份的Android组件化实战笔记(含得到、微信、美团、爱奇艺APP架构项目及源码)

    前言 以前的Android开发大多用的中心化管理思想,将相同的资源集中进行管理.随着项目的发展,弊端渐显:集中管理的资源越来越多,多人开发也越来越麻烦,时常牵一发而动全身. 尤其是在大公司或者是大项目 ...

  6. 爱奇艺 App 中台技术实践

    本文来自爱奇艺研究员在 ArchSummit 全球架构师峰会上的演讲整理,将为大家分享爱奇艺打造移动中台的过程.爱奇艺移动中台的建设过程可分为组件解耦.组件定制化和平台化,未来会利用平台发现.沉淀和复 ...

  7. 爱奇艺App架构升级之路——64位适配探索与实践

    背  景 随着手机硬件的不断发展,近两年的新式手机已经全部采用了64位CPU,64位真的比32位快吗?实际上32位和64位的差异主要体现在内存寻址上,32位最高只支撑4GB内存,而64位则能够最高支撑 ...

  8. 爱奇艺APP全面适配iOS 14 首批支持画中画功能 追剧聊天两不误

    导  语 为了让iOS 14的用户娱乐体验有更加舒适.便捷,爱奇艺APP全面适配iOS 14,不仅是首批支持iOS 14一屏多任务画中画功能的平台,同时支持Widget小组件实现桌面个性化推荐一键点击 ...

  9. 爱奇艺android投屏,手机爱奇艺APP怎么将视频投屏上笔记本电脑?

    频投屏上笔记本电脑?直接在笔记本电脑就搜索出来了呀~~ 1.确保手机和电视机都连接在同一局域网内.2.打开电视机,进入系统设置界面,找到通用设置选项下的多屏互动功能,按确认键进入,将多屏互动功能打开, ...

最新文章

  1. 2022-2028年中国服务器行业投资分析及前景预测报告
  2. 《强化学习周刊》第28期:UNCC提出全新脑-机交互学习模式:内在互动强化学习...
  3. 【Qt】QLayoutItem类
  4. Python并发与并行的新手指南
  5. HTML5 Canvas像素处理常用接口
  6. Vue v-model 指令详解以及sync修饰符的使用场景(结合父子组件通信案例)
  7. 用groovy采集网页数据
  8. mysql 在update中实现子查询的方式
  9. PCB Layout的这些要点,建议重点掌握
  10. 美的程序不可能从修修补补中来。它必须完美的把握住事物的本质,否则就会有许许多多无法修补的特例(转)...
  11. 故宫博物馆爬虫(简略版)
  12. 2018/10/25 模拟赛 纸牌
  13. 什么是流程引擎,F2BPM
  14. 多目标优化系列(六)SPEA
  15. 74HC138芯片简析
  16. 在什么情况下需要进行开眼角修复的手术
  17. telegraf介绍
  18. H桥SPWM波产生电路及死区电路的分析
  19. 优化算法(二)遗传算法及python实现
  20. 阿里巴巴iconfont加入新的图标如何操作

热门文章

  1. python基础程序实例-Python基础的初始
  2. uni-app实现验证码登录-云之讯
  3. 四川高考成绩位次查询2021,211大学2021年四川录取分数线及位次排名
  4. Linux input 子系统详解
  5. 思考-ML如何产生效益,前景问题
  6. c++里面的protect和public、private有什么区别?
  7. np.save 和 sio.savemat 简单的比较
  8. 企业微信网络抓包工具devtools_resources
  9. 实习 | QQ音乐(深圳)娱乐营销实习生
  10. 微博小尾巴自定义名字中的Android,新浪微博自定义来自XX小尾巴怎么改 新浪微博显示来自XX小尾巴设置教程...