我们在使用各种 App 的时候基本会关注到:这款软件挺耗流量的?运行起来设备掉电有点快嘛?切换页面的时候还会有卡顿等现象?如果遇到有这些问题的 App 我们基本会将它请出我们的

我们在使用各种 App 的时候基本会关注到:这款软件挺耗流量的?运行起来设备掉电有点快嘛?切换页面的时候还会有卡顿等现象?如果遇到有这些问题的 App 我们基本会将它请出我们的爱机。由此可见软件是否受欢迎除了提供必要的功能外,流畅性、流量/电池消耗也是很重要的指标。

今天就来从我们测试人员的角度,谈一谈 App 验收测试过程中需要关注到一些指标项目:

  • 内存占用

  • CPU 占用

  • 流量耗用

  • 电量耗用

  • 启动时间

因为最近就着腾讯 TMQ 团队出版的《移动 App 性能评测与优化》这本书在看 App 性能测试这一块的东西,看着看着发现有些名词或者概念不是很明白,所以在看这块东西的时候,还要一边去查询一些其他的点,现在将这些点记录下来,也算是一篇读书笔记了吧,下面针对每一个方面的一些重要知识点进行了整理。

一. 内存

1. 内存泄漏

说到内存方面,最经典的内存问题当数内存泄漏。百度上对内存泄漏的定义是这样的:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。通俗点讲,在大部分应用中,会有一类功能是需要加载附加资源的,比如显示从网络下载的文本或图片。这类功能往往需要在内存中存放要使用的资源对象,退出该功能后,就需要将这些资源对象清空。如果忘了清理,或者是代码原因造成的清理无效,就会形成内存泄漏。

2. 垃圾回收

说到了内存泄漏,又不得不提到垃圾回收(Garbage Collector,简称 GC),内存中的垃圾,主要指的是内存中已无效但又无法自动释放的空间,除非是重启系统不然永远也不会还给操作系统。这样以来,时间久了当程序运行的时候就会产生很多垃圾,一方面浪费了不少内存空间,另一方面如果同一个内存地址被删除两次的话,程序就会不稳定,甚至奔溃。

在 Java 程序运行过程中,一个垃圾回收器会不定时地被唤起检查是否有不再被使用的对象,并释放它们占用的内存空间。但垃圾回收器的回收是随机的,可能在程序的运行的过程中,一次也没有启动,也可能启动很多次,它并不会因为程序一产生垃圾,就马上被唤起而自动回收垃圾。所以垃圾回收也并不能完全避免内存泄漏的问题。

另一方面,垃圾回收也会给系统资源带来额外的负担和时空开销。它被启动的几率越小,带来的负担的几率就越小。

3. 内存指标

内存指标有 VSS、RSS、PSS、USS,他们的含义分别是:

VSS:Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

RSS:Resident Set Size 实际使用物理内存(包含共享库占用的内存)

PSS:Proportional Set Size 实际使用的物理内存(按比例分配共享库占用的内存)

USS:Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS,一般测试中关注的比较多的是 PSS 这个指标。

4. 监控与分析工具

以下是几种常见的内存分析工具,具体使用方法这里就不详述了。

4.1 Memory Monitor

该工具位于 Android Monitor 下面,Android Monitor 是 Android Studio 自带的一个强大的性能分析工具,里面一共包含 5 个模块:Logcat、Memory、CPU、Network 及 GPU。

Memory Monitor 可以实时查看 App 的内存分配情况,判断 App 是否由于 GC 操作造成卡顿以及判断 App 的 Crash 是否是因为超出了内存。

4.2 Heap Viewer

该内存检测工具位于 DDMS 下面,在 Android Studio 里面可以通过 Tools-Android-Android Device Monitor 打开,Heap Viewer 可以实时查看 App 分配的内存大小和空闲内存大小,并且发现 Memory Leaks。

4.3 MAT

MAT(Memory Analyzer Tool),是一个被老生常谈的 Android 内存分析工具,它可以清楚的获知整体内存使用情况。虽然是 Eclipse 的工具,但也可以单独运行,不需要安装 Eclipse。

二. CPU

1. 时间片

时间片即 CPU 分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。

2. Jiffies

2.1 Jiffies的概念

要讲 Jiffies 需要先提到这两个概念:HZ 和 Tick

HZ:Linux 核心每隔固定周期会发出 timer interrupt (IRQ 0),HZ 是用来定义每一秒有几次 timer interrupts。例如 HZ 为 1000,就代表每秒有 1000 次 timer interrupts。
Tick:HZ 的倒数,Tick = 1/HZ,即 timer interrupt 每发生一次中断的时间。如 HZ 为 250 时,tick 为 4 毫秒(millisecond)。

而 Jiffies 为 Linux 核心变量,是一个 unsigned long 类型的变量,被用来记录系统自开机以来,已经过了多少 tick。每发生一次 timer interrupt,Jiffies 变数会被加 1。

2.2 查看 Jiffies 的方法

Linux 下使用命令 cat /proc/stat ,查看具体整机的 Jiffies,如图:

Linux 下使用命令 cat /proc/<进程id>/stat ,查看具体某个进程的 Jiffies:

3. CPU 使用率

在 Linux 系统下,CPU 利用率分为用户态、系统态和空闲态,他们分别代表的含义为:用户态表示 CPU 处于用户态执行的时间,系统态表示系统内核执行的时间,空闲态表示空闲系统进程执行的时间。

而一个 App 的 CPU 使用率 = CPU 执行非系统空闲进程时间 / CPU 总的执行时间,也可以表示为 App 用户态 Jiffies + App 系统态 Jiffies / 手机总 Jiffies。

4. CPU 过高会带来的影响

可能会使整个手机无法响应,整体性能降低,引起 ANR,导致手机更耗电,降低用户体验等。

三. 流量

1. 定义

我们的手机通过运营商的网络访问 Internet,运营商替我们的手机转发数据报文,数据报文的总大小(字节数)即流量,数据报文是包含手机上下行的报文。

2. 常用流量测试方法

2.1 抓包测试法

主要是利用工具 Tcpdump 抓包,导出 pcap 文件,再在 wireshark 中打开进行分析。

2.2 统计测试法

2.2.1 读取 linux 流量统计文件

利用 Android 自身提供的 TCP 收发长度的统计功能,获取 App 的 tcp_snd 和 tcp_rcv 的值,测试一段时间后再分别统计一次,用 tcp_snd

两者的差值得到发送流量,用 tcp_rcv 两者的差值得到接受流量。

2.2.2 利用 Android 流量统计 API

  • TrafficStats

Android 2.2 版本开始加入 android.net.TrafficStats 类来实现对流量统计的操作。

部分方法如下:

static long getMobileRxBytes() //获取通过移动数据网络收到的字节总数
static long getMobileTxBytes() //通过移动数据网发送的总字节数
static long getTotalRxBytes() //获取设备总的接收字节数
static long getTotalTxBytes() //获取设备总的发送字节数
static long getUidRxBytes(int uid) //获取指定uid的接收字节数
static long getUidTxBytes(int uid) //获取指定uid的发送字节数
  • NetworkStatsManager

Android 6.0 版本开始,为了打破了原本 TrafficStats 类的查询限制,官方又提供了 NetworkStatsManager 类,可以获取更精准的网络历史数据,也不再是设备重启以来的数据。部分方法如下:

NetworkStats.Bucket querySummaryForDevice(int networkType, String subscriberId, long startTime, long endTime) // 查询指定网络类型在某时间间隔内的总的流量统计信息NetworkStats queryDetailsForUid(int networkType, String subscriberId, long startTime, long endTime, int uid) // 查询某uid在指定网络类型和时间间隔内的流量统计信息NetworkStats queryDetails(int networkType, String subscriberId, long startTime, long endTime) // 查询指定网络类型在某时间间隔内的详细的流量统计信息(包括每个uid)

四. 电量

1.耗电场景

  • 定位,尤其是调用 GPS 定位。

  • 网络传输,尤其是非 Wifi 环境。

  • 屏幕亮度

  • CPU 频率

  • 内存调度频度

  • wake_locker 时间和次数

  • 其他传感器

2.测试方法

2.1 通过系统文件获取电量记录

使用命令 adb shell dumpsys batterystats> batterystats.txt   可以打印出详细的耗电相关信息并保存统计的电量信息到 batterystats.txt 这个文件里。

2.2 通过导入 batterystats.txt 到 Google 开源工具 battery historian 进行分析

因为这个工具是 Go 语言开发,所以需要预装Go语言开发环境,当然如果你不想配置Go语言环境,官方还提供了一种更方便的方案,通过安装 docker 环境来使用这个工具。具体这个工具的配置安装和具体使用方法以及参数的代表含义,我会单独再写一篇文章记录,先抛砖引玉放一张这个工具的运行截图。

3.优化方法

3.1 CPU 时间片

当应用退到后台运行时,尽量减少应用的主动运行,当检测到 CPU 时间片消耗异常时,深入线程进行分析。

3.2 wake lock

前台运行时不要注册 wake lock。

后台运行时,在保证业务需要的前提下,应尽量减少注册 wake lock。

降低对系统的唤醒频率, 使用 partial wake lock 代替 wake lock。

3.3 传感器

合理设置 GPS 的使用时长和使用频率。

3.4 云省电策略

考虑到用户使用场景的多样性,导致很难定位用户异常耗电的根源,所以为了更深一层弄清楚这些问题,可以考虑定期上报灰度用户手机电量数据的方式来分析问题。

五. 启动时间

可使用命令 adb shell am start -W packagename/activity   查看 App 启动耗时,查看了一下我们自己的 App Android 版本的启动耗时如下:

注释:

WaitTime:总的耗时,包括前一个应用 Activity pause 的时间和新应用启动的时间

ThisTime:一连串启动 Activity 的最后一个 Activity 的启动耗时

TotalTime:新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用 Activity pause 的耗时

六. 总结

App性能问题会直接影响产品体验:耗流量、掉电快、卡顿、崩溃等现象会给用户造成不良的体验和印象,不利于产品的活跃及用户留存。许多经验丰富的程序员也会经常忽视这些不起眼的性能问题,因此作为测试人员,在版本发布前及早关注并发现上述性能问题就显得尤其重要。但真正做起App性能测试才发现这条路并不容易走,抓取内存、CPU 等一些项目的指标容易,但对一些数据的敏感度和处理方式都是要靠经验的慢慢积累。总之,性能测试算是一项比较繁琐的工作,但难者不易,易者不难,希望已经行走在这条路上的或者准备踏上这条路的同行都能不断提高自身素养,坚持到底。

最后跟大家推荐一个测试学习群:747981058,里面大牛已经为我们整理好了许多的学习资料,有自动化,接口,性能等等的学习资料!

App性能测试中的几个重要概念相关推荐

  1. APP性能测试——基于手机的专项测试

    转载自http://bbs.51testing.com/thread-1199231-1-2.html 我之前的APP性能测试是基于服务端的,这里收藏一个基于手机的专项测试. Android篇 性能测 ...

  2. Android app 性能测试以及专项测试

    1. 性能测试 Android性能测试分为两类: 1.一类为rom版本(系统)的性能测试 2.一类为应用app的性能测试 Android的app性能测试包括的测试项比如: 1.资源消耗 2.内存泄露 ...

  3. app性能测试与弱网测试

    1. 性能测试 Android的app性能测试包括的测试项比如:  1.资源消耗  2.内存泄露  3.电量功耗  4.耗时  5.网络流量消耗  6.移动终端相关资源利用率  7.帧率  8.渲染等 ...

  4. APP性能测试的6项关键指标及测试获取手段

    如何把rom测试和手机预装APP测试得更好,用户体验.流畅度.功耗.启动时长等指标是中兴努比亚手机产品线最关注的层面.本文将从APP性能维度.性能测试平台等维度全面讲解中兴努比亚APP专项性能测试和监 ...

  5. app 性能测试

    此篇为转载文章,我也是接触软件测试,对App 性能测试这一块不知所措,荣幸今天看到这篇文章,希望对有需要的同志有所帮助 app 性能测试的几个概念 我们在使用各种 App 的时候基本会关注到:这款软件 ...

  6. 在Web.config或App.config中的添加自定义配置

    .Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持.最近看到一些项目中还在自定义xml文件做程序的配置,所以忍 ...

  7. 转:性能测试中的性能测试指标与用户体验分析

    转自:http://www.ltesting.net/ceshi/ceshijishu/xncs/2012/0223/204182_2.html 性能测试中的性能测试指标与用户体验分析 网络应用性能分 ...

  8. App推广中如何寻找200个以上渠道

    之前写过一篇<一个新的App该如何推广>的文章,写了App推广中要铺200个渠道的事情,但是没有具体写怎么寻找渠道,在这个文章中,我想单独写一下如何寻找更多的渠道.毕竟一个App要想不花钱 ...

  9. 性能测试和性能分析的基础概念

    1.1.   性能测试的基础概念 性能可以理解为一个系统实现其功能的能力,从宏观上可以描述为系统能够稳定运行,高并发访问时系统不会出现宕机,系统处理完成用户请求需要的时间,系统能够同时支撑的并发访问量 ...

最新文章

  1. linux centos7 安装使用 惠普 hp 打印机
  2. Android中级教程之----Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
  3. VC中的双缓冲绘图技术
  4. python爬取论文代码_Python selenium爬取微信公众号文章代码详解
  5. 如何在ogre游戏界面添加自己的信息,比如显示某变量的值
  6. 计算机学院 统计学博士点,统计学 国家重点学科/博士点/硕士点
  7. Kotlin知识积累——let,with,run,apply,alse的用法
  8. python画图配色_python matplotlib包图像配色方案
  9. “互联网+政务”是什么?
  10. 汤姆猫代码python_用树莓派实现会说话的汤姆猫
  11. “熊孩子”乱敲键盘攻破 Linux 桌面;苹果开源代码被发现包含兼容微信的代码;网传蚂蚁启用OKR替代KPI | EA周报...
  12. ORACLE之SQL——排序
  13. 网站提示DNS_PROBE_FINISHED_NXDOMAIN错误如何修复
  14. 为intent添加FLAG_EXCLUDE_STOPPED_PACKAGES标记
  15. HTML页面上传图片直接预览
  16. Java软路由_J4105四口i211 千兆软路由 简单开箱
  17. iOS9-by-Tutorials-学习笔记五:Multitasking
  18. win10 R包安装报错:没有安装在arch=i386
  19. 7.css内外边距设置
  20. 微信小程序wepy框架编译生成dist目录

热门文章

  1. Android LruCache 缓存
  2. 预付费智能水电表系统
  3. .net搜索引擎开源
  4. 搜索引擎语法+网络空间搜索and在线web工具
  5. Python开发环境介绍
  6. 解题报告 (五) Burnside引理和Polya定理
  7. AMIS:这是让前端失业的一个框架
  8. LTE资源调度(7)-DRX不连续接收(1)
  9. 刷题记录:牛客NC17193简单瞎搞题
  10. 图像解析力算法—SFR(Spatial Frequency Response)原理分析(一)