App性能测试方案

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当前所占用的内存使用率

  • 退出某个页面后,内存是否有回落
  • 进行某个操作后,内存是否增长过快
  • 旧版本和新版本比较
  • 新版本和竞品比较
1 个赞

perfdog使用的也是这个公式吗,数据也是通过adb获取的吗?