让App飞久一点
此文已由作者杨晓授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
本文从作者所在项目进行的耗电量测试入手,介绍了移动端App耗电量测试的一些基本概念和方法,重点介绍了iOS应用的耗电量测试的一些实战经验。
耗电量测试介绍
什么是耗电量测试
耗电量测试是指测试App在运行过程中消耗的能量。设备运行期间消耗能量公式:
W = w * t = U * I * t
其中U为电池供电电压,I为电流值,t为测试时间。通常来说U可以认为不变,因此Q = I * t(mAh)可以作为消耗能量的值。对于平稳的测试过程,耗电量与测试时间成正比,因此可以通过平均电流 I = Q / t来评价耗电量水平。
为什么要做耗电量测试
电池电量几乎是移动设备最受限的资源,对于长期运行的App来说,耗电量会直接决定电池的续航时间。因此App的耗电量也是移动端App性能的一个评价标准。
什么App要做电量测试
尽管App的耗电量对移动设备影响巨大,但是并非所有的App都需要进行耗电量测试。通常来说,需要持续开启或后台运行的App,耗电量对设备续航时间的影响更为显著,才需要启动耗电量专项测试。
通常而言,有需求进行耗电量测试的App都会有性能热点,如CPU或GPU计算量大,网络通信频繁,长期调用摄像头等系统硬件,等等,也有可能兼而有之。
如何做电量测试
电量测试的通用方法
通常电量测试的方法有如下几种:
调用系统提供的Api对电量进行记录
在代码中插入获取电量信息的代码,记录结果
通过电力计量芯片来记录耗电量信息
调用系统API方法
Android系统已经提供了电量的Api,由杭研QA开发的Emmagee工具也可以对单个Android的应用进行实时耗电量的记录,十分好用。
iOS系统没有开放的Api接口可以直接获取电量使用信息,只能通过开发者模式记录测试过程中的耗电量信息,并在Instruments中查看。这种方法和在Xcode中调试App获取到的电量信息一样,只能精确到5%,精度较低。具体方法将在本文稍后给出。
代码注入方法
第二种方法是在代码中注入获取电量信息的代码,之后可以通过统计数据来对App的耗电量进行分析。这种方法的优点在于,可以在获取电量信息的同时获取到App的运行情况等信息,便于判断性能热点。但是缺点也是显而易见的,需要将测试代码注入到开发代码中,通用性不好,影响开发代码。
硬件方法
第三种方法需要将设备的电池拆卸下来,在电池和设备之间接入电力计量测试单元(芯片),通过串口对芯片数据进行实时采样,进行记录。
这种方法得到的数据较为准确,通过稳压电源供电还可以进一步去除电池剩余电量引起电池电压变化对耗电量产生的影响,使得测试条件更稳定。优点是不需要对App做任何处理,可以充分还原App的实际使用情况。不过缺点也是显而易见的,现在的移动设备大部分都是不可拆卸电池,接入电量测试单元也就意味着会对设备进行拆解,成本较高;限于成本,无法对大量不同型号的设备进行电量测试。
iOS系统测试耗电量的方法
iOS系统可以通过设置->开发者->Logging对耗电量信息进行记录。执行完毕后,可将设备连入电脑,通过Xcode的Instruments工具中的Energy Diagnostics查看。步骤如下:
开启Logging
由于此方法记录的是整机的耗电情况,因此需要关闭其他后台的应用和后台刷新数据开关等可能影响结果的设置。
点击设置->开发者->Logging,打开电量记录开关。(如图)点击Start Recording按钮,开始记录。
执行测试步骤
关闭Logging
执行完测试步骤后,同样在设置->开发者->Logging下,点击Stop Recording按钮,结束记录。
在Instruments中查看
将设备连接至Mac,打开Xcode->Instruments,选择Energy Diagnostics模板,选择File -> Import Logged Data From Device就可以看到耗电量、CPU、Wifi、网络流量等多种数据了(如图)。
电量(Energy Usage Level)的数据类似于15/20,可以解读为以此耗电水平持续工作1小时,可以耗尽设备电量的15/20。20/20意味着启动此耗电水平的App可以在满电量设备上工作1小时,1/20意味着可以工作20小时,以此类推。
耗电量的硬件测试方法
耗电量的硬件测试方法需要对设备进行一定的改造,其原理图如下所示:
将设备的电池拆除,或断开电池与机身的连接后,采用稳压电源为设备供电,并在供电线上接入电力计量芯片。电力计量芯片上有接口可以获取实时的电流数值,连入PC的USB串口后,可以通过脚本对实时电流进行采样。
在本项目的耗电量测试中,采用的是上文所述的第三种方法。公司的互娱MTL实验室和雷火MTL实验室均提供了相应的硬件和软件支持,可以实时展示电量数据,手动开启和关闭数据记录过程,通过脚本处理原始数据自动形成Excel报告。
电量测试实战
我所在的洞见项目是一款AR展示的iOS App,启动系统相机后,对实物进行扫描定位,成功后在屏幕中央展示3D模型并播放动画。持续调用系统相机、定位算法、模型渲染展示和播放动画均是耗电热点。
在测试过程中也发现设备发热非常严重,电池消耗速度快。由于算法对硬件有依赖,设备发热后可能导致其他问题,因此与产品和开发沟通后,确认需要对App的耗电情况进行测试和分析。
明确测试需求
在进行测试前,我们要与产品和开发充分沟通,明确电量测试的需求。并非所有场景都需要进行电量测试,要对耗电量性能的瓶颈进行分析,确定耗电量测试的需求以后再执行测试。
以我所在的洞见项目举例来说,会有用户登录、下载、扫描和播放动画过程。其中,用户会在较长一段时间处于渲染模型和播放动画阶段,因此,这两个阶段的耗电量会对设备续航产生决定性的影响。因此,我们决定首先对这两个阶段的耗电量进行测试。
通常来说,相机、GPU渲染、网络通信等会产生较高的耗电,需要对这些过程引起重视。也可以通过一些软件测试的方法确定耗电量热点以后再明确测试需求。
设计测试步骤
明确了测试需求以后,我们需要设计合理的测试步骤,并准备相应的App包和资料。测试步骤的设计与正常的测试用例并没有区别,还可以设计一些对照实验来辅助进行分析。
例如对于使用相机进行输入的App,拍摄不同类型的场景,进行测试。对于网络通信比较频繁的应用,在不同丢包和延迟的网络环境下进行测试。还有一些特殊的条件,例如我所在的项目,由于算法性能受到手机温度的影响,还需要在不同的手机发热情况下进行测试。
执行测试
执行测试用例时,按照用例设计完成准备工作后,点击PC上电量数据采样软件的“开始记录”按钮,开始记录数据。执行完测试步骤后点击结束记录,结束此次数据记录。
同样的,这个方法也是记录的整机耗电量,因此需要关闭后台应用,调整设置,使得结果更加接近单个应用的耗电情况。
完成所有测试内容以后,执行MLT提供的数据处理脚本就会生成一个Excel文件,提供了每个测试用例的统计数据(最大/最小/平均电流)和所有源数据。
测试结论
对于每次测试记录的原始数据,都可以通过脚本生成Excel报告,如下图所示
其中左侧4列分别为:t(s)采样时间点,i(mA)实时电流,Q(mAh)为累积消耗电量,I_average(mA)为当前平均电流。图标为以相对采样时间点为横轴,i、Q、I_average分别为纵轴生成的曲线图。
通过设计的对照测试用例,分析耗电量数据是否符合预期,定位耗电性能热点。
如何分析电量测试的数据
基于上述几种方法,除了iOS自带的电量记录精度较低以外,其他方法都可以获取到精确的耗电量数值。那么,怎么来看这些数值,是不是可以直接就由数值的大小来判断App的性能呢?
对于大部分App来说,耗电量的绝对数值没有特别重大的价值。其一,耗电量数据与硬件配置、机器工艺、系统版本等有着密切的关系,同一App在不同的机器上表现可能迥异。其二,开发对于App实现方式的耗电数值没有直观的预期,无法通过绝对数值来评价App性能。因此通过对比数据来评估测试数据、挖掘优化点是更加可行的方法。
数据的对比包括App内部的对比和与竞品的对比两类,比较常见的是与竞品进行对比。选择与竞品类似的场景,对比平均电流值,来分析App的耗电水平。对于一些前沿技术,没有竞品类似场景可以对比的,可以通过对技术复杂度的预估,和技术类似的产品进行对比。
另一种对比方式是与自身的其他测试用例结果进行对比。例如我所在的项目,通过对比首次执行测试用例持续60s时长,和执行完上述用例后,再次执行测试用例,持续60s时长的耗电量数据,发现第二种情况的耗电量有一定程度的提升,进而分析出机身温度对算法计算量的影响程度。
总结
耗电量测试是移动App特有的专项测试,App的耗电情况决定了手机的续航时间。QA可以根据项目需求决定是否进行耗电量测试,与开发充分沟通后,设计合理的测试用例和对照组,并对数据进行分析后形成报告,反馈给开发进行优化。
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 网易蜂巢(云计算基础服务)MongoDB服务重磅来袭
【推荐】 初步探索前端性能测试
【推荐】 如何玩转基于风险的测试