对于手游开发来说,移动设备的碎片化对兼容性有着严重的影响。日常测试中移动设备一机难求、手动测试耗时耗力、自动化测试脚本编写门槛较高…...针对这些问题我们尝试搭建了“智能兼容性测试”平台。希望通过这个平台方便快捷地为我们的产品质量保驾护航。
01 兼容性测试背景
兼容性测试指对所设计程序与硬件、软件之间的兼容性的测试。我们先介绍下为什么需要兼容性测试、常见的兼容性问题有哪些以及如何测试兼容性。
1.为什么需要兼容性测试
首先是严重的安卓碎片化,安卓系统碎片化通俗地讲是指整个安卓平台的差异化越来越大,主要表现在品牌、系统、分辨率等等的差异。下图是一个机型市场占有率分布图,每一个方格代表一款机型,我们可以看到安卓机型十分繁杂,每种机型或多或少都存在一定的差异,这就是安卓碎片化。
第二是CPU和GPU种类繁多,比如CPU我们熟知的就有Inter、英伟达、联发科等十几种。
然后近些年,很多厂商为了美观或者一些其他原因,开始出现各种各样的奇葩屏幕,比如曲面屏、刘海屏等。
2.常见的兼容性问题
下图在应用商店点击下载后,直接弹出提示“无法下载”,这是一个安装的兼容性问题。
再比如刚打开游戏的时候,屏幕的画面就出现很多异常小点,这是个花屏的兼容性问题。
下面这个图左侧手机摄像头的位置挡住了游戏的按钮,右侧的圆弧角也盖住了一部分设置按钮,这是一个异形屏遮挡的问题。
最后这个游戏内容无法填满整个手机屏幕,导致屏幕两侧有黑边,这是分辨率不兼容的问题。
3.如何测试兼容性
首先是测试机型的选择:
第一种是新上市的设备。比如iPhone13刚上市的时候,我们就会立刻进行采购,然后对雷火所有的游戏进行一次测试,让项目组第一时间处理兼容性问题。
第二种是高市场占有率手机(Top100机型)。我们平时会测试排名前100的设备,因为市场占有率高所以测试完top100之后其实就已经覆盖了大部分用户。在测试完top100之后,会进行一个机型参数覆盖的检查。比如下图这次测试,通过检查发现没有测试到OPPO手机的安卓4系统版本,我们就会补测几台安卓4的OPPO设备,来确保测试的覆盖率。
选择好测试机型以后,需要确定测试内容,主要有以下几点:
-
重装:即覆盖安装,在已安装某app的情况下再次安装,新安装的app可以将原先app覆盖,主要用在不同版本间测试。
-
启动:启动游戏后不会发生闪退、黑屏等情况。
-
输入法:可以弹出键盘并正常输入文字。
-
触屏操作:触屏有响应即可。
-
屏幕旋转:游戏可以根据重力感应,旋转屏幕画面到匹配位置。
-
界面:测试的整个过程中所有的画面显示不能出现黑边、过曝、材质丢失、UI遮挡、控件畸变等等。
-
锁屏返回:进入游戏后将设备锁屏再解锁,游戏不需要重新加载打开,可以回到锁屏前的游戏场景。
-
后台返回:与锁屏一样,进入游戏后切到主界面后点击游戏,游戏不需要重新加载打开。
-
杀死进程:通过杀进程的方式关闭游戏,游戏可以正常关闭,无后台残留。
-
音频:测试全过程不能出现音效丢失、电流音等。
02 MTL兼容性测试服务
雷火MTL针对不同的兼容性测试需求,推出了四款兼容性测试服务,用来测试手机终端因碎片化导致的兼容性问题,保证产品高效运行。接下来介绍下MTL兼容性测试服务。
1.专家兼容性测试(手动)
由MTL经验丰富的测试专家,根据项目组具体的需求,深入用户体验,手动测试所有的安卓,iOS主流机型。
特点:
-
十年测试经验金牌团队。
-
覆盖安卓、iOS主流机型。
-
问题由测试专家定位,精准、可靠。
-
深入用户体验。
-
和用户体验完全一致的测试,但测试报告周期相对较长。
适用场景:
游戏新功能上线或有大改动时。
2.快速兼容性测试(自动)
云端自动化兼容测试服务,覆盖市场主流机型,多设备同时测试,快速发现应用兼容性问题。
特点:
-
无需人工干预。
-
24小时随时待命。
-
最快十分钟生成测试报告。
-
测试功能点较基础(安装、启动、随机点击、关闭、热启动、卸载)。
适用场景:
DailyBuild安装包的可用性检查。
3.深度兼容性测试(自动)
MTL根据需求定制化测试脚本、覆盖游戏最核心的场景,深度测试发现应用兼容性问题。
特点:
-
根据需求,定制化测试场景。
-
脚本编写与测试执行由MTL完全托管,无需项目组人力维护。
-
测试专家追踪定位问题。
-
24小时随时待命。
适用场景:
重要版本安装包核心功能兼容性检查。
4.智能兼容性测试(AI)
自动化测试、人工智能和兼容性测试的结合,通过人工智能的方式遍历游戏每个场景,检查所有的UI兼容性问题。
特点:
-
人工智能测试脚本,无需人力编写脚本。
-
遍历所有主要场景UI。
-
人工智能异常图片检测。
-
测试专家追踪定位问题。
-
24小时随时待命。
适用场景:
游戏场景UI基本功能遍历测试。
03 真机集群的搭建
这次我们主要介绍智能兼容性测试是如何实现的,它主要由下面几部分组成:
首先是真机集群(硬件)因为兼容性测试需要一定量的手机作为基础,所以我们需要搭建一个稳定的设备集群。如果我们将它比喻成一个人的话,他就类似于我们的骨骼,是整个框架的基础。
然后是保证真机集群稳定性的设备监控和自动化(软件)的实现,扮演了类似肌肉和血液的角色。
最后如何让自动化更加智能,我们加入了AI算法,他就等于是人的大脑。
通过这几部分我们就组织好了一个完整的智能兼容性测试框架。接下来介绍第一部分:真机集群的搭建。
搭建真机集群第一个问题就是:设备如何连接服务器。手机连接服务器必须要满足两个条件,数据的传输和持续供电,理论上只需要通过一根USB数据线就可以解决。但是实际使用过程中还存在几个问题,比如
-
电脑上USB口不够用,我们不可能一台服务器上只搭载三四台手机。
-
供电不足,电脑USB口多是主板供电,很多游戏还处于开发阶段,对性能没有做过多的优化,有时会发生手机耗电大于供电的情况导致手机电量耗尽,自动关机。
-
电脑上的USB口有的是USB2.0有的是USB3.0数据传输的速度不能保证。
针对以上问题,我们引进了工业级的USB-HUB。它外扩了10个3.0的USB口,有独立的外接电源供电。
那么我们是否可以通过这个USB-HUB无限串联下去,让一台服务器上挂载几十上百台手机?通过实验测试单个服务器只能承受十几台手机的连接,连接手机过多adb无法承受,稳定性是很大的挑战,所以我们现在服务器和手机以1:10的比例搭建。然后就有了下图这个最简单的设备集群。
这就是平时工位的一个状态,电脑上连接了十几台设备,当然我们实际投入使用的时候不可能将设备插在工位上,我们找了一个机柜来放置我们的手机,搭建好这个机柜后我们就开始投入使用了。
使用一段时间后,暴露出了几个新的问题:
-
网络不稳定:我们手机连接的是公司的网络,网速时快时慢,有时还会断开连接。
-
布线杂乱难以维护:从上图可以看到为了线路整齐,我们把数据线都用束线带扎了起来;但是如果某条USB数据线坏了需要更换的时候,我们就不得不重新解开束线带,更换好数据线再扎回去,维护起来十分麻烦。
-
手机长时间运行温度过高:温度过高不仅会影响手机的性能还会降低电池的寿命。
-
手机电池鼓包:不仅影响设备的续航还有安全性问题,比如:电池起火爆炸。
接下来我们依次来解决这些问题。
网络问题:引进了企业级的无线AP,专网专用;为了防止其他wifi的影响,我们还采购了一个可以屏蔽外部信号的机柜。
布线问题:既然需要采购屏蔽柜,不如直接对柜子进行了一些自定义的结构设计,来解决排线布局的问题。
环境温度问题:我们在机柜上配置了一个空调加上温度监控模块,可以使机柜内部温度保持在22度的恒温环境。
于是我们的机柜就从最早单薄的“铁皮柜”升级到了具有“信号屏蔽和恒温系统”的新款机柜。
电池鼓包问题:升级了机柜并没有解决电池鼓包的问题。
当我们出现第一个电池鼓包的时候,我们就做了第一个尝试:手机跳过电池直接用稳压直流电供电。
我们先将鼓包的电池拆除,看下内部的构造。
首先是主板和保护芯片上的电源接口。保护芯片上两侧为正负极口用于连接电池的正负极。
不同的手机主板接口各式各样,选择一个匹配的接口连接到手机,然后用一个稳压直流电源直接供电,发现可以正常开机使用。
也可以将USB线剪开,正负极连接到保护芯片的正负极,同样可以正常运行。
简单的尝试后说明稳压电源直接供电的方案是可行的,但是要正式投入使用,电线的连接必须达到一个工业级的安全水准,而且拆掉电池之后意味着手机只能放在机柜内使用。于是我们进行了进一步的探索,首先分析电池鼓包的原因。
苹果官方锂电池说明
官方电池保养建议
上图两个分别是苹果对锂电池的一个使用说明和电池官方对电池保养的建议,总结下电池鼓包的原因就是环境温度过高和电池过充(电量到了100%还在继续充电)。环境温度我们通过机柜空调已经解决了,那么需要解决的就是电池过充的问题,也就是说我们需要对100%电量的手机暂停充电。
在查了一些资料以后我们找到了一款智能USB-HUB,可以远程控制USB的连接和断开,这样就能可控地对手机进行充放电。下面是一个智能USB-HUB逐一通电的演示,可以看到手机按顺序一个个连接,后面两个的顺序是受手机性能影响所以最后一个先亮。
智能USB-HUB上下电演示
到这里碰到的硬件方面问题就差不多都解决了,接下来看下软件部分是如何实现的。
04 设备监控维护
1.手机状态监控
我们需要监控的状态主要有这几个:
-
连接状态:要使用手机,手机和服务器必然是需要正常连接的。
-
运行内存:安卓设备在使用一段时间后空闲运行内存会逐渐降低,4G的设备使用一段时间后可能就只剩1个多G的运行内存可供使用,影响游戏的运行。
-
电池电量:我们很多游戏都还处在开发阶段,游戏性能相对较差,有可能出现耗电大于充电情况,如果刚开始电量过低,在测试途中会因为电量不足中断测试。
-
硬盘容量:现在的手游小一点的一两个G,大点的八九个G甚至十几个G,而一些比较老的机型本身内存只有8G、16G,所以需要监控硬盘容量,保证游戏的正常安装。
我们是如何监控这些状态呢?以安卓为例,我们先介绍一个工具叫adb。adb 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。
第一步:要使用adb连接手机,我们需要在手机的开发人员选项开启USB调试。
第二步:在命令行打入adb devices 就可以看到手机状态。也可以通过-s加上uuid的方式指定某台设备,使用shell命令进入设备,这就是adb的基本操作。
第三步:我们通过adb命令来获取设备信息。比如获取空闲运行内存,通过adb shell dumpsys meminfo命令可以获取到以下信息,Free RAM这行数据就是我们需要的剩余运行内存。
再比如电池电量:通过adb shell dumpsys battery命令可以获取以下信息,Level:50就代表还有50%的电量。
其他参数同理可得,都可以通过相应的命令来获取对应的信息。获取到这些参数后,我们搭建了一个网页来显示他们的状态(如下图):机柜和网页的手机位置是一一对应的,标记了每台手机的状态,为了演示效果,我们拔掉了第三列最后一台设备,这时网页端就会显示一个USB断开连接的标记。
在知道手机处于异常状态后,为了节约人力不需要一次次往机房跑,想要远程地对手机进行维护。一些简单的手机重启、后台清理操作可以通过一句命令就解决,一些比较复杂的情况可能需要根据手机的实时画面,然后对他进行操作。
2.手机远程维护
首先先看下我们已经实现的远程维护的效果。比如:下面这个设备wifi异常,我们可以直接远程连接设备来对他进行修复。
实现这个功能主要有两部分:实时画面查看和远程操控。
第一部分实时画面查看:
先介绍下视频原理:连续的图像变化每秒过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面就是视频。
所以有了最简单的构思:先是获取屏幕数据流通过adb进行tcp转发到服务器,服务器接收到数据后,在前端进行一个展示,如下图:
如何获取屏幕数据流是最关键的一步。经过调研了解到现在获取视频流一般使用stf框架的minicap来实现,但是它的兼容性比较差,很多新款手机不支持。我们这里采用网易自研的UI自动化测试工具:Airtest。他集成了minicap、javacap等多个工具,并封装了现成的接口可以调用,十分方便。除此之外,他还有图像识别、控件识别、跨平台等多个优点,将会在后面的自动化模块做详细介绍。
这里我们介绍如何通过Airtest获取手机当前帧的数据。
首先初始化Android对象:
然后通过get_frame_from_stream函数获取数据,并将结果打印出来:
发现输出的是一串数据流:
我们将数据流做一个可视化,验证数据是否正确,发现显示的是手机画面:
接下来通过websocket服务端发送数据:
最后客户端接收数据并显示在网页端。
可以看到画面的实时性和流畅度都比较高,比较符合我们的预期。那么接下来只需要解决操控的问题了。
第二部分远程操控:
网页端的操控和实时画面显示实现方式差不多。只不过前端需要计算x,y以及操作的类型发送服务器,然后服务器通过Minitouch、maxtouch、adb等工具对手机进行操作。
05 自动化实现
前面介绍到Airtest实时画面的传输。这里介绍下他强大的自动化功能。他主要特点有:
-
图像识别:可以根据脚本内的截图与手机画面图像进行匹配,从而对匹配到的图像进行拖动、点击等操作,不过图像识别的误差比较大,效率也相对较低,一般会采用第二种方案,控件识别。
-
控件识别:需要在游戏内打入pocoSDK,打入之后可以直接获取游戏内所有控件的大小和坐标,然后对控件进行操作,这个方式比较准确,效率也比较高。
-
跨平台:支持Android、iOS和Windows平台。
1.Airtest基本功能
我们先来了解下Airtest的一些基础功能。下图是一个AirtestIDE窗口:左下角是一个UI控件树可以获取的手机上所有的控件,这时我们选择一个叫音乐的app,中间就会显示这个控件的详细信息,包括他的大小位置等。右侧是手机画面,上面是脚本编辑框,比如我们写上一句poco(“音乐”).click()就实现一个点击音乐这个app的操作。
运行演示
Airtest虽然本身已经很强大了,但是到具体使用时我们还有一些定制化的需求,所以我们对他进行了二次开发:
原生的airtest日志可读性较差,我们添加了接口实现了重要日志的分离。
自带的断言功能会直接中断测试,于是我们添加了软断言的接口,让我们在断言后继续运行测试脚本。
雷火的游戏大多都是使用Unity制作的,但是UnityPoco的稳定性不是很好,所以我们加入了断线重连的机制。
至此自动化工具准备完成,我们就可以搭建自动化框架了。
2.自动化和智能化的实现
自动化框架主要有三部分:
-
用于交互的Web端。
-
控制任务调度的Master服务器。
-
连接手机执行脚本的slave服务器。
上图的详细过程是这样的:
-
用户在web端提交测试任务
-
master服务器将任务分发到对应的slave开始执行
-
执行过程中用户也可以通过视频流查看手机的运行效果
-
运行完成后将结果返回给master,生成测试报告
至此,整套自动化框架就搭建完成了,接下来我们需要使我们的自动化更加智能。智能主要体现在脚本的智能化和检查的智能化。
智能脚本:
我们前面介绍过Airtest可以获取到手机的UI控件树,从而拿到每个控件的坐标大小等信息,我们通过这些控件信息来实现脚本的智能化。主要流程如下图:
-
获取UI控件树信息。
-
将UI树信息发送给人工智能服务器。
-
AI的计算(具体是如何计算的后续会有专门篇章做详细的介绍)。
-
服务器返回下一次需要进行的操作。
-
接收到下次操作后,执行这个操作。
-
重新获取树状结构
这么一个循环就可以实现脚本的持续运行。
下面是实际的运行效果:
智能异常检测:
在运行脚本同时我们会对手机进行一个智能的异常图片检测(后续会有专门篇章做详细的介绍),检测完成之后还会有专门的测试专家进行人工审核。比如下面这张图,算法检测出来存在黑边问题,他会将黑边区域标记出来,我们审核的时候看到确实存在黑边,就会在bug确认处打上勾。在审核完成之后就可以发布报告了。
06 网页演示
最后我们来看下智能兼容性测试整套运行流程:
-
选择测试设备和安装包提交测试。
-
运行过程中查看测试进度和实时画面。
-
运行结束后查看报告,除了简单的数据统计还有每台设备详细数据(log、截图等)。
-
集成Pease性能采集工具,全程记录性能。
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 759968159,里面有各种测试开发资料和技术可以一起交流哦。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。