Android终端专项测试相关介绍

今天在这里我想回顾一下之前做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"?>
<device name="Android">
  <!-- Most values are the incremental current used by a feature,
       in mA (measured at nominal voltage).
       The default values are deliberately incorrect dummy values.
       OEM's must measure and provide actual values before
       shipping a device.
       Example real-world values are given in comments, but they
       are totally dependent on the platform and can vary
       significantly, so should be measured on the shipping platform
       with a power meter. -->
  <item name="none">0</item>
  <item name="screen.on">0.1</item>  <!-- ~200mA -->
  <item name="screen.full">0.1</item>  <!-- ~300mA -->
  <item name="bluetooth.active">0.1</item> <!-- Bluetooth data transfer, ~10mA -->
  <item name="bluetooth.on">0.1</item>  <!-- Bluetooth on & connectable, but not connected, ~0.1mA -->
  <item name="wifi.on">0.1</item>  <!-- ~3mA -->
  <item name="wifi.active">0.1</item>  <!-- WIFI data transfer, ~200mA -->
  <item name="wifi.scan">0.1</item>  <!-- WIFI network scanning, ~100mA -->
  <item name="dsp.audio">0.1</item> <!-- ~10mA -->
  <item name="dsp.video">0.1</item> <!-- ~50mA -->
  <item name="radio.active">0.1</item> <!-- ~200mA -->
  <item name="radio.scanning">0.1</item> <!-- cellular radio scanning for signal, ~10mA -->
  <item name="gps.on">0.1</item> <!-- ~50mA -->
  <!-- Current consumed by the radio at different signal strengths, when paging -->
  <array name="radio.on"> <!-- Strength 0 to BINS-1 -->
      <value>0.2</value> <!-- ~2mA -->
      <value>0.1</value> <!-- ~1mA -->
  </array>
  <!-- Different CPU speeds as reported in
       /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state -->
  <array name="cpu.speeds">
      <value>400000</value> <!-- 400 MHz CPU speed -->
  </array>
  <!-- Current when CPU is idle -->
  <item name="cpu.idle">0.1</item>
  <!-- Current at each CPU speed, as per 'cpu.speeds' -->
  <array name="cpu.active">
      <value>0.1</value>  <!-- ~100mA -->
  </array>
  <!-- This is the battery capacity in mAh (measured at nominal voltage) -->
  <item name="battery.capacity">1000</item>
  <array name="wifi.batchedscan"> <!-- mA -->
      <value>.0002</value> <!-- 1-8/hr -->
      <value>.002</value>  <!-- 9-64/hr -->
      <value>.02</value>   <!-- 65-512/hr -->
      <value>.2</value>    <!-- 513-4,096/hr -->
      <value>2</value>    <!-- 4097-/hr -->
  </array>
</device>

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应用内存使用情况
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容