移动App测试实战—专项测试

转自:http://www.51testing.com/html/58/n-3713758.html

  我们在进行了手工的功能测试之后,也开发了一些自动化测试用例,并且做了性能测试之后,测试工作看似比较完整了。但是当我们的App在大量的用户那里被安装和使用的时候,还是会有很多我们之前没有预料的问题被反馈回来,比如:
  · Crash的问题
  · 设备兼容性的问题
  · 流量使用过多的问题
  · App导致用户手机电量消耗过快的问题
  · 在不同的网络情况下不稳定,比如卡死和白屏的问题
  这些问题都是上面的测试方法难以找出的,所以这里引入了一个专项的测试方法,包括:兼容性测试、流量测试、电量测试、弱网络测试、稳定性测试、安全测试和环境相关测试。
  第一:兼容性测试
  针对App通常会考虑这些方面:
  1)操作系统版本
  包括Andoird版本,iOS版本
  2)屏幕分辨率
  3)不同厂家的ROM
  4) 网络类型
  比如Wifi、3G、4G下的功能情况
  第二:流量测试
  在移动产品的测试中,很有必要对App使用的流量进行度量,大致来说,流量可以从用户使用的的相关性角度分为:一类是用户的操作直接导致的流量消耗;另一类是后台,即在用户没有直接使用情况下的流量消耗。
  第三:电量测试
  在木器电池技术没有取得巨大突破前提下,这方面始终会存在一些瓶颈,如果一些App架构设计的不好,或者代码偶缺陷,就可能导致电量消耗比较高,所以电量测试也是很重要的。
  第四:弱网络测试
  移动互联网产品相比PC互联网产品,有一个特点是前者使用的网络比较多样,除了Wif之外,很多时候是在移动网络下使用的,移动网络遇到的情况又比较复杂,比如地铁、隧道、体育场等。所以网络不稳定的情况是比较容易发生的,很多情况下App的一些问题是在复杂的网络情况下才会暴露,与其让用户发现和投诉这些问题,不如我们在测试阶段尽量模拟这样的网络情况,及早发现和修复这些问题。
  第五:稳定性测试
  在保证基本功能正确基础之上,App的稳定性就显得非常重要,如果一个App经常出现闪退或者卡死,那么用户体验就会受到很大伤害,在有其他竞争产品的情况下很容易造成用户的流失。
  第六:安全测试
  包括安装包的安全测试(能否反编译代码、安装包是否签名等)、敏感信息测试、软键盘劫持、账户安全、数据通信安全等。服务器端的SQL注入测试、XSS跨站脚本攻击等。
  第七:环境相关的测试
  在实际项目中,有一些缺陷我发现是和App所处的运行环境相关的,所以设计测试的时候,要多考虑这些场景,比如:
  1)干扰测试
  收到电话、收到短信、收到通知栏消息、无电提示框弹出、第三方安全软件告警弹出。
  2)权限测试
  一些用户在实际使用App的时候回有意识阻止某些功能。例如有的用户感觉让某个App访问电话本或者相册可能泄漏隐私,就在手机中设置了禁止了该App访问相册的权限。
  3)边界测试
  手机环境本身也有其边界情况需要在测试中覆盖。常见的场景有:
  可用存储空间过少、没有SD卡/双SD卡、飞行模式、系统时间有误(晚于和早于标准时间)、第三方依赖(比如我们的App依赖第三方App,但是现在第三方App没有安装或者版本过低的测试情况)。
 
-------------------------------------------------华丽的分割线-----------------------------------------------------------------

Android APP性能及专项测试

 
  • Android性能测试分为两类: 
    1、一类为rom版本(系统)的性能测试 
    2、一类为应用app的性能测试

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

  • 工具: 
    (工具的原理都是基于调用android底层的一些api来获取到测试所用到的值)GT等

  • 测试方法: 
    1、设计场景 :手工或自动化场景 
    2、获取数据:可获取的数据包括:内存、cpu、电量功耗、hprof(内存泄露分析文件)、响应时间等等。。。。配合手工或自动化场景来获取数据(最好多取几次而且每次配合不同的设备看平均值)作为最后的对比分析 
    3、结果分析 :拿到数据后分析哪些模块的数据异常再去Check code定位问题的原因

  • Android系统的几种场景状态: 
    1、空闲状态: 指打开应用后,点击home键让应用后台运行,此时应用处于的状态叫做空闲 
    2、中等规格和满规格状态:中等规格和满规格指的是对应用的操作时间的间隔长短不一,中等规格时间较长,满规格时间较短

1.1 内存篇

背景知识: 
C/C++申请的内存空间在native heap中,而java申请的内存空间则在dalvik heap中。这个是因为Android系统对dalvik的vmheapsize作了硬性限制,当java进程申请的java空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型而定),可以通过adb shell getprop | grep dalvik.vm.heapgrowthlimit查看此值。也就是说,程序发生OMM并不表示RAM不足,而是因为程序申请的java heap对象超过了dalvik vmheapgrowthlimit。也就是说,在RAM充足的情况下,也可能发生OOM。

这样的设计似乎有些不合理,但是Google为什么这样做呢?这样设计的目的是为了让Android系统能同时让比较多的进程常驻内存,这样程序启动时就不用每次都重新加载到内存,能够给用户更快的响应。迫使每个应用程序使用较小的内存,移动设备非常有限的RAM就能使比较多的app常驻其中。但是有一些大型应用程序是无法忍受vmheapgrowthlimit的限制的

实际上dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize都是java虚拟机的最大内存限制,应用如果不想在dalvikheap达到heapgrowthlimit限制的时候出现OOM,需要在Manifest中的application标签中声明android:largeHeap=“true”,声明后应用dalvik heap达到heapsize的时候才会出现OOM

  1. 内存测试中的测试子项: 
    1)空闲状态下的应用内存消耗情况 
    2)中等规格状态下的应用内存消耗情况 
    3)满规格状态下的应用内存消耗情况 
    4)应用内存峰值情况 
    5)应用内存泄露情况 
    6)应用是否常驻内存 
    7)压力测试后的内存使用情况

  2. 内存问题现象: 
    1)内存抖动 
    2)大内存对象被分配 
    3)内存不断增长 
    4)频繁GC

  3. 内存数据获取: 
    1、各种linux命令(top、free、meminfo…) 
    2、通过dumpsys 
    adb shell dumpsys meminfo [pakagename | pid] 
    3、通过/system/xbin/procrank工具 
    adb shell procrank 
    说明: 
    VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) 
    RSS – Resident Set Size 实际使用物理内存(包含共享库占用的内存) 
    PSS – Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存) 
    USS – Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存) USS 是针对某个进程开始有可疑内存泄露的情况,是一个程序启动了会产生的虚拟内存,一旦这个程序进程杀掉就会释放。不过USS需要通过root的手机。一般没有root的手机我们可以获取PSS。而PSS通过如下命令来获取:adb shell dumpsys meminfo <Package Name>|grep TOTAL 
    4、通过android提供的procrank 
    1)首先去google获取procrank、procmem、libpagemap.so三个文件 
    2)然后push文件,执行 adb push procrank /system/xbin adb push procmem 
    /system/xbin adb push libpagemap.so /system/lib 
    3)赋权 adb shell chmod 6755 /system/xbin/procrank adb shell chmod 6755 /system/xbin/procmem adb shell chmod 6755 /system/lib/libpagemap.so , 
    4)在开启工具记录 adb shell procrank |grep packagename >/address/procrank.txt 
    5、通过android提供的ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo)(这个方法是写一个简单的app去监控的时候用到的,轻便简单)

  1. privatevoidGetMemory()
  2. {
  3. finalActivityManager activityManager =(ActivityManager) getSystemService(ACTIVITY_SERVICE);
  4. ActivityManager.MemoryInfo info =newActivityManager.MemoryInfo();
  5. activityManager.getMemoryInfo(info);
  6. Log.i(tag,"系统剩余内存:"+(info.availMem >>10)+"k");
  7. Log.i(tag,"系统是否处于低内存运行:"+info.lowMemory);
  8. Log.i(tag,"当系统剩余内存低于"+info.threshold+"时就看成低内存运行");
  9. }
6、Memory  Monitor (android studio的插件)  【makedown???】

4. /proc/meminfo文件里列出的字段解释:

MemTotal: 所有可用RAM大小。 MemFree: LowFree与HighFree的总和,被系统留着未使用的内存。 
Buffers: 用来给文件做缓冲大小。 Cached: 被高速缓冲存储器(cache memory)用的内存的大小(等于diskcache 
minus SwapCache)。 SwapCached:被高速缓冲存储器(cache 
memory)用的交换空间的大小。已经被交换出来的内存,仍然被存放在swapfile中,用来在需要的时候很快的被替换而不需要再次打开I/O端口。 
Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要,否则不会被移作他用。 Inactive: 
在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。 SwapTotal: 交换空间的总大小。 SwapFree: 
未被使用交换空间的大小。 Dirty: 等待被写回到磁盘的内存大小。 Writeback: 正在被写回到磁盘的内存大小。 
AnonPages:未映射页的内存大小。 Mapped: 设备和文件等映射的大小。 Slab: 
内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。 SReclaimable:可收回Slab的大小。 
SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。 
PageTables:管理内存分页页面的索引表的大小。 NFS_Unstable:不稳定页表的大小。

5. android检查内存泄露步骤:

1、运行Monkey进行压力测试: 
adb shell monkey -p cn.microinvestment.weitou --pct-touch 100 --ingore-crashes --throttle 1000 -s 100 -v -v 50
2、监控内存值,如果出现过大等递增异常则保存HPROF文件(hprof文件是Java 虚拟机的Heap快照)用于分析查看应用内存的命令: 
adb shell dumpsys meminfo cn.microinvestment.weitou(进程名) 
如果发现内存过大,则保存HPROF文件:adb shell am dumpheap <进程名> <保存路径> 
3、分析hprof文件 
用工具MAT来查看,首先还要这个HPROF文件转换成MAT可读的文件 
在Android SDK tool里面有个hprof-conv命令: 
hprof-conv <原HPROF文件路径> <转换后的HPROF路径> 
hprof-conv a.hprof b.hprof 
4、用MAT工具打开转换后的HPROF文件 
一般选择Leak Suspects Report(通过SQL语句来查询对象有没有被释放掉,如果有多个相同的对象,则会存在内存泄露的问题)

1.2 CPU篇

  1. CPU测试中的测试子项: 
    1)空闲状态下的应用CPU消耗情况 
    2)中等规格状态下的应用CPU消耗情况 
    3)满规格状态下的应用CPU消耗情况 
    4)应用CPU峰值情况

  2. CPU数据获取: 
    1)adb shell dumpsys cpuinfo | grep packagename 
    2)top命令 
    adb shell top -m 10 -s cpu #查看占用cpu最高的前10个程序(-t 显示进程名称,-s 按指定行排序,-n 在退出前刷新几次,-d 刷新间隔,-m 显示最大数量) 
    adb shell top | grep PackageName > /address/cpu.txt

1.3 流量篇

  1. 概念: 
    中等负荷:应用正常操作 
    高负荷:应用极限操作

  2. 流量测试中的测试子项: 
    1、应用首次启动流量值 
    2、应用后台连续运行 2 小时的流量值 
    3、应用高负荷运行的流量峰值 
    4、应用中等负荷运行时的流量均值

  3. 获取流量数据: 
    1、tcpdump+wireshark 
    2、/proc/net/目录下相关文件 
    cat /proc/net/dev 获取系统的流量信息 
    3、查询应用的pid: adb shell ps | grep tataufo #如:31002 
    通过PID获取该应用的流量数据: adb shell cat /proc/31002/net/dev 
    (wlan0代表wifi上传下载量标识, 单位是字节可以/1024换算成KB, 打开手机飞行模式再关掉就可以将wlan0中的值初始化0) 
    4、查询应用的pid: adb shell ps | grep tataufo #如:31002 
    通过PID获取UID:adb shell cat /proc//status 
    通过UID获取:adb shell cat /proc/net/xt_qtaguid/stats | grep 31002 
    5、通过adb shell dumpsys package来获取应用的uid信息,然后在未操作应用之前,通过查看 : 
    adb shell cat /proc/uid_stat/uid/tcp_rcv 
    adb shell cat /proc/uid_stat/uid/tcp_snd 
    获取到应用的起始的接收及发送的流量,然后我们再操作应用,再次通过上述2条命令可以获取到应用的结束的接收及发送的流量,通过相减及得到应用的整体流量消耗 
    6、Android代码:Android的TrafficStats类

1.4 功耗篇

  1. 功耗测试中的测试子项: 
    1、手机安装目标APK前后待机功耗无明显差异 
    2、常见使用场景中能够正常进入待机,待机电流在正常范围内 
    3、长时间连续使用应用无异常耗电现象

  2. 功耗测试方法: 
    方法一:软件 
    1、采用市场上提供的第三方工具,如金山电池管家之类的。 
    2、就是自写工具进行,这里一般会使用3种方法: 
    1)基于android提供的PowerManager.WakeLock来进行 
    2)比较复杂一点,功耗的计算=CPU消耗+Wake lock消耗+数据传输消耗+GPS消耗+Wi-Fi连接消耗 
    3)通过 adb shell dumpsys battery来获取 
    3、battery-historian(google开源工具) 
    方法二:硬件 
    一般使用万用表或者功耗仪安捷伦进行测试,使用功耗仪测试的时候,需要制作假电池来进行的,有些不能拔插电池的手机还需要焊接才能进行功耗测试

1.5 GPU篇(FPS)

  1. 概念: 
    过度绘制: 界面显示的activity套接了多层而导致 
    帧率:屏幕滑动帧速率 
    帧方差: 屏幕滑动平滑度 
    **FPS:**Frames Per Second 每秒显示的帧数 根据人眼的生理结构,帧率高于24时就被认为是连贯的。对于游戏画面30fps是最低能接受的,60fps逼真感,如果帧率高于屏幕刷新频率就是浪费。要达到30fps,每帧所占用的时间要小于33毫秒

  2. GPU测试中的测试子项: 
    1、界面过度绘制 
    2、屏幕滑动帧速率 
    3、屏幕滑动平滑度

  3. 过度绘制测试:(人工进行测试) 
    打开开发者选项中的显示GPU过度绘制(Debug GPU overdraw) 
    验收的标准: 
    1、不允许出现黑色像素 
    2、不允许存在4x过度绘制 
    3、不允许存在面积超过屏幕1/4区域的3x过度绘制(淡红色区域)

  4. 屏幕滑动帧速率测试: 
    方法一: 
    1.手机端打开开发者选项中的启用跟踪后勾选Graphics和View 
    2.启动SDK工具Systrace,勾选被测应用,点击Systrace,在弹出的对话框中设置持续抓取时间,在trace taps下面勾选gfx及view选项 
    3.手工滑动界面可以通过节拍来进行滑动或者扫动,帧率数据会保存到默认路径下,默认名称为trace.html 
    4.将trace.html文件拷贝到linux系统下通过命令进行转换,生成trace.csv文件 
    grep 'postFramebuffer' trace.html | sed -e 's/.]\W//g' -e 's/:.*$//g' -e 's/.//g' > trace.csv 
    5.用excel打开文件计算得到帧率 
    方法二: 
    硬件的方法,打开高速相机,开启摄像模式,录制手工滑动或者扫动被测应用的视频,再通过人工或者程序数帧的方法对结果进行计算得到帧率

  5. 屏幕滑动平滑度的测试: 
    方法如同帧率测试,唯一的差异就是最后的结果计算公式的差异

  6. 捕获app帧率(android流畅度FPS测试): 
    1、打开手机开发者选项,勾选GPU显示配置文件(系统会记录保留每个界面最后128帧图像绘制的相关时间信息) 
    2、adb shell dumpsys gfxinfo com.xxx.xxx > zinfo.txt 
    3、结果数据分析 
    Profile data in ms部分: 
    Draw: 创建显示列表的时间(DisplayList),所有View对象OnDraw方法占用的时间 
    Process: Android 2D渲染引擎执行显示列表所花的时间,View越多时间越长 
    Execute:将一帧图像交给合成器(compsitor)的时间,较小

  7. 其他工具: 
    GameBench 测试android app的FPS工具 
    Gfxinfo 查看app绘制性能工具

1.6 响应时间篇

  1. 理解: 
    1)从单击事件触发到容器启动NativeAPP消耗的时间(埋点) 
    2)NativeAPP完整启动消耗的时间(可以通过system.log获取) 
    3)Native调用RPC请求方法的延迟时间(埋点) 
    4)RPC请求发出去过程中的具体数据(req_size req_header req_time等,通过埋点获取) 
    5)RPC请求返回的具体数据(res_size res_header res_time等,通过埋点获取) 
    6)本地解析返回数据所消耗的时间(埋点或者TraceView工具可获取) 
    7)界面渲染的时间(可以通过慢速摄像机或者埋点获取)

  2. android app启动时间测试 
    (安卓Activity启动过程性能剖视: http://www.rudy-yuan.net/archives/59/

  3. 应用的启动时间的测试,分为三类: 
    1)首次启动 --应用首次启动所花费的时间 
    2)非首次启动 --应用非首次启动所花费的时间 
    3)应用界面切换--应用界面内切换所花费的时间

  4. 应用启动时间数据获取: 
    1、adb logcat > /address/logcat.txt #所有activity打印的日志 
    find “Displayed” /address/logcat.txt > /newaddress/fl.txt #通过日志过滤关键字Displayed来过滤 
    find “ActivityName” /newaddress/fl.txt > /newaddress/last.txt #通过activity名来过滤获取所测应用 
    通过计算activity最后剩余的时间之和即可 
    2、硬件测试, 使用高速相机或者手机采用录像的方法把应用启动过程给录制下来,然后通过人工数帧或者程序数帧的方式计算启动时间

2 弱网测试

  1. 测试方法: 
    1、使用真实的SIM卡、运营商网络来进行测试(移动无线测试中存在一些特别的BUG必须在特定的真实的运营商网络下才会发现) 
    2、通过代理的方式模拟弱网环境进行测试(charles 硬延迟) 
    3、连接模拟弱网的热点进行测试

  2. 热点模拟方法: 
    1)通过设置iPhone的开发者模式之后共享热点(硬延迟) 
    2)FaceBook开源的ATC(可使用树莓派来搭建ACT环境)

  3. 用户体验需要做的: 
    1)在应用中统一弱网加载的界面样式、动画效果、菊花icon等 
    2)统一网络错误、服务端错误、超时等展现给用户的界面和提示语句 
    3)定义清楚在每个中间过程是的用户交互行为

  4. 转自:https://www.zybuluo.com/defias/note/592309

移动App专项测试的更多相关文章

  1. app专项测试自动化测试方法思路与实现

    秉着个人意愿打算把python+rf接口自动进行彻底结束再做些其它方面的输出~但事与愿违,但领导目前注重先把专项测试方面完成,借此,先暂停python+rf(主要是与Jenkins集成+导入DB+微信 ...

  2. app专项测试

    本节为大家讲述app的专项测试——客户端性能测试.这个我也做了蛮久的了.在这里修改了一下本篇随笔. 首先我们了解一下什么是客户端的性能测试.性能测试相比大家都已经耳熟能详了,这个app的客户端性能测试 ...

  3. APP专项测试使用到的工具

    最近在读<大话APP测试>,我也就是把需要使用的测试点做一个总结,目前是使用的工具进行的整理,后期慢慢把工具使用案例贴出来

  4. Android App专项测试

    https://www.jianshu.com/p/141b84f14505 http://www.cnblogs.com/finer/p/9601140.html 专项 概念 adb命令 App启动 ...

  5. APP专项测试 | 内存及cpu

    命令: adb shell dumpsys meminfo  packagename 关注点: 1.Native/Dalvik 的 Heap 信息 具体在上面的第一行和第二行,它分别给出的是JNI层和 ...

  6. APP专项测试实战1

    首先,如果测试需要用到的话,还是建议一下大家去看下Android-studio的官方文档.文档地址:Documentation  |  Android 开发者  |  Android Develope ...

  7. Android App专项测试(压力测试)

    转载https://blog.csdn.net/qq_29794757/article/details/64160303 转载https://blog.csdn.net/xuejiaodream/ar ...

  8. app专项测试(稳定性测试、安全性测试)

    https://blog.csdn.net/xiaomaoxiao336368/article/details/84887948

  9. APP手工测试01-app专项测试要点-测试、开发环境-敏捷开发

    APP专项测试要点 兼容性测试 安装,卸载,升级 交叉事件 PUSH消息推送测试 性能测试 其他类型 兼容性测试 手机型号 系统版本 安卓 (版本4.4开始兼容) IOS(版本9.x开始兼容) 屏幕尺 ...

随机推荐

  1. Petrozavodsk Winter-2018. Jagiellonian U Contest

    A. XOR 求出所有数的异或和$sum$,将所有数and上$sum$,然后求线性基,则选取$sum$的所有$1$对应的基最优. 时间复杂度$O(n\log x)$. #include<cstd ...

  2. JavaScript(七)

    类型转换 1.直接转换 parseInt() 与 parseFloat() alert('12'+7); //弹出127 alert( parseInt('12') + 7 ); //弹出19 ale ...

  3. 配置ssh框架启动tomcat服务器报异常Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

    在Spring中配置jdbc时,引用的是dbcp.jar包,在db.properties配置文件中,使用了之前的properties配置文件的用户名username(MySql用户名) 然后在启动服务 ...

  4. 问题:CGI返回给前端的汉字数据是乱码(已解决)

    今天,我在写CGI程序,把后台数据返回到前台页面上,出现乱码, 不好看,所以,我在Content-type:application后面加了字符集的设置(字符集和前端一样), fprintf(stdou ...

  5. 螺旋矩阵 java实现(待消化)

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/4 17:13 * @description ...

  6. js 用touch事件实现简单tap

    function _tap(dom,callBack){ var startTime=0; var delayTime=200; var isMove=false; dom.addEventListe ...

  7. STA 463 Simple Linear Regression Report

    STA 463 Simple Linear Regression ReportSpring 2019 The goal of this part of the project is to perfor ...

  8. SM3杂凑算法Python语言实现——第三部分

    SM3杂凑算法实现--第三部分 一.SM3 密码概述        我们首先把需要用到的算法呈现出来,最后我们再考虑如何集合为一个库的方法,这一部分我们就开始编写一个新的算法:国家商用密码标准SM3密 ...

  9. Flask 接入第三方云通讯平台时出现 {‘172001’:’网络错误’}

    错误:{‘172001’:’网络错误’},经过上网查找原因,原来是 Python 升级到 2.7.9 之后引入了一个新特性,当打开一个 https 链接时,会验证一次 SSL 证书.而当目标网站使用的 ...

  10. pc端 页面 显示在手机 一行控制适配问题

    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">