最开始做性能测试的时候,会有些摸不着头脑,虽然之前一直做客户端开发,但对于性能测试这块的研究比较少,于是试着找了一些工具,看了看相关文档就开始动手了。有时候因为性能问题比较明显就直接发现了,再之后遇到类似的性能测试需求,就按照上次的经验去做,有时候可能发现问题,也可能发现不了,还有些时候甚至是在浪费时间。随着经验的逐渐增加,我慢慢意识到,以前的很多测试方法既盲目又不利于沉淀,对于较为成熟的软件,这样做的测试有效性往往比较低,运气好才会发现问题,如果是较深层次的问题,要么遇不到,要么遇到了也找不出原因。因此有必要总结出一套标准的测试流程和方法,来提高测试的有效性。
前言
针对上面提到的问题,我之前已经陆续发表过一系列性能测试的白皮书:
- APP耗电量测试白皮书
- APP网络性能测试白皮书
- APP适配测试白皮书
后续我还会针对其他具体性能指标来展开写,这里先来聊聊针对基础性能指标的一个测试和准出标准。我参考了一些常见的性能测试方案以及过去对于客户端性能测试的一些经验,总结出了一套客户端产品进行基础性能测试的标准流程和集成卡口,下面介绍一下针对Android和iOS两端的准出标准,可以参考这种方式去做,但具体数据要根据应用的线上性能基线和经验值去制定(下面的数字部分由于不影响大家参考所以就打码了)。
测试设备建议选取中端设备,有时间的同学也可以针对高中低不同的设备做区别测试。
下面测试过程中用到的掌中测是阿里百川的一款产品,大家可以到阿里百川官网去注册体验。
Android
页面加载时间
数据来源:
推荐方法:
- 用 Debug 包通过摇一摇唤出掌中测图标,选择应用性能 -> 页面加载;
- 进入待测页面;
备用方法:
- 开启Android自带的视频录制功能或者从应用市场下载录屏大师app,把页面操作录下来,传到mac上;
- 用mac自带的QuicktimePlayer打开视频,在“编辑”菜单中点击“修剪”;
- 通过数帧的方式查看从页面点击到第一屏数据加载出来的时间差,此时间差就是用户真实感知的页面加载时间;
集成要求:
页面流畅度(帧率)
数据来源:
推荐方法:
- 用 Debug 包通过摇一摇唤出掌中测图标,选择应用性能 -> 帧率;
- 滑动页面,实时记录fps值;
备用方法:
- 打开开发者选项;
- 打开GPU呈现模式分析和调试GPU过度绘制;
- 滑动被测页面,实时记录fps值和曾在过度绘制的区域(深红色);
集成要求:
CPU
数据来源:
推荐方法:
- 用 Debug 包通过摇一摇唤出掌中测图标,选择应用性能 -> CPU;
- 实时记录CPU值;
备用方法1:
- 打开开发者选项,开启USB调试;
- 打开终端命令行,输入adb shell top -n 1 | grep -v 'grep' | grep XXX(包名),记录CPU的值;
备用方法2:
- 准备一台Root过的手机,安装被测应用;
- 手机连接到AndroidStudio 并在菜单栏“Run”中打开Profiler;
- 首次进入被测页面,在CPU栏查看当前值,并记录;
静默CPU利用率获取:
- APP前台切到被测页面,手机闲置15分钟,多次获取当前CPU值,CPU利用率应该在0-10%内;
- APP切到后台需停止消耗CPU的逻辑,如传感器、定位等,避免用户反馈APP在后台耗电;
集成要求:
内存
数据来源:
推荐方法:
- 用 Debug 包通过摇一摇唤出掌中测图标,选择应用性能 -> 内存;
- 首次进入被测页面,等第一屏数据加载完成,记录内存(javaHeap、nativeHeap)的值A1;
- 退出页面,等第一屏数据加载完成,记录内存值(javaHeap、nativeHeap)B1;
- 再次进入被测页面,等第一屏数据加载完成,记录内存的值A2;
- 退出页面,记录内存值B2;
- 多次重复此操作,检查内存是否持续增加;
- 记录被测页面内存(javaHeap、nativeHeap)值(A1-B1);
备用方法1:
- 打开开发者选项,开启USB调试;
- 操作步骤同推荐方法,记录方式改成:打开终端命令行,输入adb shell dumpsys meminfo packageName | grep -A 1 Java,记录javaHeap、nativeHeap的值;
备用方法2:
- 准备一台Root过的手机,安装被测应用;
- 手机连接到AndroidStudio 并在菜单栏“Run”中打开Profiler;
- 首次进入被测页面,操作步骤参考推荐方法里的描述;
为了避免链路太长,其他页面进程运行产生的内存干扰,最好的办法是通过应用扫码进入页面,产出性能报告的话还是要尽量模拟用户的操作路径,从而得到更真实的数据。
集成要求:
- 无内存泄露 ;
- 内存增量控制在一定值,没有无限增加的情况;
- 退出页面内存恢复到近似原始值 ;
- 超过达标值的必须在页面不可见或收到内存报警时释放内存(onLowMemory) ;
- Android系统8.0+设备,图片使用的内存是native内存,故单独处理;
iOS
页面加载时间
数据来源:
推荐方法:
- 用 Debug 包点击掌中测图标,选择应用性能 -> 页面加载;
- 进入待测页面;
备用方法:
- 开启iPhone自带的视频录制功能,把页面操作录下来,传到mac上;
- 用mac自带的QuicktimePlayer打开视频,在“编辑”菜单中点击“修剪”;
- 通过数帧的方式查看从页面点击到第一屏数据加载出来的时间差,此时间差就是用户真实感知的页面加载时间;
集成要求:
页页面流畅度(帧率)
数据来源:
推荐方法:
- 用 Debug 包点击掌中测图标,选择应用性能 -> 帧率;
- 滑动页面,实时记录fps值;
备用方法:
- 获取代码权限,使用Xcode编译成功,打开instrument -->Frames Per Second ;
- 滑动被测页面,实时记录fps值;
集成要求:
CPU
数据来源:
推荐方法:
- 用 Debug 包点击掌中测图标,选择应用性能 -> CPU;
- 实时记录CPU值;
备用方法:
- 获取代码权限,使用Xcode编译成功,打开instrument -->ActivityMonitor;
- 首次进入被测页面,记录CPU值;
集成要求:
CPU
数据来源:
推荐方法:
- 下载Debug包,使用掌中测实时查看内存曲线,为了避免首页的内存释放造成的影响,所以从扫码历史页面进入;
- 首次进入被测页面,等第一屏数据加载完成,记录内存的值A1;
- 退出页面,等第一屏数据加载完成,记录内存值B1;
- 再次进入被测页面,等第一屏数据加载完成,记录内存的值A2;
- 退出页面,记录内存值B2;
- 多次重复此操作,检查内存是否持续增加;
- 记录被测页面内存值(A1-B1);
备用方法:
- 获取代码权限,使用Xcode编译成功,打开instrument -->Allocation ;
- 首次进入被测页面,记录内存的值A1;
- 退出页面,记录内存值B1;
- 再次进入被测页面,记录内存的值A2;
- 退出页面,记录内存值B2;
- 多次重复此操作,检查内存是否持续增加;
- 记录被测页面内存值(A1-B1);
集成要求:
- 无内存泄露 ;
- 内存增量控制在一定值,没有无限增加的情况 ;
- 退出页面内存恢复到近似原始值 ;
- 超过达标值的必须在页面不可见或收到内存报警时释放内存(didReceiveMemoryWarning);
内存可做差异化,低端机需满足上述要求,中高端机可以使用更多内存。
想要明白些道理,遇见些有趣的事 —— 离岛