主要讲述搜狐视频开源项目APP自动化遍历的架构及技术实现。从为解决测试痛点而产生全自动测试想法,到自动遍历思路的诞生;从代码实现过程中遇到的棘手问题,到寻找解决方案的过程;从代码结构的组成,到其功能在测试过程中的应用策略。同时讲述搜狐视频自动化工具——小王子的其他功能模块如何在兼容性测试、稳定性测试、功能测试、回归测试等多种测试过程中发挥其作用价值。
11月24日网络安全专场上,搜狐视频高级测试开发工程师何畅分享了《APP自动遍历程序的技术实现》演讲,介绍了自动化测试工具小王子。
搜狐视频高级测试开发工程师何畅主要讲述了搜狐视频开源项目APP自动化遍历的架构及技术实现。从为解决测试痛点而产生全自动测试想法,到自动遍历思路的诞生;从代码实现过程中遇到的棘手问题,到寻找解决方案的过程;从代码结构的组成,到其功能在测试过程中的应用策略。同时讲述搜狐视频自动化工具——小王子的其他功能模块如何在兼容性测试、稳定性测试、功能测试、回归测试等多种测试过程中发挥其作用价值。
APP自动遍历技术
首先讲一下自动遍历这个模块, 为什么今天要把自动遍历这个模块拿出来单独讲讲,在做自动化测试工具研发的时候,可能都遇到这样的问题:研发好这个工具以后,在推广的过程中可能会遇到一些阻碍。因为测试同学可能有自己固有的测试方法,可能比较熟练。而且测试任务比较繁重,在这种环境下让他们再去学习其他自动化测试工具,这无形之中给他们带来一些压力,所以他们内心可能是拒绝的,于是就像做一个这样的一个功能,只要点一个开始按钮或者简单的设置就能让它自动完成一个测试。测试之后还能给出一定的测试结果,这样他们就没有额外学习的压力了,很容易的用这个自动化测试工具去帮助他们解决测试的问题。所以自动遍历的需求就这样诞生了。
其次,在做自动遍历之前,做了一些技术调研,发现网上的这些资料并不是很完整,都是一些零零碎碎的,所以想把一些经验分享给大家。
自动遍历到底有什么功能,首先它可以针对APP内所有的控件遍历点击一遍,其次在每一步点击过程中会记录截图,并且提取出一些出错图片;黑名单机制,能够过滤掉不想点击的控件,在测试的同时可以兼顾性能测试,能够实时记录内存、CPU等等这些性能信息。在测试结束之后会输出excel报告日志,能够统计在遍历过程中的一些点击情况,以及崩溃或者异常的信息。
整个过程是通过安卓自带的Uiautomator框架来完成的,通过QT去编写界面,最后通过java去完成算法的实现。
自动遍历的基本架构主要分成三层,交互界面层,业务逻辑层和数据层。交互界面包括设备管理APP列表的管理,系统的设定以及最后显示界面等等。通过交互接口去和业务逻辑层的算法进行交互,这个业务逻辑层包括遍历顺序,列表的维护以及黑名单的算法等等。最后数据层主要对日志和截图进行抓取,对于性能信息进行统计最后合成报告。
其中最重要的一层就是业务逻辑层,这一层也是通过三块来完成的,adb、Uiautomator框架和java的原生代码,其中adb这一块主要做的是信息的导出; Uiautomator的框架就是自动化的开源框架,它可以完成控件的操作比如点击、滑动、截图之类的;java这一块做的是文件的处理,线程的管理等等一些逻辑。
在研发过程遇坑无数,比如界面怎么去标记,控件如何去识别。遍历顺序采用深度遍历还是广度遍历等等。接下来我把这些经验和大家分享一下:
首先是标记界面和Tab页去重点击,其实这是两个问题,但是这两个问题是通过一种方法来实现的,先说这个标记界面,目前用的比较多的标记界面的方法就是用图片来标记界面,看一下两幅图片的变化阈值是不是发生变化,再通过阈值变化的程度确定界面是否发生变化。一开始我也尝试用这种方法,但是也遇到一些问题,图象处理算法是比较复杂的,还有阈值问题,这个阈值如何判定,变化多少才判定这个界面是变化的,是没有相关的规定的。
其次,还有一种情况,比如一个界面底层没有发生变化,但是上层可能有一个浮层,或者一个弹框,这种情况,认为它到底是变化了,还是没有变化?都不太好去做处理,所以我决定换一种方式。
在解决这个问题的同时,又遇到了第二个问题,就是Tab页去重点击的问题,什么是Tab页去重点击?如右侧的两幅图,这个是搜狐视频旗下的直播产品——千帆直播APP的两个截图,其中对应的是热门和小视频的两个界面。如果以图片做界面识别的话,这两张图片肯定是两个界面了,变化很大。
这两个界面最上方都有Tap页这个控件,都会有热门、小视频、互动这几个按钮。如果在这两个界面中,对于这些控件都进行点击的话,效率是很低的。要把在不同界面中同时包含相同tab页的这种情况进行一个去重点击的优化。他们共同的特点是都在同一个activity中。所以可以用activity来作为页面的标记,进到一个新的页面以后,去判断一下它的activity有没有发生变化,如果发生了变化,肯定界面已经发生变化了,如果这个活动没有发生变化,可以检测一下,这个activity中有没有新的控件生成,如果有新的控件产生的话,就可以把新的控件加到活动的控件列表中。
遍历顺序的问题,目前遍历顺序有深度遍历也有广度遍历,这两种遍历方式有自己的优缺点,广度遍历的优点就是容易追踪控件被点击的情况,一张图中有多个控件,哪些点到了,哪些没有点到,一目了然,很容易查看。
但广度遍历也有缺点,广度遍历需要不停的返回,要返回到刚刚的页面中进行其他控件的点击,需要不停的返回,这样很浪费时间,而且效率比较低。
对比着看深度遍历,它的优点效率就会比广度遍历高一点,因为没有重复的操作,同时比较符合我们的视觉效果,因为一层一层的深入点击。但是它也有缺点,很容易点乱,不同界面的点击操作会遇到同一个界面,或者再一个界面内所有控件都被点击后,需要返回到上一个界面的时候会出现无法返到上一层页面的情况,这样很容易点乱。
通过对比发现,广度遍历的顺序问题是没办法优化的,但深度遍历的缺点是可以通过算法进行优化的,所有最终采用了深度遍历的方式。
下一个问题是识别控件,识别控件有很多种方法,一开始采用Text来作为控件的识别,但是有一些控件可能就是图片,没有Text的属性,这样可能就获取不到控件,而且在会有一个界面中出现两个控件的text是一样的情况,比如在这个图中有两个“关注”按钮。后来尝试用Reesourceld来作为这个控件识别的方案,但是安卓比较低的版本是没有Resourceld这个属性的,而且有一些控件也没有设置这个Resourceld。所以用Resourceld可能也会有一些识别不到控件的情况。
此外,也尝试了用Xpath来解决,Xpath是一种路径标记语言,可以通过xpath文件树的结构去完成一个节点的记录、一个路径的记录,现在也有一些人去用Xpath来做控件的识别。但是它的问题就是性能差,而且页面有微小变化的时候,路径可能不存在了,可能会影响到其他控件的路径。
最后采取的方案是把以上几种方式结合运用,先用xpath去过滤掉一些不能点击的控件,其次以resourceId作为主要标记项,text作为辅助标记项,这样会提升一些控件的识别率。
接下来是黑名单机制,在遍历一个界面过程中,一般顺序都是从左向右,从上倒下,如果按照这种方式,在这个界面,第一个要点击的控件就是左上角的返回按键,如果刚进到这个界面就点了这个返回键,就会退出这个界面,导致其他的控件可能遍历不到,虽然可以用记录路径的方式再次进入界面,对这些控件进行点击,但是这样效率会变低,如果把这样的一个控件加到黑名单中,遇到这样的控件之后,不第一个点击它,而是把它的顺序排到最后,把所页面所有的控件都点击过了以后再点击返回按键,这样的逻辑就符合遍历的逻辑了。所以就把这种不想第一个去点击的控件,把它加到黑名单中,提高一下遍历效率,这个就是黑名单机制。
下一个问题是APP跳出检测机制,在遍历过程中,对于一些按钮进行点击的时候,很容易拉起第三方的应用。如果在它拉起第三方应用时不做操作的话,它会在第三方的APP中继续遍历,这样显然不是想要的结果。所以每一次点击以后都会去判断一下这个APP是不是的目标APP,如果它符合,那么继续点击,如果不符合,就需要对第三方的APP进行操作,把它杀死,让它返回到目标的APP中继续点击,一直到结束为止,这个就是APP跳出检测机制。
小王子其他功能简述
接下来讲一下自动化测试工具小王子的其他的功能,小王子是一个单机版的测试工具,目前也是一个开源的项目,开源地址会在最后呈现出来,目前小王子有八个模块,十二项功能,可以在冒烟测试、性能测试、兼容性测试、稳定性测试等等多个测试环节中去应用。
录制和回放模块
这两个功能大多数自动化测试工具都会有,它可以把对一台手机操作的过程录制成一个脚本,再把录制过程在其他的手机中进行自动回放,这样便节省了把每一台手机都操作一遍的时间。
录制是通过adb来完成的,除了录制以外也可以手动编辑这个脚本,有很多命令去满足我们的多种对手机的操作。回放的原理和APP遍历是一个自动化测试框架——Uiautomator框架,通过这个框架可以回放脚本的操作内容,并且实时返回操作事件,并且可以监控Crash信息,以上就是录制和回放的两个功能。
性能测试模块
左侧看到的图就是性能测试界面图,图中左侧部分是设备和APP的列表管理,右侧的这六个图片就是我们性能的实时数据,可以对内存、CPU、电池温度、CPU温度、WiFi和mobile的流量六个数据进行监测,黄色的线就是实时的性能数据,上面红线是能够设定的预警值,如果认为一个APP它的内存数据超过200M性能不好,则可以把200设置成预警值。从图中能够看到,如果黄线超过红线就认为性能不好了。
在这个模块里面还有一个功能叫做数据对比,如右图,能够选择不同的数据文件,这个文件是在测试过程中生成的报告,把每次生成的结果选择到列表框里,点击对比按钮之后,就会在左侧六个图中对这些数据进行显示,很方便的能够看到对比结果的情况。以上就是性能测试。
稳定性测试模块
稳定性测试就是在跑monkey,monkey的命令是比较复杂的,每次测试都要手动去敲很多命令,小王子做的就是要把繁琐的命令转化成一个可视化的界面,就像图中这样,把每一个命令都做成可选择的框,通过可选择的框去完成命令的编辑。
在设置界面中还有个功能叫做日志关键子过滤,在跑monkey的时候,出现了crash等信息,如果不去设置关键字的话,就需要手动的从这些日志中去找这些关键字,我们把关键字写到框里,最后测试过程中,小王子会自动把关注的这些字段单独提取出来,以这种方式列出来,让很容易看到结果。
此外,在设置中还有一项叫做参数测量选项,在这个选项框中,可以对这六个性能数据进行勾选。比如在测稳定性的同时,也可以对性能测试进行一个监测,在最后测试结果中也会有性能的信息,参数测量功能是在所有模块中都有的,以上就是稳定性测试的模块。
埋点统计模块
在对一个手机操作的时候会有一些上报的URL信息,正常测试这些上报的时候是通过抓包工具来做的,比如fiddler或者Charles,要从抓取的数据中很多条数据中去选择一条关注的那条上报,还要从这一条上报中找到关注的字段,把这个字段单拿出来看一下它是不是正确的,整个过程是比较复杂的,也比较消耗时间。
小王子把这个过程进行简化,首先需要把关注的URL转化成XML文件,当然每个URL要有自己的唯一识别的字段,但凡监测到了唯一识别的字段出现,就认为这一条URL在上报,而且把唯一识别的字段作为XML文件的属性,可以和我们抓到的数据进行匹配。
转换好XML文件之后,测试之前就可以对关注的XML文件进行选择,在测试过程中,通过第三方的命令行抓包工具来抓取数据,抓到了以后和刚刚选中的XML文件进行对比,如果它们两个匹配符合,就认为这一条上报是正确的。
如果说没有抓到,没有和它匹配的XML文件,就认为这一条上报没有上报,而且如果在匹配的过程中,发现有一些字段是匹配不上的,就认为这一条上报的信息有问题。
结合界面去看一下测试过程,左侧的列表就是XML文件的列表,可以通过前面的勾选框去选择,每一条XML后面都会有状态的显示,比如黄色的三个点就代表这一条XML文件是待检测的;绿色的勾认为这一条上报已经检测到了,而且它的数据和XML文件的信息是完全符合的;红色的错号,代表这条上报确实有,但是它错了,有些上报不符合预期,是有问题的。在右上方可以显示出来URL的具体信息,下面是对于URL的拆分结果,如果拆分之后的结果和拆分文件中是匹配的,就会打一个勾。如果不匹配会用红色的方式显示出来,这样使结果清晰明了。
在这样的测试之后,很容易看到哪些上报是正确的,哪些上报是错误的,这个就是我们埋点统计的模块。
接口测试模块
接口测试只是针对移动端简单接口的抓取,它的原理和埋点统计的原理是一样的,都是通过第三方的抓包工具来抓取数据。但是它在这儿可以对这个接口的完整信息进行展示,比如它的响应时间,它的方法、协议等等。包括最后它的反馈数据,它会以符合人类视觉的方式去展示出来。
同样也结合着界面来说一下,左侧就是设备和列表,中间这部分就是对整个URL的详细展示,在这个过程中我们可以设置时间的预警值,比如接口的响应时间超过100毫秒,就认为这条接口它的性能可能不好,就可以把预警值设为100,然后在测试的过程中, 如果抓到这个接口它的响应时间是大于100的,就会用红色显示。,如图上面这两条是超过100的。它的默认显示的顺序是按照时间从大到小的顺序排列的,也可以通过前面的ID去使其按照出现顺序进行排序。右侧是对接口具体信息的展示,包括返回值,都是转换成符合我人类觉的方式去显示的。以上是接口测试模块内容。
小王子除了以上的几个功能模块以外,还有一个功能是发送crash邮件,比如在测试过程中出现了Crash,它会立刻把crash对应的信息,或者对应的log日志进行抓取,然后把这些信息整合一下去发送给测试或者开发,使他们及时处理问题,如上图是邮件的简单截图。
此外,它在每一天测试的结束之后,会把这一整天的测试结果进行整合,以日报的形式发送出来,可以获取它一天完成了哪些工作,APP有什么问题。
以上就是关于小王子功能的介绍,下图是我们的开源地址,可以扫二维码去查看具体的开源代码。
浏览1642次
浏览5268次
浏览7439次
浏览9837次
浏览2190次
浏览5707次
2025-06-20 深圳
2025-04-19 南京
2025-08-15 上海
2025-10-23 上海
打开微信扫一扫,分享到朋友圈