07. APP性能专项测试
07. APP性能专项测试
1. APP性能测试常见指标
性能
- 是衡量APP质量的一个重要指标
常见的性能指标有
- 内存,CPU,流量,电量,启动速度,流畅度、稳定性等
性能测试关注点
APP使用时对CPU、内存的占用情况;
APP使用时是否流畅等
APP使用时,电量流量的消耗情况;
APP的启动时间是否过长;
APP是否能长时间稳定运行
2. 性能专项1-内存
1. 性能内存基础知识- 内存监控指标
每个程序运行时都需要将代码和数据放入内存中,内存不足则程序无法正常运行。
SoloPi工具提供了两个内存的监控指标:PSS和Private
Private (clean and dirty) RAM(私有内存):
- 进程独占内存,也就是进程销毁时可以回收的内存容量。
- 通常而言,Private Dirty RAM是最为重要的,因为该部分所有的内容都只处于RAM中,不会使用分页机制将其map到硬盘。Private Dirty RAM包含,所有在App内部(也就是说不包含系统创建的)所创建的Native Heap和Dalvik Heap。而与Zygote进程共享的内存区域为Shared/Swapped Dirty RAM。
- dirty与clean的区别
- clean即干净数据,指该区域的数据与硬盘数据一致,不需要回写即可回收该区域内存
- 而dirty正好相反,指脏数据,要回收该区域,必须先回写到硬盘。
PSS(Proportional Set Size 实际使用内存):
- 将跨进程共享的内存也加入进来, 进行按比例计算PSS。这样能够比较准确的表示进程占用的实际物理内存。
- PSS指App实际占用的物理内存大小,除了Private RAM之外,还包括与其他进程共享的内存区域(在Android都是以page为单位来分配内存的,通常page size为4KB)。注意,在计量与其他进程共享的内存大小时,是平均分配的。PSS = Private
RAM + Shared Dirty RAM / 共享进程数
当进程死亡之后,其他进程的PSS就会变大,所以我们可以通过创建新的进程来缓解内存压力。
2. 内存问题的现象
内存正常曲线图
内存异常曲线图
常见的内存问题
内存泄漏:
- 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
- 内存的曲线持续增长(增的远比减的多)
内存溢出:
- 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory
- memory leak 会最终会导致 out of memory!
- 内存的曲线,一定是因为有内存泄露才会出现。内存持续增加突然降为0 (应用停止运行)
内存问题产生的影响
程序实际使用的内存PSS持续增长 —— 可能是内存泄漏
程序出现crash(崩溃) —— 可能是内存溢出
3. 案例-性能内存测试
需求
- 打开TP商城单商户,进入首页-我要拼团,上下滑动动态2分钟,内存指标正常。
测试方法
- 打开SoloPi工具,配置内存监控
- 进入TP商城单商户APP,操作上述业务,观察运行时的内存指标
- 查看内存运行结果
- 检查程序实际使用的内存PSS是否持续增长
- 检查程序是否出现crash
3. 性能专项2-CPU
1. 性能CPU基础知识- CPU时间片
每个程序运行都需要占用CPU,那么单CPU的机器是如何同时运行多个程序的?
- 时间片
- 即CPU分配给各个程序的时间,每个程序被分配一个时间段,称作它的时间片,即该程序允许运行的时间
2. CPU监控指标
SoloPi工具提供了两个CPU的监控指标:全局占用CPU和应用进程CPU
全局占用CPU
整机的CPU使用水平,即当前手机的CPU整体使用率。
计算公式:
- 在 Linux 系统下,CPU 利用率分为用户态、系统态和空闲态
- 用户态:表示 CPU 处于应用程序执行的时间
- 系统态:表示系统内核执行的时间
- 空闲态:表示空闲系统进程执行的时间。
- CPU 使用率 = CPU 执行非系统空闲进程时间 / CPU 总的执行时间
- 在 Linux 系统下,CPU 利用率分为用户态、系统态和空闲态
应用进程CPU
- 表示自开机以来,应用程序消耗的CPU时间片的总数
3. CPU问题的现象
CPU使用率基线
- 如果有基线要求,CPU曲线图是否存在长期超过基线的现象(min)
- 如果没有基线, 行业默认90%
下图 : 蓝色曲线是问题曲线(长时间超过基线), 红色曲线是正常曲线
- **快速恢复 **: 清空后台运行的进程
CPU出现问题产生的影响
CPU使用长时间处于90%以上
手机发热、耗电量增加
反应变慢、引起ANR(Application Not Responding)
4. 案例-性能CPU测试
需求
- 打开TP商城单商户,进入首页-我要拼团,上下滑动动态2分钟,CPU指标正常。
测试方法
打开SoloPi工具,勾选CPU监控指标
进入TP商城单商户APP,操作上述业务,观察运行时的CPU指标
查看CPU运行结果检查
APP运行时CPU是否有快速飙升
检查APP运行时CPU是否长时间处于90%以上
保存CPU详细数据后,可以查看CPU详细的数据统计。
4. 性能专项3-流量
1. 性能流量基础知识- 流量介绍
手机上网时消耗的流量需要收费的,因此流量测试是app性能测试中比较重要的一项。 (须使用真机+SIM进行测试)
流量(指网络流量)
用手机打开APP进行互联网操作时,会和服务器之间交换数据,手机流量就是指这些数据的总大小。
数据报文是包含手机上下行的报文
注意事项:
上行消息是APP发送给服务器的报文,下行消息是APP接收的服务器的报文
但上行消息不一定都是请求消息
- 例如:用百度网盘上传资料
2. 流量的监控方法
网络
- 即网络流量,可以自动统计APP每秒上行和下行的报文大小
常用的流量测试方法
测试怎么测
- 使用了多长时间,消耗了多少流量,例如: 1小时持续刷新,查看流量消耗 (电量消耗同理)
统计测试法
- 利用工具获取应用程序收发的数据报文,统计出对应的流量
3. 案例-性能流量测试
需求
- 打开TP商城单商户,进入首页-我要拼团,上下滑动动态2分钟,获取消耗的网络流量
测试方法
- 打开SoloPi工具,勾选流量监控指标网络
- 进入TP商城单商户APP,操作上述业务,观察运行时的流量指标
- 查看流量统计结果
4. 流量优化方法
- 打开页面速度过慢,如何优化?
- 流量优化方法:
- 数据的压缩
- 不同数据格式的采用
- 控制访问的频次
- 只获取必要的数据
- 缓存机制针对不同的网络类型设置不同的访问策略
- 流量优化方法:
5. 性能专项4-电量
1. 性能电量基础知识 - 电量介绍
相对于PC来说,移动设备的电池电量是非常有限的,因此电量测试是app性能测试中比较重要的一项
电量测试
就是测试移动设备电量消耗快慢的一种测试方法。
一般是用平均电流来衡量电量消耗速度(电池生产厂家一般都采用mAh来标记电池容量大小,平均电流越小,说明设备 使用时间就越长)
常见的耗电量大的场景
定位,尤其是调用 GPS 定位。
网络传输,尤其是非 Wi-Fi 环境。
屏幕亮度
CPU 运算:复杂的运算逻辑、死循环等会直接导致CPU负载过高,会导致耗电;
wake_locker(锁屏 - 解锁)时间和次数
2. 性电量的监控方法
常用的电量测试方法
测试怎么测
- 使用了多长时间,消耗了多少电量,例如: 1小时持续使用,查看电量消耗 (流量消耗同理)
系统自带接口
- 最新的iOS和Android系统内置的Setting里可以查看各个APP的电池消耗
- 该方案不能检测固定某一时间段内的电池精准消耗。
硬件检测
- 通过硬件可以精准地获得应用的电量消耗(如: PowerMonitor 硬件设备)
- 该方案测试时需要拆机,成本太高比较麻烦。
软件工具检测
- 通过第三方的软件来获取应用的电量消耗(如: AccuBattery、360省电王、SoloPi等)
- 该方案取决于第三方软件的计算准确性。
通过API计算应用电量消耗
- 过代码方式调用电量相关API接口,获取应用维度精细的电量消耗
- 该方案计算准确,但是计算方式复杂,难度高。
3. 测试结果分析
电量的测试结果分析
- 我们可以根据不同的业务场景测试出对应的电量消耗数据,但是是否有问题需要对比分析
对比方法
与基准数据对比。(基准数据来自于产品经理,或者以往数据积累)
横向对比,拉上竞品一起测(目前多数采用这种方法)
- 同样的网络、手机,相似的测试场景,最后对比我们的产品和竞品在耗电量方面的差距,给出优化建议
4. 案例-性能电量测试
需求
- 打开TP商城单商户,进入首页-我要拼团,上下滑动动态2分钟,获取消耗的电量
测试方法
打开SoloPi工具,勾选电量监控指标:电池
进入TP商城单商户APP,操作上述业务,观察运行时的CPU指标
保存电量详细数据后,可以查看电量详细的数据统计。
6. 性能专项5-启动速度
1. 性能启动速度基础知识- 启动速度介绍
APP启动测试
- 测试从启动app到主页面显示的时间,打开一个app等待的时间过长时就会有一种较差的体验。
APP启动:分为冷启动,热启动
冷启动:指app被后台杀死后,在这个状态打开app,这种启动方式叫做冷启动。
热启动:指app没有被后台杀死,仍然在后台运行,通常我们再次去打开这个app,这种启动方式叫热启动
2. 启动速度测试方法
- 问题1: devices offline (设备离线) 解决方案: 重启模拟器
- 问题2: devices not found (找不到设备) 解决方案: 重启模拟器
- 问题3: more than one devices emulater(连接了多个设备)
- 获取设备列表: adb devices
- 1. 断开不需要的设备: adb disconnect 手机ip/设备序列号
- 2. adb -s 设备序列号 xxx
查看当前运行的应用: 包名/Activity名称:
adb shell dumpsys window | findstr mCurrentFocus (推荐)
adb shell dumpsys activity | findstr mFocusedApp
adb shell dumpsys activity | findstr mFocusedWindow
adb shell dumpsys activity top
启动速度测试方法(Android):
注意:可以启动App的首个页面(android:exported="true" 在Activity开发中该属性用来标示:当前Activity是否可以被另一个Application的组件启动)
格式:adb shell am start -W 包名/Activity名 (-W 启动时获取启动时间)
**TP商城商户包名 /Activity名为 *:com.tpshop.malls/com.tpshop.malls.SplashActivity
该命令获取3个关键指标:
- ThisTime: 当前activityactivity启动耗时。
- TotalTime:应用自身启动耗时 = ThisTime + 应用application等资源启动时间,应用的启动时间,包括创建进程、App初始化、Activity初始化到界面显示。
- WaitTime:前一个应用activity pause的时间 + TotalTime
注意事项: 热启动和冷启动的启动速度测试命令完全相同冷启动的时间,一般大于热启动的时间
3. 案例-性能启动时间测试
- 需求
- 分别获取TP商城单商户冷启动和热启动时间
7. 性能专项6-流畅度
1. 性能流畅度基础知识- 流畅度介绍
什么是流畅度?
我们都知道动画片其实是由一张张画出来的图片连贯执行产生的效果,当一张张独立的图片切换速度足够快的时候,会欺骗我们的眼睛,以为这是连续的动作
反之,当图片切换不够快时就会被人眼看穿,反馈给用户的就是卡顿现象
2. 流畅度的监控指标
SoloPi工具提供了流畅度的监控指标:帧率FPS
FPS
即Frames per second:GPU在一秒内绘制的帧数。(简单理解为一秒内呈现给用户的图片数)
FPS值越高画面越流畅
流畅度问题产生的影响
想要让大脑觉得动作是连续的,至少是每秒10-12帧的速度
想达到流畅的效果,至少需要每秒24帧
60帧每秒的流畅度是最佳的,我们的目标就是让程序的流畅度能接近60帧每秒
注意事项:
- 当页面多为静态时,FPS值很小是正常的
- 页面数据多为动态加载时,FPS值比较大(建议在24帧以上)
3. 案例-性能流畅度测试案例
需求
- 打开TP商城单商户,进入首页-我要拼团,上下滑动动态2分钟(下滑1分钟,再上滑1分钟),记录FPS值。
测试方法
- 打开SoloPi工具,勾选帧率
- 进入TP商城单商户APP,操作上述务,观察运行时的流畅度指标
- 查看流畅度运行结果
- 保存流畅度详细数据后,可以查看 流畅度详细的数据统计。
8. 性能专项7-稳定性
1. 性能稳定性测试介绍
- 稳定性测试
- 通过长时间对应用程序进行无序操作,检验应用程序是否会出现异常。如闪退crash、无响应 ANR等。
2. 稳定性测试工具-Monkey
- Monkey是一个命令行工具,是由安卓官方提供的。
- 测试人员可以通过Monkey来模拟用户的触摸、点击、滑动以及系统按键等操作(操作事件都是随机的),从而实现对APP压力的测试和稳定性测试。(具体Monkey的使用在后续app自动化章节介绍)
- 开发人员结合 monkey 打印的日志和系统打印的日志,修改测试中出现的问题。
3. 稳定性测试的时机
- 一般需要等产品稳定了,bug比较少的时候,再用monkey去测试待测试应用的稳定性。
9. 小节
性能指标描述: 一定是某种时间内某种条件执行某种操作,性能指标如何
性能测试可以考虑和稳定性结合, monkey 测试时使用性能监控工具监控性能数据
例如:
2小时内持续刷新操作,性能如何?
持续运行8小时,性能如何?
1. 应用SoloPI工具进行APP客户端的CPU、内存、流畅度、流量、电量、启动速度测试(了解)
- CPU:CPU 使用率
- 内存:实际使用内存PSS
- 流畅度:界面滑动时FPS
- 流量:网络上行/下行报文数量
- 电量:程序运行时的平均电流
2. 应用adb命令进行APP客户端的启动速度和稳定性测试( 了解)
- 启动速度:冷启动速度、热启动速度
- 稳定性:Monkey模拟用户长时间运行