内存测试:

思路

  1. 目前做的是酒店APP,另下载安装几个个第三方酒店的APP以方便对比(相当于可以做竞品测试)
  2. 数据的获取来源是ADB底层命令,而且最好是不需要root权限,因为很多手机root很麻烦或者无法root
  3. 获取数据之后需要存储到excel表单,然后根据数据自动进行绘图形成简单的曲线图用于观察
  4. 记录数据的过程可以用Monkey操作/手工操作,后期也可以考虑加入自动化测试用例进行联动

疑问:

  1. 此APP是需要登录的,MONKEY测试过程中退出账号后无法再进入程序内部,不知道其他公司是如何避免的?
    答:经咨询,目前常用两种做法:1. 让开发将退出按键给屏蔽掉 2.点击登录不检测账号和密码

一、运行Monkey

  1. 将白名单push到手机 ``` adb push E:\\whitelist.txt data/local/tmp/
  2. 运行monkey

adb shell
monkey -pkg  "packageName" -whitelist-file /data/local/tmp/whitelist.txt --throttle 200 -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v  15000  2>/sdcard/error.txt 1>/sdcard/info.txt

二、获取内存

移动端关注的是内存消耗,这个测试节点的设计目标是为了让应用不占用过多的系统资源,且及时释放内存,保障整个系统的稳定性,当然关于内存测试,在这里我们需要引入几个概念,

  • 空闲状态
  • 中等规格
  • 满规格,

空闲状态:指打开应用后,点击home键让应用后台运行,此时应用处于的状态叫做空闲。 中等规格和满规格指的是对应用的操作时间的间隔长短不一,中等规格时间较长,满规格时间较短。

接下来我们说说在内存测试中,存在很多测试子项,如下清单所示

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

说了一些关于内存测试方面的设定,接下来我们聊聊测试方法DIY,现在关于android内存测试的方法基本分为几类,

  1.使用 android 本身提供的 ActivityManager.MemoryInfo() 方法获得(此方法请百度或google)此类第三方工具有如网易的Emmagee、安测试、腾讯的GT等
  2.使用 android 提供的 adb shell dumpsys meminfo |grep packagename
>/address/mem.txt 来获取
  3.使用 android 提供的 procrank

一般地,我们需要测试native heap, dalvik heap,Pss Total 内存(详解看下面的MemoryInfo解析)

这里我们详解一下 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 ,

在开启工具记录 adb shell procrank |grep packagename
>/address/procrank.txt

剩下的就是整理测试数据了

关于内存泄露方面的测试,可以通过几个方面来测试

1.通过monkey压力测试记录内存使用情况,分析数据曲线图及日志情况
2.通过eclipse上的mat+heap来分析存在内存泄露方面的节点


三、数据分析与内存详解

【将收集到的性能数据保存到excel中】

MemoryInfo解析:

Naitve Heap Size: 从mallinfo usmblks获得,代表最大总共分配空间

Native Heap Alloc: 从mallinfo uorblks获得,总共分配空间

Native Heap Free: 从mallinfo fordblks获得,代表总共剩余空间

Native Heap Size 约等于Native Heap Alloc + Native Heap Free

mallinfo是一个C库, mallinfo 函数提供了各种各样的通过C的malloc()函数分配的内存的统计信息。

Dalvik Heap Size:从Runtime totalMemory()获得,Dalvik Heap总共的内存大小

Dalvik Heap Alloc: Runtime totalMemory()-freeMemory() ,Dalvik Heap分配的内存大小。

Dalvik Heap Free:从Runtime freeMemory()获得,Dalvik Heap剩余的内存大小。

Dalvik Heap Size 约等于Dalvik  Heap Alloc + Dalvik  Heap Free

OtherPss, include Cursor,Ashmem, Other Dev, .so mmap, .jar mmap, .apk mmap, .ttf mmap, .dex mmap, Other mmap, Unkown统计信息都可以在process的smap文件看到。

Objects and SQL 信息都是从Android Debug信息中获得。

其他类型               smap 路径名称            描述

Cursor                  /dev/ashmem/Cursor    Cursor消耗的内存(KB)

Ashmem               /dev/ashmem              匿名共享内存用来提供共享内存通过分配一个多个进程

     可以共享的带名称的内存块

Other dev             /dev/                            内部driver占用的在 “Other dev”

.so mmap             .so                               C 库代码占用的内存

.jar mmap            .jar                               Java 文件代码占用的内存

.apk mmap           .apk                               apk代码占用的内存

.ttf mmap              .ttf                               ttf 文件代码占用的内存

.dex mmap             .dex                             Dex 文件代码占用的内存

Other mmap                                              其他文件占用的内存

代码实现实例(抓取内存,python 2.7) :

class MemProfiler(BaseProfiler):
def __init__(self, pid, adb, loghd):
BaseProfiler.__init__(self, adb)
self.appPid = pid
# self.adb = adb
self.loghd = loghd
self.PSSList = []
self.NativeHeapList = []
self.DalvikHeapList = []
self.lastRecord = {}
# 统计总内存,NATIVE内存,DALVIK内存
     self.titile = ["总内存(MB)", "NativeHeap(MB)", "DalvikHeap(MB)"] # self.androidversion = 0 def init(self):
self.androidversion = self.getAndroidVersion() def timeout(self, p):
if p.poll() is None:
self.loghd.info('appmonitor Error: process taking too long to complete--terminating')
p.kill() def getProcessMem(self):
if HEAP_PROFILE == False:
return 0, 0, 0 cmdProcess = self.adb.cmd("shell", "dumpsys", "meminfo", self.appPid)
output = ""
my_timer = Timer(30, self.timeout, [cmdProcess])
try:
my_timer.start()
output = cmdProcess.communicate()[0].decode("utf-8").strip()
except ValueError as err:
self.loghd.info(err.args)
finally:
my_timer.cancel() m = re.search(r'TOTAL\s*(\d+)', output)
native = r'Native Heap\s*(\d+)'
dalvik = r'Dalvik Heap\s*(\d+)'
if int(self.androidversion) < 19:
native = r'Native \s*(\d+)'
dalvik = r'Dalvik \s*(\d+)'
m1 = re.search(native, output)
m2 = re.search(dalvik, output)
PSS = float(m.group(1))
NativeHeap = float(m1.group(1))
DalvikHeap = float(m2.group(1))
return PSS, NativeHeap, DalvikHeap def profile(self):
PSS, NativeHeap, DalvikHeap = self.getProcessMem() self.PSSList.append(round(PSS / 1024, 2))
self.NativeHeapList.append(round(NativeHeap / 1024, 2))
self.DalvikHeapList.append(round(DalvikHeap / 1024, 2)) return round(PSS / 1024, 2), round(NativeHeap / 1024, 2), round(DalvikHeap / 1024, 2)

[腾讯 TMQ][Android 场景化性能测试] UI 流畅度篇

https://testerhome.com/topics/10823

【android 端抓取 cpu,fps,men,wifi/gprs 流量等值】

https://testerhome.com/topics/9513

【两句命令搞定移动端 (iOS 和 Android) 真机并发自动化测试】

github地址:
并发框架
MacacaLibrary

设计思路可以看:
浅谈测试工程化-以并发自动化框架为例

 

Android 性能测试之内存 --- 追加腾讯性能案例,安卓抓取性能扫盲帖的更多相关文章

  1. Android登录client,验证码的获取,网页数据抓取与解析,HttpWatch基本使用

    大家好,我是M1ko.在互联网时代的今天,假设一个App不接入互联网.那么这个App一定不会有长时间的生命周期,因此Android网络编程是每个Android开发人员必备的技能.博主是在校大学生,自学 ...

  2. LoadRuner性能测试之内存分析方法及步骤(Windows)

    1.首先观察Available  Mbytes(可用内存),至少要>=1/2的内存空间 2.然后观察Pages/sec值是不是很大 3.再观察Page  Faules/sec是不是很大,其值表示 ...

  3. Shell脚本 | 性能测试之内存

    性能测试中,内存是一个不可或缺的方面.比如说在跑 Monkey 的过程中,如何准确持续的获取到内存数据就显得尤为重要. 今天分享一个脚本,可以在给定时间内持续监控内存,最后输出成一份 CSV 文件,通 ...

  4. 性能测试之Windows常见性能计数器

    性能计数器(counter)是描述服务器或操作系统性能的一些数据指标.计数器在性能测试中发挥着“监控和分析”的关键作用,尤其是在分析系统的可扩展性.进行性能瓶颈的定位时,对计数器的取值的分析非常关键. ...

  5. Android APP测试的日志文件抓取

         1    log文件分类简介 实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志 状态信息的有: ...

  6. 【android】[转]Android软件测试的日志文件抓取简介

    1    log文件分类简介 实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志 状态信息的有:adb s ...

  7. [原创]使用logcat快速抓取android崩溃日志

    在android APP测试过程中会发生不少的crash,目前抓取日志的主流方法是通过eclipse或者eclipse的ddms组件进行捕抓,这两种方法有个缺点是启动时非常耗时.本文通过adb程序与b ...

  8. 使用新版Android Studio检测内存泄露和性能

    内存泄露,是Android开发者最头疼的事.可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴.  怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的 ...

  9. 浅谈Android应用性能之内存

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...

随机推荐

  1. react-native-vector-icons 图标库使用

    安装链接 yarn add react-native-vector-icons react-native link react-native-vector-icons 在项目工程中打开 .xcodep ...

  2. 机器学习进阶-图像梯度计算-scharr算子与laplacian算子(拉普拉斯) 1.cv2.Scharr(使用scharr算子进行计算) 2.cv2.laplician(使用拉普拉斯算子进行计算)

    1. cv2.Scharr(src,ddepth, dx, dy), 使用Scharr算子进行计算 参数说明:src表示输入的图片,ddepth表示图片的深度,通常使用-1, 这里使用cv2.CV_6 ...

  3. 回溯法 leetcode题解 Combination Sum 递归法

    题目大意:给出一个数组,用这些数组里的元素去凑一个target.元素可以重复取用. 感觉对这种题目还是生疏的.脑子里有想法,但是不知道怎么表达出来. 先记录下自己的递归法.应该还可以用循环实现. 回溯 ...

  4. Cookie安全小结

    Cookie机制:一般来说,同域内浏览器中发出的任何一个请求都会带上Cookie,无论请求什么资源,请求时,Cookie出现在请求头的Cookie字段中.服务端响应头的Set-Cookie字段可以添加 ...

  5. 将文本文件中的\n字符串变成换行符

    1.用notepad打开文件 2.查看换行符,不同操作系统的换行符是不同的. [视图]——[显示符号]——[显示行尾符]. 我的操作系统是windows,所以行尾符是CR LF——对应的正则表达式是\ ...

  6. unity 脚本说明

    MonoBehavour void OnEnable(){ //OnEnable执行在Wake和之前 } void Awake(){ // } void Start(){ } void OnEnabl ...

  7. 从初始化列表和构造函数谈C++的初始化机制

    来源:http://blog.csdn.net/theprinceofelf/article/details/20057359 前段时间被人问及“初始化列表和构造有什么区别?”我竟一时语塞,只好回头 ...

  8. PHP使用redis防止大并发下二次写入(如如何防止重复下订单)

    php调用redis进去读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写. $lock_k ...

  9. 使用xshell xftp连接centos的过程。

    1 配置网络 登录Centtos系统,配置网卡. cd 空格/etc/sysconfig/network-scripts  回车键. ls 查看文件 vi ifcig-eth0  编辑这个文件 修改为 ...

  10. Tomcat运行javaweb项目时出现的一个bug

    Stacktrace:with root cause java.net.ConnectException: Connection refused:........................... ...