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

83 阅读9分钟

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

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

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

推荐学习

【霍格沃兹测试开发】7天软件测试快速入门带你从零基础/转行/小白/就业/测试用例设计实战

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (上集)

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (下集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(上集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(下集)

【霍格沃兹测试开发】精品课合集/ 自动化测试/ 性能测试/ 精准测试/ 测试左移/ 测试右移/ 人工智能测试

【霍格沃兹测试开发】腾讯/ 百度/ 阿里/ 字节测试专家技术沙龙分享合集/ 精准化测试/ 流量回放/Diff

【霍格沃兹测试开发】Pytest 用例结构/ 编写规范 / 免费分享

【霍格沃兹测试开发】JMeter 实时性能监控平台/ 数据分析展示系统Grafana/Docker 安装

【霍格沃兹测试开发】接口自动化测试的场景有哪些?为什么要做接口自动化测试?如何一键生成测试报告?

【霍格沃兹测试开发】面试技巧指导/ 测试开发能力评级/1V1 模拟面试实战/ 冲刺年薪百万!

【霍格沃兹测试开发】腾讯软件测试能力评级标准/ 要评级表格的联系我

【霍格沃兹测试开发】Pytest 与Allure2 一键生成测试报告/ 测试用例断言/ 数据驱动/ 参数化

【霍格沃兹测试开发】App 功能测试实战快速入门/adb 常用命令/adb 压力测试

【霍格沃兹测试开发】阿里/ 百度/ 腾讯/ 滴滴/ 字节/ 一线大厂面试真题讲解,卷完拿高薪Offer !

【霍格沃兹测试开发】App自动化测试零基础快速入门/Appium/自动化用例录制/参数配置

【霍格沃兹测试开发】如何用Postman 做接口测试,从入门到实战/ 接口抓包(最新最全教程)

【霍格沃兹测试开发】6 小时轻松上手功能测试/ 软件测试工作流程/ 测试用例设计/Bug 管理

【霍格沃兹测试开发】零基础小白如何使用Postman ,从零到一做接口自动化测试/ 从零基础到进阶到实战

【霍格沃兹测试开发】建议收藏全国CCF 测试开发大赛Python 接口自动化测试赛前辅导 / 项目实战