写点什么

软件测试学习笔记丨 App 性能测试方案 - 霍格沃兹

作者:测试人
  • 2024-05-22
    北京
  • 本文字数:2798 字

    阅读完需:约 9 分钟

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22578

App 客户端性能测试

app 客户端的性能测试,主要是指 app 运行操作过程当中,监测当前手机系统的一些性能指标,以此来确定 app 的性能是否会影响到用户的体验。app 的性能指标主要包括以下几个:

  • 启动速度

  • CPU 占用率

  • 内存占用率

  • 电量消耗

  • 流量消耗

  • 流畅度

测试方案

1.启动时间

手机 APP 的启动时长是一个很容易被用户感知的性能指标,启动时长过长会让用户极不愿意继续等待。因此启动时长是一项比较靠前的性能指标。APP 的启时长分为两种情况,一种是冷启动时间,另一种是热启动。

  • 冷启动:应用序首次启动,进程首次创建并加载资源的过程

  • 热启动:指 app 没有被后台杀死,仍然在后台运行,通常我们再次去打开这个 app,这种启动方式叫热启动

场景设计

  • 冷启动:清除后台所有应用,等待数秒 ,启动软件

  • 热启动:切换到桌面,等待数秒 ,重新切换回应用

测试方法

  • 使用 adb 命令进行测试

  • 冷启动:应用进程首次启动 adb shell am start -W 包名/界面名

  • 热启动:切换到主页后再启动应用 adb shell input keyevent 3adb 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 当前所占用的内存使用率

  • 退出某个页面后,内存是否有回落

  • 进行某个操作后,内存是否增长过快

  • 旧版本和新版本比较

  • 新版本和竞品比较

软件测试开发免费视频教程分享


发布于: 刚刚阅读数: 4
用户头像

测试人

关注

专注于软件测试开发 2022-08-29 加入

霍格沃兹测试开发学社,测试人社区:https://ceshiren.com/t/topic/22284

评论

发布
暂无评论
软件测试学习笔记丨App性能测试方案-霍格沃兹_软件测试_测试人_InfoQ写作社区