除了一般功能性测试和性能测试外,app还需要一些专项测试来发现更为深层的问题。之所以称为专项测试,是因为这些测试主要针对某个特殊方面或问题的,如兼容性测试、流量测试、电量测试、弱网环境测试、安全测试等。
兼容测试
兼容性测试使功能测试,只不过侧重在不同的软硬件环境,这是由终端设备的型号多样性决定的。测试核心内容包括
• 测试软件是否能在不同的操作系统平台上兼容,或测试软件是否能在同一操作平台的不同版本上兼容;
• 软件本身能否向前或向后兼容;
• 测试软件能否与其他相关的软件兼容;
• 数据兼容性测试,主要是指数据能否共享等。
针对App通常会考虑到如下软硬件环境:
操作系统版本及大版本下的小版本,如安卓系统4下面有子版本号:4.0.2、4.2、4.4等。
屏幕分辨率,如果代码缺少对分辨率做适配除了,就会出现错位,拉伸、模糊等各种显示问题。
网络类型,这可能涉及app中对不同网络的策略,及对不同网络带宽、延时和稳定性的处理,要考虑到3G、4G、wifi网络下的功能情况。对于手机M版网站,要考虑不同的浏览器类型,这包括主流厂商手机上自带的浏览器,及主流第三方浏览器。
各种机型和版本不可能都覆盖,因此要遵循一个通用的选择机型原则,如下
根据APP的用户特征挑选出要覆盖的设备范围,以保证我们选择的机型,就是在实际应用当中主要用户群使用的机型。
考虑目前市场当中手机的主流分辨率,这里可以将分辨率分为几个级别(一种常见的分法是720P(1280x720),1080P(1920x1080),2K(2x1080p)和4K),我们选择的机型能够覆盖所有级别即可。
系统版本的不断更新,可能导致之前可以正常使用的软件功能出现异常,我们要保证软件可以对一个系列的操作系统有较好的兼容性,所以有必要考虑主要用户群使用了哪些版本的系统。
一般选择少数主流设备上执行全部用例,在其他兼容性范围内的设备上覆盖主要功能的用例。将用户反馈问题较多的部分机型也纳入兼容测试的列表中,毕竟经常出现问题的地方就是需要我们更加关注的。
在同一个手机品牌下,可以同时参考分辨率、操作系统,机型的价位等来筛选, 对非主流的分辨率(比如当前960*540、1280*720),每个类型只选择一款,而其他的都选择主流分辨率类型, 筛选操作系统也类似,可以通过一些网络数据平台,获取到当前使用率最高的操作系统版本数据,比如这里我们通过友盟数据平台(https://compass.umeng.com/trend),查看最近一个月的Android操作系统大(小)版本市场占比。
启动时间测试
启动时间对于App的性能测试,启动时间是个重要指标,启动时间分为两种情况,一种是冷启动时间(通常是系统重启,即在启动前没有该App进程的情况),另一种是热启动,即App从被切换到前台(点back退出后再点击图标启动,手机系统中有该APP进程)。QA测试时,一般关注冷启动的启动时间。
冷启动的流程即为App启动流程的全过程, 需要创建App进程, 加载相关资源, 启动Main Thread, 初始化首屏Activity等。
常用的测试方法有
1、 通过adb命令,如adb logcat、adb shell am start -W packagename/MainActivity(app的包名和包的启动页)命令,-W就是wait的意思
其中adb shell am 命令执行成功后,将返回三个测量到的时间:
C:\Users\chenping>adb shell "pm list packages | grep dang"
package:com.dangdang.buy2
C:\Users\chenping>adb shell "dumpsys package com.dangdang.buy2 | grep category.LAUNCHER -B4"
android.intent.action.MAIN:
42c07de8 com.dangdang.buy2/.StartupActivity filter 42c08038
Action: "android.intent.action.MAIN"
Category: "android.intent.category.DEFAULT"
Category: "android.intent.category.LAUNCHER"
C:\Users\chenping>adb shell am start -W com.dangdang.buy2/.StartupActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.dan
gdang.buy2/.StartupActivity }
Status: ok
Activity: com.dangdang.buy2/.StartupActivity
ThisTime: 3942
TotalTime: 3942
Complete
ThisTime:一般和TotalTime时间一样,除非在应用启动时开了一个透明的Activity预先处理一些事再显示出主Activity,这样将比TotalTime小。
TotalTime:应用的启动时间,包括创建进程+Application初始化+Activity初始化到界面显示。TotalTime表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用Activity pause 的耗时。也就是说,开发者一般只要关心 TotalTime 即可,这个时间才是自己应用真正启动的耗时。
2、代码里埋点
流量测试
流量是指能够连接网络的设备在网络上所产生的数据流量。这里只关注用户层面的流量
一般对于APP流量的测试需要考虑以下两种场景,一种是活动状态,也就是用户对APP操作而直接导致的流量消耗;静默转态,也就是用户没有操作APP,APP处于后台转态时流量的消耗。
流量测试通常的方法为
1、 通过抓包软件,查看工具上的流量统计信息
2、 查看linux流量统计文件,如查看某个应用的流量,大致步骤为
首先通过ps| grep 包名 获取该应用pid;再通过cat /proc/{pid}/status命令获取uid;再通过cat /proc/uid_stat/{uid}/tcp_snd 命令获取发送的流量(单位byte),通过cat /proc/uid_stat/{uid}/tcp_rcv获取接收的流量。这样就可以大致知道该应用消耗的流量了。
CPU测试
测试一款APP在各种场景下CPU的占用率情况也是比较重要的指标。一般APP的CPU测试也需要考虑两种场景,一种是活动转态,即APP处于操作活动中,第二种是APP什么操作都没有,默默在后台等待。
测试CPU占用率的方法有
1、 手机自带监控
2、 dumpsys命令,如adb shell dumpsys cpuinfo | grep {packagename}
3、 top命令,如adb shell top | grep {packagename}
shell@virgo:/data $ dumpsys cpuinfo | grep dangdang
6.4% 7728/com.dangdang.buy2: 5.1% user + 1.3% kernel / faults: 4493 minor
3.9% 7923/com.dangdang.buy2:ddrn: 2.5% user + 1.4% kernel / faults: 152 minor
内存测试
对于智能手机而言,内存大小是固定的;因此,如果单个app的内存占用越小,手机上可以安装运行的app就越多;或者说app的内存占用越小,在手机上运行就会越流畅。所以说,内存占用的大小,也是考量app性能的一个重要指标。
1、同样使用top命令,查看应用占用内存的数量,其中RSS字段表示实际占用的物理内存数,单位KB
2、adb shell dumpsys meminfo
其中,package_name 也可以换成程序的pid,命令执行成功后,返回的Total 中的的 PSS 信息值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
shell@virgo:/data $ dumpsys meminfo com.dangdang.buy2
Applications Memory Usage (kB):
Uptime: 4066412 Realtime: 4066402
** MEMINFO in pid 10157 [com.dangdang.buy2] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 0 0 0 0 11644 8556 95
Dalvik Heap 21012 20492 0 0 39440 36737 2703
Dalvik Other 7005 6924 0 0
Stack 792 792 0 0
Other dev 811 288 12 0
.so mmap 9130 3500 4852 0
.jar mmap 8 0 8 0
.apk mmap 1071 0 572 0
.dex mmap 12578 932 7060 0
Other mmap 27 4 0 0
Unknown 4724 4716 0 0
TOTAL 57158 37648 12504 0 51084 45293 2798
常用的几个描述内存占用的名词解释:
VSS:(Virtual Set Size)表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。
RSS:(Resident Set Size)表示一个进程在RAM中实际使用的空间地址大小,包括了全部共享库占用的内存,这种表示进程占用内存的情况也是不准确的。
PSS:(Proportional Set Size)表示一个进程在RAM中实际使用的空间地址大小,它按比例包含了共享库占用的内存。假如有3个进程使用同一个共享库,那么每个进程的PSS就包括了1/3大小的共享库内存。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样。
USS:(Unique Set Size)表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式!
可以看到:VSS>=RSS>=PSS>=USS。
耗电量测试
电量的测试需要测试的场景比较多,在不同使用场景下消耗的电量肯定是不同的。测试场景包括
1、 待机
2、 活动转态,不断地进行某些场景的操作
3、 静默转态,让APP处于后台运行
电量的测试方法有
1、系统自带的电量统计
2、通过adb shell dumpsys batterystats命令,首先要初始化batterystats数据
adb shell dumpsys batterystats –reset,拔掉手机连接,操作你的App,操作完成后,重新连接手机,执行下面的命令,收集Battery数据: adb shell dumpsys batterystats > batterystats.txt。