今天在这里我想回顾一下之前做Android终端专项测试的一些经历吧。大家都知道移动终端不管现在发展的如何,终归是一种资源受限的设备,例如电量,内存,流量等等。因此,我们需要专门针对移动终端的App进行一些相关的测试,这样一定程度上会提升用户的体验。下面,我将列出一些专项测试(粗体为我涉及过的):

  1. Android终端电量测试
  2. Android终端流量测试
  3. Android终端内存测试
  4. 页面流畅度测试
  5. Android终端CPU测试;
  6. 弱网络测试;
  7. Android权限分析测试;
  8. ...

上述这种类型的测试还有很多,咋一看,感觉有点懵,但是这类测试都是存在一些共性的,也就是存在一种方法论来实施这些测试的,这也是本文重点要讨论的。因为只有掌握了方法论,我们才会对不同种类的专项测试应对自如。

好了,现在我们进入正题。首先,我们要明确一点:专项测试与普通的功能测试的区别:对于功能测试,我们一般只要设计测试用例,然后看程序是否符合预期结果,即程序的功能逻辑是否正确。但是对于专项测试,我们的预期结果是什么呢?所以,对于专项测试,我们需要确定一个衡量标准,而这个标准是一种可以量化的东西/数据,例如,在电量测试我们一般使用CPU时间片,Alarm唤醒次数和唤醒时长等。然后,再进行横向对比

  • 不同测试场景(测试用例)下的对比;
  • 相同测试场景下,不同版本之间的对比;
  • 相同测试场景下,竞品之间的对比;
  • 相同测试场景下,不同设备之间的对比。

只有通过量化标准和横向对比,我们才能从一定程度确定程序是否符合我们的预期。根据上述量化标准,我们要讲到终端专项测试的四要素了:

  1. 检测工具:一种能够实时采样应用的相关(量化)数据的工具,这种工具可以是脚本、apk,反正只要能得到数据就可以了;
  2. 测试场景:在开始测试前,我们要分析并确定哪些场景下的数据才是我们想要的;
  3. 自动化脚本:编写相应的自动化测试脚本,这样可以避免手工操作对测试数据带来的一些影响;
  4. 分析工具:能深入到代码中进行分析,这个一般可能是由开发人员做,不过,测试人员也是可以涉及的。

一般来说,通过确定量化标准以及四要素的具体内容,我们就可以顺利开展专项测试了,当然这其中会有很多坑。再提一点,每次具体的测试我们最后进行多次,去掉那些毛刺数据,然后取平均值,这样得到的结果更准确一些。

下面我将会以电量测试作为例子具体讲解一下如何使用上面所谓的方法论。首先,我们先确认量化标准,电量测试的一种量化标准是测试电流,这种方式应该说是我们直接能想到的,但是这种方式的缺点较多,例如,测试工具不易获得,测试的是全局的。所以,一般我们以下几个数据作为衡量标准:

  • CPU 时间片(单位:Jiffies,一般手机为每单位消耗10ms的CPU 轮询时长);
  • Alarm 唤醒次数和唤醒时长;
  • WakeLock 锁的使用;

那我们如何去获得这些数据呢?

CPU时间片

CPU 时间分为用户态、系统态和空闲态。所以,CPU时间片=用户态时间片+系统态时间片,除此之外,为了确保 CPU 时间片采集的准确性,测试前需要固定测试设备的 CPU 频率。通过一下命令,我们可以查看具体进程的相关统计:

    # %s为指定进程的pid    adb shell cat /proc/%s/stat    # 具体实例及结果输出:    adb shell cat /proc/9972/stat    # 9972 (le.android.keep) S 201 201 0 0 -1 1077936448 12591 0 0 0 25 15 0 0 20 0 16    # 0 4895875 1524547584 10237 4294967295 1 1 0 0 0 0 4612 0 38136 4294967295 0 0 1    #7 0 0 0 0 0 0 0 0 0

结果说明:总的时间片 = 25+15 = 40,将两次相减得到差值增量即可。参数解释:

pid = 9972 应用的进程id
utime=25 第13位,该进程在用户态运行的时间,单位:Jiffies
stime=15 第14位,该进程在内核态运行的时间,单位:Jiffies

Alarm 和 WakeLock

  • 查看 Alarm,唤醒次数/时间:dumpsys alarm
  • 查看 WakeLock:dumpsys power或者cat /sys/power/wake_lock

接下来我们该确定测试场景了,对于电量测试来说,我们一般会重点放在后台待机的场景下进行测试,为什么这么说呢?在前台使用时,用户是有感知的,此时电量消耗较高是正常的(相对而言)。而后台待机情况下,用户是无感知的,此时用户认为电量消耗较低的。这这种情况下,我们就不需要自动化测试脚本了,只要确定测试环境就可以了。

本文讲到这里,我们先告一段落吧,以后有空可以针对一种具体的专项测试进行详细地分析。其实,要实施这些专项测试是需要一定功底的,作为 Android 测试人员,首先你得深入了解 Android 系统的一些特点,例如它的内存管理机制,Alarm 唤醒机制,进程线程模型;其次,Android 是基于 Linux 内核的,所以我们对 Linux 也要一定的了解,Android 也给我们提供了非常有用的命令行工具,很多的测试数据都可以通过命令行工具来获得。

关于 Android 电量使用统计,推荐大家一篇 Android 官方的一篇文档——Power Profiles for Android。

2015.4.10,append:
最近遇到一个问题,就是如何将 CPU 时间片消耗的Jiffies值转换为具体的电量消耗,也就是mAh。为什么会有这个问题呢?好吧,其实就是因为一般人是不明白Jiffies是什么意思的。下面是我个人的想法:

先普及一下物理上的一个公式吧,电能W(焦耳J)= P * t = U * I * t,从公式中可以看出,在电压恒定的情况下,只要知道电流和时间即可得到电量。

通过文档——Power Profiles for Android,我们可以了解到Android设备中的各个硬件模块在不同状态下的平均电流值是不一样的,例如我们讲的 CPU,CPU 在不同状态下(例如,运行频率,active or idle)的平均电流是不一样的。具体相应的电流值都记录在文件power_profile.xml中,而这个文件又在/system/framework/framework-res.apk这个apk中,通过反编译这个 apk 可以得到该文件。关于这个文件大家还可以参考一下这篇文章——电量统计之一:PowerProfile.java与power_profile.xml。

好了,讲完电流,我们再讲一下时间,也就是 CPU 的运行时间,这个时间其实就是Jiffies,一般来讲:1 Jiffies = 10ms,然后我们可以计算电量了。目前来讲,我的想法就是这样,估计这个只能做个参考吧。

附加一个power_profile.xml文件的内容给大家,记住,不同设备的值可能不一样。

<?xml version="1.0" encoding="utf-8"?>    0  0.1    0.1    0.1   0.1    0.1    0.1    0.1    0.1   0.1   0.1   0.1   0.1            0.2       0.1             400000       0.1          0.1        1000         .0002       .002        .02         .2          2      

append end

参考文章

  1. APT:APT是一个Android平台高效性能测试组件,提供丰富实用的功能,适用于开发自测、定位性能瓶颈;测试人员完成性能基准测试、竞品对比测试;
  2. Android 性能分析案例;
  3. Android Performance Case Study;
  4. 专栏:Android性能优化;
  5. Android Application Performance Improvement;
  6. Avoiding memory leaks;
  7. Android Layout Tricks #1;
  8. 如何分析Android应用内存使用情况。

更多相关文章

  1. 谈Android手机客户端的适配测试
  2. Android(安卓)渗透测试学习手册 第四章 对 Android(安卓)设备进
  3. Android中使用自身携带的Junit新建一个测试工程
  4. Android震动实现
  5. Android(安卓)获取网络时间
  6. Android(安卓)Texting(2)Testing Fundamentals 测试基础篇
  7. Android中实现日期时间选择器(DatePicker和TimePicker)
  8. Android获得当前系统时间、星期几、周几
  9. android白盒测试所需其他安卓开发内容链接整理

随机推荐

  1. linux实现mysql数据库每天自动备份定时备
  2. MySQL 5.7双主同步部分表的实现过程详解
  3. centos6.5中rpm包安装mysql5.7初始化出错
  4. mysql数据库无法被其他ip访问的解决方法
  5. Mysql启动报ERROR:2002的分析与解决
  6. sql语句优化的一般步骤详解
  7. ubuntu下apt-get安装和彻底卸载mysql详解
  8. Linux下安装MySQL5.7.19问题小结
  9. Linux下Mysql5.7.19卸载方法
  10. Linux下Centos7安装Mysql5.7.19的详细教