app客户端性能测试
app客户端的性能测试,主要是指app运行操作过程当中,监测当前手机系统的一些性能指标,以此来确定app的性能是否会影响到用户的体验。app的性能指标主要包括以下几个:
- 启动速度
- CPU占用率
- 内存占用率
- 电量消耗
- 流量消耗
- 流畅度
测试方案
1.启动时间
手机APP的启动时长是一个很容易被用户感知的性能指标,启动时长过长会让用户极不愿意继续等待。因此启动时长是一项比较靠前的性能指标。APP的启时长分为两种情况,一种是冷启动时间,另一种是热启动。
- 冷启动:应用序首次启动,进程首次创建并加载资源的过程
- 热启动:指app没有被后台杀死,仍然在后台运行,通常我们再次去打开这个app,这种启动方式叫热启动
场景设计
- 冷启动:清除后台所有应用,等待数秒 ,启动软件
- 热启动:切换到桌面,等待数秒 ,重新切换回应用
测试方法
- 使用adb命令进行测试
- 冷启动:应用进程首次启动
- adb shell am start -W 包名/界面名
- 热启动:切换到主页后再启动应用
- adb shell input keyevent 3
- adb shell am start -W 包名/界面名
结果分析:
通过adb命令可获取的时间如下:
- ThisTime :该界面 ( activity ) 启动耗时(毫秒)
- TotalTime :应用自身启动耗时 = ThisTime + 应用 application 等资源启动时间(毫秒)
- WaitTime :系统启动应用耗时 = TotalTime + 系统资源启动时间(毫秒)
如何确定启动时间是否符合标准?
- 根据用户体验
- 和以往版本进行对比
- 横向对比,和同类产品一起测试,不超过同类产品的1倍
2.流畅度(FPS)
FPS是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。FPS是测量用于保存、显示动态视频的信息数量。每秒钟帧数愈多,所显示的动作就会愈流畅。
- FPS(1s内游戏画面或者应用界面真实平均刷新次数,俗称帧率/FPS)
- AVG(FPS):平均帧率(一段时间内的平均FPS)
- Var(FPS):帧率方差(一段时间内FPS方差)
- Drop(FPS):降帧次数(平均每小时相邻的个FPS点下降大于8帧的次数)
- Jank(1s内卡顿次数)
- BigJank:1s内严重卡顿次数
- Jank(/10分钟):平均每十分钟卡顿次数
- BigJank(/10分钟):平均每十分钟严重卡顿次数
- FTime(上下两帧画面显示时间间隔,即认定为帧耗时)
- AVG(FTime):平均帧耗时
- Delta(FTime):增量耗时(平均每小时两帧之间时间差>100ms的次数)
PerfDog Stutter 定义:测试过程中,卡顿时长的占比。即Stutter(卡顿率)=卡顿时长/总时长
场景设计
打开被测软件的每一个页面进行测试
测试方法
在app上进行操作,使用adb工具采集数据
adb shell service call SurfaceFlinger 1013
结果分析:
结果返回的是16进制整数,需要进行转换
def get_fps(self):
"""
获取fps数据的
:param pck:
:return:
"""
cmd = "adb shell service call SurfaceFlinger 1013"
results = cmd_start(cmd)
c_fps = int(results[0].decode('UTF-8').split('(')[1].split(' ')[0], 16)
return c_fps
拿到帧数之后,可以获取下一秒的帧数,然后使用两次数据的差值计算帧率,给出示例代码,while 循环一直获取数据,手工或者appium自动化操作对应的用例场景即可
fps_a = perf_handle.get_fps()
time_a = time.time()
while True:
time.sleep(1)
fps_b = perf_handle.get_fps()
time_b = time.time()
fps = int(int(fps_b - fps_a) / int(time_b- time_a))
fps_a = fps_b
time_a = time_b
print(fps )
3.CPU利用率
某些场景下我们去使用App,可能会碰到手机会出现发热发烫的现象。这是因为CPU使用率过高、CPU过于繁忙,会使得整个系统无法响应用户,整体性能降低,用户体验变得相当差,主要关注的是cpu的占用率
- CPU Usage:传统cpu利用率,也叫未规范化cpu利用率
CPU 测试场景设计
测试点:
- 空闲时间(切换至后台)的消耗,基本没大应用使用cpu
- 在运行一些应用的情况下,cpu已占50%的情况下,观察应用程序占用cpu的情况
- 在高负荷的情况下看CPU的表现(cpu占用应是在80%以上)
具体场景: - 应用空闲状态运行监测CPU占用率,空闲状态:应用按Home键退到后台,不再占用系统的状态(通常- 是灭屏半分钟后),CPU占用率=0%
- 应用中等规格运行监测CPU占用率,中等规格:模拟用户最常见的使用场景,CPU占用率≤30%
- 应用满规格长时间正常运行监测CPU占用率,CPU占用率≤30%
- 应用正常运行期间监测CPU占用率峰值,应用正常运行:打开应用进行基本操作,CPU占用率≤50%
测试方法
使用adb工具采集不同场景数据
def get_cpu(self, pck=pck):
"""
获取cpu数据的
:param pck:
:return:
"""
cmd = "adb shell top -m 20 -n 1 -d 1"
results = cmd_start(cmd)
c_cpu = 0
for result in results:
result = result.decode('UTF-8')
if pck in result:
c_cpu = result.strip().split('%')[0].split(' ')[-1]
return c_cpu
结果分析:
返回的结果就是app当前所占用的cpu占用率
- 和自身app的上个版本对比
- 和竞品对比
- 自身app各个界面对比
4.内存
在Android系统中,每个APP进程除了同其他进程共享内存(shared dirty)外,还独用私有内存(private dirty),通常我们使用PSS(私有内存+比例分配共享内存)来衡量一个APP的内存开销
app内存有以下几个:
- VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
- RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
- PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
- USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS。
内存测试场景设计
- 空闲状态:切换至后台或者启动后不做任何操作,消耗内存最少
- 中强度状态:时间偏长的操作应用
- 强度状态:高强度使用应用,可以跑monkey来测试(通常用来测内存泄漏)
- 内存泄漏:指应用里的内存一直没有释放,内存一直增加 ,系统内存一直减少
测试方法
使用adb工具采集不同场景数据
def get_mem(self, pck=pck):
"""
获取mem数据的
:param pck:
:return:
"""
cmd = f"adb shell dumpsys meminfo {pck}"
results = cmd_start(cmd)
c_mem = 0
for result in results:
result = result.decode('UTF-8')
if "TOTAL" in result:
c_mem = int(int(result.strip().split(' ')[3]) / 1024)
# c_mem = int(int(result.strip().split(' ')[4]) / 1024)
return c_mem
结果分析:
返回的结果就是app当前所占用的内存使用率
- 退出某个页面后,内存是否有回落
- 进行某个操作后,内存是否增长过快
- 旧版本和新版本比较
- 新版本和竞品比较